Setup native grenade Zuul v3 jobs

Setup a native Zuul v3 grenade-base job that defines base folders and
base devstack settings. The grenade play checks out repositories
in two locations, old and new, and sets up devstack config
in old and new as well.

Define a grenade job that sets up devstack services.
This job runs:
- devstack from grenade_from_branch (without tempest)
- grenade from grenade_to_branch
- projects in old from grenade_from_branch
and then tries to run grenade and then tempest.
The configure-grenade-branches role sets the base/target
branch variables (grenade_{from,to}_branch) and must be
updated when cutting a new branch.

Also, define the native versions of the grenade-postgresql
and grenade-multinode jobs, replacing non-native jobs
(like neutron-grenade and neutron-grenade-multinode) when possible.
Even though Python 3 is now the default, define grenade-py3
for compatibility reasons.

Finally, define a basic grenade-forward job which should
be used for forward upgrade testing. Forward testing
requires the user to set the destination branch,
and it is relevant for stable branches only, so disable it
from master.

At least for legacy grenade jobs, Zuul seems to be taking care
of Depends-On on the stable branch.

It is worth noting that tls-proxy is set to False as
it happens with the current legacy jobs. It does not
work by just flipping it to true.

Co-Authored-By: Luigi Toscano <ltoscano@redhat.com>
Depends-On: https://review.opendev.org/637523
Depends-On: https://review.opendev.org/649275
Change-Id: Iefe8d1d7d13bb56cbc9e80fb009d19218f8b1a64
This commit is contained in:
Andrea Frittoli 2019-12-23 16:09:28 +01:00 committed by Luigi Toscano
parent 7116ec3b1a
commit 514ddc8eaa
26 changed files with 681 additions and 240 deletions

View File

