blob: b6523692d20fa84a51b731c22be137fd176014be [file] [log] [blame]
Chandan Kumarb7affe42017-06-29 13:57:01 +05301#!/usr/bin/env bash
2
3# Copyright 2017 Red Hat, Inc.
4# All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
18# This script is intended to check the sanity of tempest plugins against
19# tempest master.
20# What it does:
Momoka Toyotafe879ea2017-09-15 10:56:42 +090021# * Retrieve the project lists having tempest plugin if project name is
Chandan Kumarb7affe42017-06-29 13:57:01 +053022# given.
Chandan Kumar97b1ad72017-11-30 18:53:53 +053023# * For each project in a list, it does:
24# * Create virtualenv and install tempest in it
Chandan Kumarb7affe42017-06-29 13:57:01 +053025# * Clone the Project
26# * Install the Project and also installs dependencies from
27# test-requirements.txt.
28# * Create Tempest workspace
29# * List tempest plugins
30# * List tempest plugins tests
Chandan Kumar97b1ad72017-11-30 18:53:53 +053031# * Delete virtualenv and project repo
Chandan Kumarb7affe42017-06-29 13:57:01 +053032#
33# If one of the step fails, The script will exit with failure.
34
35if [ "$1" == "-h" ]; then
36 echo -e "This script performs the sanity of tempest plugins to find
37configuration and dependency issues with the tempest.\n
38Usage: sh ./tools/tempest-plugin-sanity.sh [Run sanity on tempest plugins]"
39 exit 0
40fi
41
42set -ex
43
44# retrieve a list of projects having tempest plugins
45PROJECT_LIST="$(python tools/generate-tempest-plugins-list.py)"
Masayuki Igawa32a4b112019-05-24 17:45:35 +020046
Masayuki Igawaac8ae642019-05-23 11:39:02 +020047BLACKLIST="$(python tools/generate-tempest-plugins-list.py blacklist)"
Chandan Kumarb7affe42017-06-29 13:57:01 +053048
49# Function to clone project using zuul-cloner or from git
50function clone_project() {
51 if [ -e /usr/zuul-env/bin/zuul-cloner ]; then
52 /usr/zuul-env/bin/zuul-cloner --cache-dir /opt/git \
caoyuan349ba752019-04-23 19:40:06 +080053 https://opendev.org \
Masayuki Igawae36fe672019-05-23 13:43:46 +020054 "$1"
Chandan Kumarb7affe42017-06-29 13:57:01 +053055
56 elif [ -e /usr/bin/git ]; then
Masayuki Igawae36fe672019-05-23 13:43:46 +020057 /usr/bin/git clone https://opendev.org/"$1" \
58 "$1"
Chandan Kumarb7affe42017-06-29 13:57:01 +053059
60 fi
61}
62
Chandan Kumar97b1ad72017-11-30 18:53:53 +053063# function to create virtualenv to perform sanity operation
64function prepare_workspace() {
65 SANITY_DIR=$(pwd)
Masayuki Igawa8460cb12019-05-16 12:03:23 +090066 virtualenv -p python3 --clear "$SANITY_DIR"/.venv
Chandan Kumar97b1ad72017-11-30 18:53:53 +053067 export TVENV="$SANITY_DIR/tools/with_venv.sh"
68 cd "$SANITY_DIR"
Chandan Kumarb7affe42017-06-29 13:57:01 +053069
Chandan Kumar97b1ad72017-11-30 18:53:53 +053070 # Install tempest with test dependencies in a venv
71 "$TVENV" pip install -e . -r test-requirements.txt
72}
Chandan Kumarb7affe42017-06-29 13:57:01 +053073
74# Function to install project
75function install_project() {
Masayuki Igawae36fe672019-05-23 13:43:46 +020076 "$TVENV" pip install "$SANITY_DIR"/"$1"
Chandan Kumarb7affe42017-06-29 13:57:01 +053077 # Check for test-requirements.txt file in a project then install it.
Masayuki Igawae36fe672019-05-23 13:43:46 +020078 if [ -e "$SANITY_DIR"/"$1"/test-requirements.txt ]; then
79 "$TVENV" pip install -r "$SANITY_DIR"/"$1"/test-requirements.txt
Chandan Kumarb7affe42017-06-29 13:57:01 +053080 fi
81}
82
83# Function to perform sanity checking on Tempest plugin
84function tempest_sanity() {
Chandan Kumar97b1ad72017-11-30 18:53:53 +053085 "$TVENV" tempest init "$SANITY_DIR"/tempest_sanity && \
86 cd "$SANITY_DIR"/tempest_sanity && \
87 "$TVENV" tempest list-plugins && \
Chandan Kumarb7affe42017-06-29 13:57:01 +053088 "$TVENV" tempest run -l
Chandan Kumar97b1ad72017-11-30 18:53:53 +053089 retval=$?
Chandan Kumarb7affe42017-06-29 13:57:01 +053090 # Delete tempest workspace
Chandan Kumar97b1ad72017-11-30 18:53:53 +053091 # NOTE: Cleaning should be done even if an error occurs.
Chandan Kumarb7affe42017-06-29 13:57:01 +053092 "$TVENV" tempest workspace remove --name tempest_sanity --rmdir
93 cd "$SANITY_DIR"
Chandan Kumar97b1ad72017-11-30 18:53:53 +053094 # Remove the sanity workspace in case of remaining
95 rm -fr "$SANITY_DIR"/tempest_sanity
Chandan Kumarb7affe42017-06-29 13:57:01 +053096 # Remove the project directory after sanity run
Masayuki Igawae36fe672019-05-23 13:43:46 +020097 rm -fr "$SANITY_DIR"/"$1"
Chandan Kumar97b1ad72017-11-30 18:53:53 +053098
99 return $retval
Chandan Kumarb7affe42017-06-29 13:57:01 +0530100}
101
102# Function to run sanity check on each project
103function plugin_sanity_check() {
Chandan Kumar97b1ad72017-11-30 18:53:53 +0530104 prepare_workspace && \
105 clone_project "$1" && \
106 install_project "$1" && \
107 tempest_sanity "$1"
108
109 return $?
Chandan Kumarb7affe42017-06-29 13:57:01 +0530110}
111
112# Log status
113passed_plugin=''
114failed_plugin=''
115# Perform sanity on all tempest plugin projects
116for project in $PROJECT_LIST; do
117 # Remove blacklisted tempest plugins
118 if ! [[ `echo $BLACKLIST | grep -c $project ` -gt 0 ]]; then
119 plugin_sanity_check $project && passed_plugin+=", $project" || \
Chandan Kumar97b1ad72017-11-30 18:53:53 +0530120 failed_plugin+="$project, " > $SANITY_DIR/$project.txt
Chandan Kumarb7affe42017-06-29 13:57:01 +0530121 fi
122done
Chandan Kumarcf576b22017-10-23 17:43:36 +0530123
Masayuki Igawac6b0f142019-05-30 18:38:51 +0900124echo "Passed Plugins: $passed_plugin"
125echo "Failed Plugins: $failed_plugin"
126
Chandan Kumarcf576b22017-10-23 17:43:36 +0530127# Check for failed status
128if [[ -n $failed_plugin ]]; then
129 exit 1
130fi