489bd2a62b
* Test returns and exit codes on most command invocations * Add start and end banners to make output easier to find in long log files * Adds die_if_error(), die_if_not_set() and is_set() to functions * Add some function tests Fixes bug 944593 Change-Id: I55e2962c5fec9aad237b674732b1e922ad37a62e
146 lines
4.2 KiB
Plaintext
146 lines
4.2 KiB
Plaintext
# functions - Common functions used by DevStack components
|
|
|
|
|
|
# apt-get wrapper to set arguments correctly
|
|
# apt_get package [package ...]
|
|
function apt_get() {
|
|
[[ "$OFFLINE" = "True" ]] && return
|
|
local sudo="sudo"
|
|
[[ "$(id -u)" = "0" ]] && sudo="env"
|
|
$sudo DEBIAN_FRONTEND=noninteractive \
|
|
http_proxy=$http_proxy https_proxy=$https_proxy \
|
|
apt-get --option "Dpkg::Options::=--force-confold" --assume-yes "$@"
|
|
}
|
|
|
|
|
|
# Gracefully cp only if source file/dir exists
|
|
# cp_it source destination
|
|
function cp_it {
|
|
if [ -e $1 ] || [ -d $1 ]; then
|
|
cp -pRL $1 $2
|
|
fi
|
|
}
|
|
|
|
|
|
# Checks the exit code of the last command and prints "message"
|
|
# if it is non-zero and exits
|
|
# die_if_error "message"
|
|
function die_if_error() {
|
|
local exitcode=$?
|
|
if [ $exitcode != 0 ]; then
|
|
echo $@
|
|
exit $exitcode
|
|
fi
|
|
}
|
|
|
|
|
|
# Checks an environment variable is not set or has length 0 OR if the
|
|
# exit code is non-zero and prints "message" and exits
|
|
# NOTE: env-var is the variable name without a '$'
|
|
# die_if_not_set env-var "message"
|
|
function die_if_not_set() {
|
|
local exitcode=$?
|
|
local evar=$1; shift
|
|
if ! is_set $evar || [ $exitcode != 0 ]; then
|
|
echo $@
|
|
exit 99
|
|
fi
|
|
}
|
|
|
|
|
|
# Grab a numbered field from python prettytable output
|
|
# Fields are numbered starting with 1
|
|
# Reverse syntax is supported: -1 is the last field, -2 is second to last, etc.
|
|
# get_field field-number
|
|
function get_field() {
|
|
while read data; do
|
|
if [ "$1" -lt 0 ]; then
|
|
field="(\$(NF$1))"
|
|
else
|
|
field="\$$(($1 + 1))"
|
|
fi
|
|
echo "$data" | awk -F'[ \t]*\\|[ \t]*' "{print $field}"
|
|
done
|
|
}
|
|
|
|
|
|
# git clone only if directory doesn't exist already. Since ``DEST`` might not
|
|
# be owned by the installation user, we create the directory and change the
|
|
# ownership to the proper user.
|
|
# Set global RECLONE=yes to simulate a clone when dest-dir exists
|
|
# git_clone remote dest-dir branch
|
|
function git_clone {
|
|
[[ "$OFFLINE" = "True" ]] && return
|
|
|
|
GIT_REMOTE=$1
|
|
GIT_DEST=$2
|
|
GIT_BRANCH=$3
|
|
|
|
if echo $GIT_BRANCH | egrep -q "^refs"; then
|
|
# If our branch name is a gerrit style refs/changes/...
|
|
if [[ ! -d $GIT_DEST ]]; then
|
|
git clone $GIT_REMOTE $GIT_DEST
|
|
fi
|
|
cd $GIT_DEST
|
|
git fetch $GIT_REMOTE $GIT_BRANCH && git checkout FETCH_HEAD
|
|
else
|
|
# do a full clone only if the directory doesn't exist
|
|
if [[ ! -d $GIT_DEST ]]; then
|
|
git clone $GIT_REMOTE $GIT_DEST
|
|
cd $GIT_DEST
|
|
# This checkout syntax works for both branches and tags
|
|
git checkout $GIT_BRANCH
|
|
elif [[ "$RECLONE" == "yes" ]]; then
|
|
# if it does exist then simulate what clone does if asked to RECLONE
|
|
cd $GIT_DEST
|
|
# set the url to pull from and fetch
|
|
git remote set-url origin $GIT_REMOTE
|
|
git fetch origin
|
|
# remove the existing ignored files (like pyc) as they cause breakage
|
|
# (due to the py files having older timestamps than our pyc, so python
|
|
# thinks the pyc files are correct using them)
|
|
find $GIT_DEST -name '*.pyc' -delete
|
|
git checkout -f origin/$GIT_BRANCH
|
|
# a local branch might not exist
|
|
git branch -D $GIT_BRANCH || true
|
|
git checkout -b $GIT_BRANCH
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
# Test if the named environment variable is set and not zero length
|
|
# is_set env-var
|
|
function is_set() {
|
|
local var=\$"$1"
|
|
if eval "[ -z $var ]"; then
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
|
|
# pip install wrapper to set cache and proxy environment variables
|
|
# pip_install package [package ...]
|
|
function pip_install {
|
|
[[ "$OFFLINE" = "True" ]] && return
|
|
sudo PIP_DOWNLOAD_CACHE=/var/cache/pip \
|
|
HTTP_PROXY=$http_proxy \
|
|
HTTPS_PROXY=$https_proxy \
|
|
pip install --use-mirrors $@
|
|
}
|
|
|
|
|
|
# Normalize config values to True or False
|
|
# VAR=`trueorfalse default-value test-value`
|
|
function trueorfalse() {
|
|
local default=$1
|
|
local testval=$2
|
|
|
|
[[ -z "$testval" ]] && { echo "$default"; return; }
|
|
[[ "0 no false False FALSE" =~ "$testval" ]] && { echo "False"; return; }
|
|
[[ "1 yes true True TRUE" =~ "$testval" ]] && { echo "True"; return; }
|
|
echo "$default"
|
|
}
|