@ -1,68 +1,348 @@
- job:
name: grenade-postgresql
parent: legacy-dsvm-base
run: playbooks/legacy/grenade-postgresql/run.yaml
post-run: playbooks/legacy/grenade-postgresql/post.yaml
timeout: 10800
required-projects:
- openstack/grenade
- openstack/devstack-gate
irrelevant-files: &grenade-irrelevant-files
- ^.*\.rst$
- ^doc/.*$
- job:
name: grenade-dsvm-neutron-forward
# Old name: grenade-dsvm-neutron-forward
parent: legacy-dsvm-base
# This is py3 version for ussuri onwards rest all branch needs to be py2
# version which is present in openstack-zuul-jobs.
# We need to take care of this branch variant and python version while
# migrating these jobs to zuulv3.
branches: ^(?!(stable/(ocata|pike|queens|rocky|stein|train))).*$
run: playbooks/legacy/grenade-dsvm-neutron-forward/run.yaml
post-run: playbooks/legacy/grenade-dsvm-neutron-forward/post.yaml
timeout: 10800
required-projects:
- openstack/grenade
- openstack/devstack-gate
- openstack/neutron
- job:
name: grenade-py3
parent: legacy-dsvm-base
run: playbooks/legacy/grenade-py3/run.yaml
post-run: playbooks/legacy/grenade-py3/post.yaml
timeout: 10800
required-projects:
- openstack/grenade
- openstack/devstack-gate
irrelevant-files: *grenade-irrelevant-files
- project:
templates:
- publish-openstack-docs-pti
check:
jobs:
- grenade
- grenade-heat:
voting: false
irrelevant-files: *grenade-irrelevant-files
- grenade-py3
- neutron-grenade-multinode:
irrelevant-files: *grenade-irrelevant-files
- grenade-multinode
- ironic-grenade-dsvm:
voting: false
irrelevant-files: *grenade-irrelevant-files
irrelevant-files: &legacy-irrelevant-files
- ^.*\.rst$
- ^doc/.*$
gate:
jobs:
- grenade-py3
- neutron-grenade-multinode:
irrelevant-files: *grenade-irrelevant-files
- grenade
- grenade-multinode
experimental:
jobs:
- grenade-postgresql
- grenade-dsvm-neutron-forward:
irrelevant-files: *grenade-irrelevant-files
- trove-grenade:
irrelevant-files: *grenade-irrelevant-files
irrelevant-files: *legacy-irrelevant-files
- job:
name: grenade-base
parent: multinode
abstract: true
description: |
Base grenade job
This is the base grenade job for both single and multi node grenade
tests. It does not define any service to be used, so that this can
be used to build an upgrade test with a minimal number of services.
required-projects:
- opendev.org/openstack/devstack
- opendev.org/openstack/requirements
- opendev.org/openstack/tempest
roles:
- zuul: opendev.org/openstack/openstack-zuul-jobs
- zuul: opendev.org/openstack/devstack
- zuul: opendev.org/openstack/tempest
vars:
devstack_bases:
shared: /opt/stack
old: /opt/stack/old
new: /opt/stack/new
logs_old: /opt/stack/logs/old
logs_new: /opt/stack/logs/new
grenade_devstack_localrc: &grenade_base_devstack_localrc
old:
DEST: "{{ devstack_bases.old }}"
LOGFILE: "{{ devstack_bases.old }}/logs/devstacklog.txt"
new:
DEST: "{{ devstack_bases.new }}"
LOGFILE: "{{ devstack_bases.new }}/logs/devstacklog.txt"
shared:
USE_PYTHON3: true
# Common settings for OpenStack CI
DATABASE_PASSWORD: secretdatabase
# FIXME: temporarily define MYSQL_PASSWORD too,
# because some code in devstack and in grenade
# still requires it to be defined.
MYSQL_PASSWORD: secretdatabase
RABBIT_PASSWORD: secretrabbit
ADMIN_PASSWORD: secretadmin
SERVICE_PASSWORD: secretservice
NETWORK_GATEWAY: 10.1.0.1
FIXED_RANGE: 10.1.0.0/20
IPV4_ADDRS_SAFE_TO_USE: 10.1.0.0/20
FLOATING_RANGE: 172.24.5.0/24
PUBLIC_NETWORK_GATEWAY: 172.24.5.1
FIXED_NETWORK_SIZE: 4096
LOG_COLOR: false
VERBOSE: true
VERBOSE_NO_TIMESTAMP: true
NOVNC_FROM_PACKAGE: true
ERROR_ON_CLONE: true
# Gate jobs can't deal with nested virt. Disable it.
LIBVIRT_TYPE: qemu
grenade_localrc:
SAVE_DIR: "{{ devstack_bases.shared }}/save"
# from tempest playbooks
devstack_local_conf:
test-config:
$TEMPEST_CONFIG:
compute:
min_compute_nodes: "{{ groups['compute'] | default(['controller']) | length }}"
test_results_stage_name: test_results
zuul_copy_output:
'{{ devstack_bases.logs_old }}': logs
'{{ devstack_bases.logs_new }}': logs
'{{ grenade_save_dir }}': logs
'{{ grenade_log_dir }}/grenade.sh.log': logs
'{{ grenade_log_dir }}/grenade.sh.log.summary': logs
'{{ grenade_conf_dir }}/grenade_localrc': logs_txt
'{{ grenade_conf_dir }}/grenade_pluginrc': logs_txt
'{{ stage_dir }}/{{ test_results_stage_name }}.subunit': logs
'{{ stage_dir }}/{{ test_results_stage_name }}.html': logs
'{{ stage_dir }}/stackviz': logs
'{{ stage_dir }}/apache': logs
'{{ stage_dir }}/apache_config': logs
'{{ stage_dir }}/etc': logs
'/var/log/rabbitmq': logs
'/var/log/postgresql': logs
'/var/log/mysql': logs
'/var/log/libvirt': logs
'/etc/sudoers': logs
'/etc/sudoers.d': logs
'{{ stage_dir }}/iptables.txt': logs
'{{ stage_dir }}/df.txt': logs
'{{ stage_dir }}/pip2-freeze.txt': logs
'{{ stage_dir }}/pip3-freeze.txt': logs
'{{ stage_dir }}/dpkg-l.txt': logs
'{{ stage_dir }}/rpm-qa.txt': logs
'{{ stage_dir }}/core': logs
'{{ stage_dir }}/listen53.txt': logs
'{{ stage_dir }}/deprecations.log': logs
'/var/log/ceph': logs
'/var/log/openvswitch': logs
'/var/log/glusterfs': logs
'/etc/glusterfs/glusterd.vol': logs
'/etc/resolv.conf': logs
'/var/log/unbound.log': logs
extensions_to_txt:
auto: True
conf: True
log: True
localrc: True
stackenv: True
summary: True
group-vars:
subnode:
grenade_devstack_localrc:
<<: *grenade_base_devstack_localrc
pre-run: playbooks/pre.yaml
run: playbooks/grenade.yaml
post-run: playbooks/post.yaml
irrelevant-files: &grenade-irrelevant-files
# Documentation related
- ^.*\.rst$
- ^api-ref/.*$
- ^doc/.*$
- ^releasenotes/.*$
# Translations
- ^.*/locale/.*po$
- job:
name: grenade
parent: grenade-base
description: |
Default grenade job
Usually grenade jobs should inherit from this job.
nodeset: openstack-single-node-bionic
required-projects:
# NOTE(andreaf) The devstack and grenade roles take care of setting up
# repos on the right branch for this job.
- opendev.org/openstack/cinder
- opendev.org/openstack/glance
- opendev.org/openstack/keystone
- opendev.org/openstack/neutron
- opendev.org/openstack/nova
- opendev.org/openstack/placement
- opendev.org/openstack/swift
timeout: 10800
vars:
grenade_devstack_localrc:
shared:
# Common OpenStack services settings
SWIFT_REPLICAS: 1
SWIFT_START_ALL_SERVICES: false
SWIFT_HASH: 1234123412341234
CINDER_PERIODIC_INTERVAL: 10
DEBUG_LIBVIRT_COREDUMPS: True
# Multinode specific settings
SERVICE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
HOST_IP: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
PUBLIC_BRIDGE_MTU: "{{ external_bridge_mtu }}"
CELLSV2_SETUP: "singleconductor"
# Node specific settings
DATABASE_TYPE: mysql
devstack_local_conf:
post-config:
$NEUTRON_CONF:
DEFAULT:
global_physnet_mtu: "{{ external_bridge_mtu }}"
grenade_localrc:
# enable the execution of the base smoke tests by default
BASE_RUN_SMOKE: True
devstack_services:
# Core services enabled for this branch.
# This list replaces the test-matrix.
# Shared services
dstat: true
etcd3: true
mysql: true
peakmem_tracker: true
rabbit: true
# TODO: tls-proxy is not tested by legacy jobs;
# enable this after testing.
tls-proxy: false
# Keystone services
key: true
# Glance services
g-api: true
g-reg: true
# Nova services
n-api: true
n-api-meta: true
n-cauth: true
n-cond: true
n-cpu: true
n-novnc: true
n-obj: true
n-sch: true
placement-api: true
# Neutron services
# We need to keep using the neutron-legacy based services for
# now until all issues with the new lib/neutron code are solved
q-agt: true
q-dhcp: true
q-l3: true
q-meta: true
q-metering: true
q-svc: true
# neutron-api: true
# neutron-agent: true
# neutron-dhcp: true
# neutron-l3: true
# neutron-metadata-agent: true
# neutron-metering: true
# Swift services
s-account: true
s-container: true
s-object: true
s-proxy: true
# Cinder services
c-api: true
c-bak: true
c-sch: true
c-vol: true
cinder: true
# Tempest was enabled by default even before the native Zuul v3 job
tempest: true
# Services we don't need.
# This section is not really needed, it's for readability.
horizon: false
# Test matrix emits ceilometer but ceilometer is not installed in the
# integrated gate, so specifying the services has not effect.
# ceilometer-*: false
group-vars:
subnode:
devstack_services:
# Core services enabled for this branch.
# This list replaces the test-matrix.
# Shared services
dstat: true
peakmem_tracker: true
# TODO: tls-proxy is not tested by legacy jobs;
# enable this after testing.
tls-proxy: false
# Nova services
n-cpu: true
placement-client: true
# Neutron services
neutron-agent: true
# Cinder services
c-bak: true
c-vol: true
# Services we don't run at all on subnode.
# This section is not really needed, it's for readability.
# keystone: false
# s-*: false
horizon: false
tempest: false
# Test matrix emits ceilometer but ceilomenter is not installed in the
# integrated gate, so specifying the services has not effect.
# ceilometer-*: false
grenade_devstack_localrc:
shared:
# Multinode specific settings
HOST_IP: "{{ hostvars[inventory_hostname]['nodepool']['private_ipv4'] }}"
SERVICE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
PUBLIC_BRIDGE_MTU: "{{ external_bridge_mtu }}"
CELLSV2_SETUP: "singleconductor"
# Subnode specific settings
DATABASE_TYPE: mysql
GLANCE_HOSTPORT: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}:9292"
Q_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
RABBIT_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
DATABASE_HOST: "{{ hostvars['controller']['nodepool']['private_ipv4'] }}"
- job:
name: grenade-py3
parent: grenade
description: |
Grenade job based on Python 3
vars:
grenade_devstack_localrc:
shared:
USE_PYTHON3: true
- job:
name: grenade-forward
parent: grenade
description: |
Forward test. This is mostly relevant for stable branches,
because running it in master will execute an upgrade
to the same commit.
Former names for this job were:
* grenade-dsvm-neutron-forward
* legacy-grenade-dsvm-neutron-forward
vars:
# When a stable branch stable/X is created from master,
# this value should be updated to stable/X.
grenade_from_branch: master
- job:
name: grenade-dsvm-neutron-forward
branches: ^(?!(stable/(ocata|pike|queens|rocky|stein|train))).*$
parent: grenade-forward
- job:
name: grenade-postgresql
description: |
Default grenade job which uses PostgreSQL
parent: grenade
vars:
grenade_devstack_localrc:
shared:
DATABASE_TYPE: postgresql
devstack_services:
mysql: false
postgresql: true
group-vars:
subnode:
devstack_services:
grenade_devstack_localrc:
shared:
DATABASE_TYPE: postgresql
- job:
name: grenade-multinode
description: |
Basic multinode grenade job
parent: grenade
nodeset: openstack-two-node-bionic

View File

@ -222,11 +222,9 @@ The plugin is enabled by adding::
To ``pluginrc`` in the ``GRENADE_DIR``. An additional rc file was
required due to sequencing of when plugin functions become available.
Note: For using this with ``openstack-infra/devstack-gate`` you would set this
by setting the GRENADE_PLUGINRC environment variable. For example to set it for
Ironic::
export GRENADE_PLUGINRC="enable_grenade_plugin ironic https://opendev.org/openstack/ironic"
Note: when running a job based on the ``grenade-base`` job,
for each devstack plugin defined using the ``devstack_plugins``,
the corresponding grenade plugin is enabled automatically.
Changing Devstack Localrc

View File

@ -290,13 +290,15 @@ if [[ "$RUN_BASE" == "True" ]]; then
echo_summary "Running base smoke test"
cd $BASE_RELEASE_DIR/tempest
tox -esmoke -- --concurrency=$TEMPEST_CONCURRENCY
# once we are done, copy our created artifacts to the target
if [[ -e $TARGET_RELEASE_DIR/tempest ]]; then
rsync -a $BASE_RELEASE_DIR/tempest/.tox/ $TARGET_RELEASE_DIR/tempest/.tox/
if [[ -d $BASE_RELEASE_DIR/tempest/.testrepository ]]; then
rsync -a $BASE_RELEASE_DIR/tempest/.testrepository/ $TARGET_RELEASE_DIR/tempest/.testrepository/
elif [[ -d $BASE_RELEASE_DIR/tempest/.stestr ]]; then
rsync -a $BASE_RELEASE_DIR/tempest/.stestr/ $TARGET_RELEASE_DIR/tempest/.stestr/
if [ "${GRENADE_USE_EXTERNAL_DEVSTACK}" != "True" ]; then
# once we are done, copy our created artifacts to the target
if [[ -e $TARGET_RELEASE_DIR/tempest ]]; then
rsync -a $BASE_RELEASE_DIR/tempest/.tox/ $TARGET_RELEASE_DIR/tempest/.tox/
if [[ -d $BASE_RELEASE_DIR/tempest/.testrepository ]]; then
rsync -a $BASE_RELEASE_DIR/tempest/.testrepository/ $TARGET_RELEASE_DIR/tempest/.testrepository/
elif [[ -d $BASE_RELEASE_DIR/tempest/.stestr ]]; then
rsync -a $BASE_RELEASE_DIR/tempest/.stestr/ $TARGET_RELEASE_DIR/tempest/.stestr/
fi
fi
fi
fi

36
playbooks/grenade.yaml Normal file
View File

@ -0,0 +1,36 @@
- hosts: all
strategy: linear
roles:
- role: orchestrate-devstack
devstack_base_dir: "{{ devstack_bases.old }}"
devstack_data_base_dir: "{{ devstack_bases.shared }}"
- hosts: controller
roles:
- configure-grenade-branches
- role: write-grenade-conf
base_dir: "{{ devstack_bases.shared }}"
grenade_base_dir: "{{ devstack_bases.new }}"
grenade_plugins: "{{ devstack_plugins|default({}) }}"
# run-grenade is configured to run also tempest smoke tests
# on the old node by default.
- role: run-grenade
base_dir: "{{ devstack_bases.shared }}"
grenade_base_dir: "{{ devstack_bases.new }}"
# Copied (with minimal changes) from tempest.git:playbooks/devstack-tempest.yaml
# We run tests only on one node, regardless how many nodes are in the system,
# after grenade completes.
- hosts: tempest
environment:
# This enviroment variable is used by the optional tempest-gabbi
# job provided by the gabbi-tempest plugin. It can be safely ignored
# if that plugin is not being used.
GABBI_TEMPEST_PATH: "{{ gabbi_tempest_path | default('') }}"
vars:
devstack_base_dir: "{{ devstack_bases.new }}"
roles:
- setup-tempest-run-dir
- setup-tempest-data-dir
- acl-devstack-files
- run-tempest

View File

@ -1,15 +0,0 @@
- 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

@ -1,43 +0,0 @@
- hosts: all
name: Autoconverted job legacy-grenade-dsvm-neutron-forward from old job gate-grenade-dsvm-neutron-forward-ubuntu-xenial
tasks:
- name: Ensure legacy workspace directory
file:
path: '{{ ansible_user_dir }}/workspace'
state: directory
- shell:
cmd: |
set -e
set -x
cat > clonemap.yaml << EOF
clonemap:
- 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'
environment: '{{ zuul | zuul_legacy_vars }}'
- shell:
cmd: |
set -e
set -x
export PROJECTS="openstack/grenade $PROJECTS"
export PYTHONUNBUFFERED=true
export DEVSTACK_GATE_TEMPEST=1
export DEVSTACK_GATE_GRENADE=forward
export DEVSTACK_GATE_NEUTRON=1
export BRANCH_OVERRIDE=default
if [ "$BRANCH_OVERRIDE" != "default" ] ; then
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
fi
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

@ -1,15 +0,0 @@
- 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

@ -1,44 +0,0 @@
- hosts: all
name: Copy of the neutron-grenade job but with postgresql for the database.
tasks:
- name: Ensure legacy workspace directory
file:
path: '{{ ansible_user_dir }}/workspace'
state: directory
- shell:
cmd: |
set -e
set -x
cat > clonemap.yaml << EOF
clonemap:
- 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'
environment: '{{ zuul | zuul_legacy_vars }}'
- shell:
cmd: |
set -e
set -x
export PROJECTS="openstack/grenade $PROJECTS"
export PYTHONUNBUFFERED=true
export DEVSTACK_GATE_TEMPEST=1
export DEVSTACK_GATE_GRENADE=pullup
export DEVSTACK_GATE_NEUTRON=1
export DEVSTACK_GATE_POSTGRES=1
export BRANCH_OVERRIDE=default
if [ "$BRANCH_OVERRIDE" != "default" ] ; then
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
fi
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

@ -1,15 +0,0 @@
- 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

@ -1,44 +0,0 @@
- hosts: all
name: Copy of the neutron-grenade job using python3.
tasks:
- name: Ensure legacy workspace directory
file:
path: '{{ ansible_user_dir }}/workspace'
state: directory
- shell:
cmd: |
set -e
set -x
cat > clonemap.yaml << EOF
clonemap:
- 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'
environment: '{{ zuul | zuul_legacy_vars }}'
- shell:
cmd: |
set -e
set -x
export PROJECTS="openstack/grenade $PROJECTS"
export PYTHONUNBUFFERED=true
export DEVSTACK_GATE_TEMPEST=1
export DEVSTACK_GATE_GRENADE=pullup
export DEVSTACK_GATE_NEUTRON=1
export DEVSTACK_GATE_USE_PYTHON3=True
export BRANCH_OVERRIDE=default
if [ "$BRANCH_OVERRIDE" != "default" ] ; then
export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE
fi
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 }}'

35
playbooks/post.yaml Normal file
View File

@ -0,0 +1,35 @@
- hosts: all
become: True
vars:
grenade_conf_dir: "{{ devstack_bases.new }}/grenade"
grenade_save_dir: "{{ devstack_bases.shared }}/grenade_save"
grenade_log_dir: "{{ devstack_bases.shared }}/logs"
roles:
- role: prepare-grenade-logs
grenade_config_dir: "{{ grenade_conf_dir }}"
grenade_devstack_shared_dir: "{{ devstack_bases.shared }}"
grenade_devstack_data_log_dirs:
'old': "{{ devstack_bases.logs_old }}"
'new': "{{ devstack_bases.logs_new }}"
grenade_save_data_dir: "{{ grenade_save_dir }}"
- role: export-devstack-journal
devstack_base_dir: "{{ devstack_bases.old }}"
- apache-logs-conf
- devstack-project-conf
# capture-system-logs should be the last role before stage-output
- capture-system-logs
- role: stage-output
# NOTE(andreaf) We need fetch-devstack-log-dir only as long as the base job
# starts pulling logs for us from {{ ansible_user_dir }}/logs.
# Meanwhile we already store things in ansible_user_dir and use
# fetch-devstack-log-dir setting devstack_base_dir
- role: fetch-devstack-log-dir
devstack_base_dir: "{{ ansible_user_dir }}"
# Copied from tempest.git:playbooks/post-tempest.yaml
- hosts: tempest
become: true
roles:
- role: fetch-subunit-output
zuul_work_dir: '{{ devstack_bases.new }}/tempest'
- role: process-stackviz

51
playbooks/pre.yaml Normal file
View File

@ -0,0 +1,51 @@
- hosts: all
pre_tasks:
- name: Gather minimum local MTU
set_fact:
local_mtu: >
{% set mtus = [] -%}
{% for interface in ansible_interfaces -%}
{% set _ = mtus.append(hostvars[inventory_hostname]['ansible_' + interface]['mtu']|int) -%}
{% endfor -%}
{{- mtus|min -}}
- name: Calculate external_bridge_mtu
# 50 bytes is overhead for vxlan (which is greater than GRE
# allowing us to use either overlay option with this MTU.
# TODO(andreaf) This should work, but it may have to be reconcilied with
# the MTU setting used by the multinode setup roles in multinode pre.yaml
set_fact:
external_bridge_mtu: "{{ local_mtu | int - 50 }}"
roles:
- configure-swap
- setup-stack-user
- setup-tempest-user
- configure-grenade-branches
- role: setup-devstack-source-dirs
devstack_base_dir: "{{ devstack_bases.old }}"
devstack_sources_branch: "{{ grenade_from_branch }}"
# NOTE(andreaf) Grenade pullup jobs migrate from a stable branch to
# the current patch(es). Zuul prepares all repos checked out to the right
# refspec to include all the right patches, so we should re-use that,
# and not specify any "devstack_sources_branch", unless a grenade_to_branch
# is set.
- role: setup-devstack-source-dirs
devstack_base_dir: "{{ devstack_bases.new }}"
devstack_sources_branch: "{{ grenade_to_branch | default(omit)}}"
# Create two separate log dirs
- role: setup-devstack-log-dir
devstack_base_dir: "{{ devstack_bases.old }}"
- role: setup-devstack-log-dir
devstack_base_dir: "{{ devstack_bases.new }}"
# Setup the logging (only once, as it does not depend on the branch)
- role: start-fresh-logging
devstack_base_dir: "{{ devstack_bases.old }}"
# Write devstack configuration for old and new (almost the same)
- role: write-devstack-local-conf
devstack_base_dir: "{{ devstack_bases.old }}"
devstack_localrc: "{{ grenade_devstack_localrc.shared|combine(grenade_devstack_localrc.old) }}"
- role: write-devstack-local-conf
devstack_base_dir: "{{ devstack_bases.new }}"
devstack_localrc: "{{ grenade_devstack_localrc.shared|combine(grenade_devstack_localrc.new) }}"
# Setup the cache location (used by the initial installation)
- role: setup-devstack-cache
devstack_base_dir: "{{ devstack_bases.old }}"

View File

@ -0,0 +1,15 @@
Set the value of grenade_from_branch and grenade_to_branch
when not specified by the user.
The default values must be updated when grenade is branched.
**Role Variables**
.. zuul:rolevar:: grenade_from_branch
:default: <previous branch>
The base branch for the upgrade.
.. zuul:rolevar:: grenade_to_branch
:default: <current branch>
The target branch for the upgrade.

View File

@ -0,0 +1,3 @@
---
grenade_from_branch: stable/train
grenade_to_branch: master

View File

@ -0,0 +1,4 @@
- name: Set the grenade start and destination branches
set_fact:
grenade_from_branch: "{{ grenade_from_branch }}"
grenade_to_branch: "{{ grenade_to_branch }}"

View File

@ -0,0 +1,36 @@
Move the logs and other data files which are relevant
for the starting and destination branches, which are
generated by devstack, grenade and tempest.
This role is needed because stage-output does not support
duplicated file names, even if they come from different
directories.
**Role Variables**
.. zuul:rolevar:: grenade_devstack_shared_dir
The grenade base shared directory.
.. zuul:rolevar:: grenade_config_dir
The grenade base directory of the deployment.
.. zuul:rolevar:: grenade_save_data_dir
The final name of the directory which should store
the content of the save/ directory generated by grenade.
.. zuul:rolevar:: grenade_devstack_data_log_dirs
:type: dict
A dictionary with two keys ('old' and 'new'). Each
value contains the directory used to store the configuration
and data files from the corresponding devstack settings.
.. zuul:rolevar:: grenade_devstack_saved_files
:type: list
A list of files (base names only, no directories) to be saved
from the devstack directories.
The list is added to the default set of saved files
(defined as grenade_devstack_saved_files_default).

View File

@ -0,0 +1,13 @@
---
grenade_devstack_saved_files: []
grenade_devstack_saved_files_default:
- devstack/local.conf
- devstack/localrc
- devstack/.localrc.auto
- devstack/.stackenv
- logs/devstacklog.txt
- logs/devstacklog.txt.summary
- logs/dstat-csv.log
- tempest/etc/tempest.conf
- tempest/etc/accounts.yaml
- tempest/tempest.log

View File

@ -0,0 +1,31 @@
- name: Rename the grenade custom config files
copy:
remote_src: yes
src: "{{ grenade_config_dir }}/{{ item }}"
dest: "{{ grenade_config_dir }}/grenade_{{ item }}"
loop:
- localrc
- pluginrc
ignore_errors: True
- name: Create a link with a better name to the grenade save directory
file:
src: "{{ grenade_devstack_shared_dir }}/save"
dest: "{{ grenade_save_data_dir }}"
state: link
ignore_errors: True
- name: Create the save directories
file:
path: "{{ grenade_devstack_data_log_dirs[item] }}"
state: directory
loop: "{{ ['old', 'new'] }}"
- name: Copy the files to the expected save location
copy:
remote_src: yes
src: "{{ grenade_devstack_shared_dir }}/{{ item.0 }}/{{ item.1 }}"
dest: "{{ grenade_devstack_data_log_dirs[item.0] }}/{{ item.1|basename }}"
loop: "{{ ['old', 'new']|product(grenade_devstack_saved_files_default + grenade_devstack_saved_files)|list }}"
ignore_errors: True
no_log: True

View File

@ -0,0 +1,8 @@
Run grenade
**Role Variables**
.. zuul:rolevar:: grenade_base_dir
:default: /opt/stack
The grenade base directory.

View File

@ -0,0 +1 @@
grenade_base_dir: /opt/stack

View File

@ -0,0 +1,19 @@
- name: Run grenade
shell:
cmd: |
./grenade.sh 2>&1
rc=$?
echo "*** FINISHED ***"
exit $rc
environment:
# While originally grenade.sh used to take care of driving
# the entire upgrade progress, including calling stack.sh,
# after the Zuul v3 switch we have a proven method for
# calling DevStack: the roles defined inside its repository.
# Avoid the duplication and let grenade only execute
# the upgrade part.
GRENADE_USE_EXTERNAL_DEVSTACK: True
args:
chdir: "{{grenade_base_dir}}/grenade"
become: true
become_user: stack

View File

@ -0,0 +1,45 @@
Write the configuration files for use by grenade
**Role Variables**
.. zuul:rolevar:: base_dir
:default: /opt/stack
The sources base directory.
.. zuul:rolevar:: grenade_base_dir
:default: /opt/stack
The grenade base directory.
.. zuul:rolevar:: grenade_localrc_path
:default: {{ grenade_base_dir }}/grenade/localrc
The path of the localrc file used by grenade.
.. zuul:rolevar:: grenade_pluginrc_path
:default: {{ grenade_base_dir }}/grenade/pluginrc
The path of the pluginrc file used by grenade.
.. zuul:rolevar:: grenade_localrc
:type: dict
A dictionary of variables that should be written into
the localrc file used by grenade.
.. zuul:rolevar:: grenade_plugins
:type: list
A list of grenade plugins that should be deployed.
.. zuul:rolevar:: grenade_tempest_concurrency
:default: 2
The concurrency level for the tempest tests executed
by grenade.
.. zuul:rolevar:: grenade_test_timeout
:default: 1200
The timeout (in seconds) for each test executed by grenade.

View File

@ -0,0 +1,6 @@
grenade_base_dir: /opt/stack
grenade_localrc_path: "{{ grenade_base_dir }}/grenade/localrc"
grenade_pluginrc_path: "{{ grenade_base_dir }}/grenade/pluginrc"
grenade_plugins: {}
grenade_tempest_concurrency: 2
grenade_test_timeout: 1200

View File

@ -0,0 +1,13 @@
- name: Write the localrc file used by grenade
become: true
become_user: stack
template:
src: localrc.j2
dest: "{{ grenade_localrc_path }}"
- name: Write the pluginrc file used by grenade
become: true
become_user: stack
template:
src: pluginrc.j2
dest: "{{ grenade_pluginrc_path }}"

View File

@ -0,0 +1,18 @@
BASE_RELEASE=old
BASE_RELEASE_DIR={{ base_dir }}/$BASE_RELEASE
BASE_DEVSTACK_DIR=$BASE_RELEASE_DIR/devstack
BASE_DEVSTACK_BRANCH={{ grenade_from_branch }}
TARGET_RELEASE=new
TARGET_RELEASE_DIR={{ base_dir }}/$TARGET_RELEASE
TARGET_DEVSTACK_DIR=$TARGET_RELEASE_DIR/devstack
TARGET_DEVSTACK_BRANCH={{ grenade_to_branch }}
TARGET_RUN_SMOKE=False
SAVE_DIR=$BASE_RELEASE_DIR/save
TEMPEST_CONCURRENCY={{ grenade_tempest_concurrency }}
export OS_TEST_TIMEOUT={{ grenade_test_timeout }}
VERBOSE=False
PLUGIN_DIR=$TARGET_RELEASE_DIR
# Additional variables
{% for key, value in grenade_localrc.items() %}
{{ key }}={{ value }}
{% endfor %}

View File

@ -0,0 +1,3 @@
{% for key, value in grenade_plugins.items() %}
enable_grenade_plugin {{ key }} {{ value }}
{% endfor %}