Merge "Make changes such that -o nounset runs"
This commit is contained in:
commit
ca5b5485d9
2
clean.sh
2
clean.sh
@ -18,7 +18,7 @@ source $TOP_DIR/functions
|
||||
FILES=$TOP_DIR/files
|
||||
|
||||
# Load local configuration
|
||||
source $TOP_DIR/stackrc
|
||||
source $TOP_DIR/openrc
|
||||
|
||||
# Get the variables that are set in stack.sh
|
||||
if [[ -r $TOP_DIR/.stackenv ]]; then
|
||||
|
@ -65,7 +65,7 @@ TUSKARCLIENT_BRANCH=${TUSKARCLIENT_BRANCH:-master}
|
||||
TUSKAR_DIR=$DEST/tuskar
|
||||
TUSKARCLIENT_DIR=$DEST/python-tuskarclient
|
||||
TUSKAR_AUTH_CACHE_DIR=${TUSKAR_AUTH_CACHE_DIR:-/var/cache/tuskar}
|
||||
TUSKAR_STANDALONE=`trueorfalse False $TUSKAR_STANDALONE`
|
||||
TUSKAR_STANDALONE=$(trueorfalse False TUSKAR_STANDALONE)
|
||||
TUSKAR_CONF_DIR=/etc/tuskar
|
||||
TUSKAR_CONF=$TUSKAR_CONF_DIR/tuskar.conf
|
||||
TUSKAR_API_HOST=${TUSKAR_API_HOST:-$HOST_IP}
|
||||
|
@ -353,7 +353,7 @@ function _ping_check_novanet {
|
||||
local boot_timeout=$3
|
||||
local expected=${4:-"True"}
|
||||
local check_command=""
|
||||
MULTI_HOST=`trueorfalse False $MULTI_HOST`
|
||||
MULTI_HOST=$(trueorfalse False MULTI_HOST)
|
||||
if [[ "$MULTI_HOST" = "True" && "$from_net" = "$PRIVATE_NETWORK_NAME" ]]; then
|
||||
return
|
||||
fi
|
||||
|
@ -21,7 +21,6 @@
|
||||
#
|
||||
# The following variables are assumed to be defined by certain functions:
|
||||
#
|
||||
# - ``GIT_DEPTH``
|
||||
# - ``ENABLED_SERVICES``
|
||||
# - ``ERROR_ON_CLONE``
|
||||
# - ``FILES``
|
||||
@ -43,6 +42,8 @@ declare -A GITREPO
|
||||
declare -A GITBRANCH
|
||||
declare -A GITDIR
|
||||
|
||||
TRACK_DEPENDS=${TRACK_DEPENDS:-False}
|
||||
|
||||
# Config Functions
|
||||
# ================
|
||||
|
||||
@ -243,7 +244,8 @@ function trueorfalse {
|
||||
local xtrace=$(set +o | grep xtrace)
|
||||
set +o xtrace
|
||||
local default=$1
|
||||
local testval=$2
|
||||
local literal=$2
|
||||
local testval=${!literal}
|
||||
|
||||
[[ -z "$testval" ]] && { echo "$default"; return; }
|
||||
[[ "0 no No NO false False FALSE" =~ "$testval" ]] && { echo "False"; return; }
|
||||
@ -252,6 +254,14 @@ function trueorfalse {
|
||||
$xtrace
|
||||
}
|
||||
|
||||
function isset {
|
||||
nounset=$(set +o | grep nounset)
|
||||
set +o nounset
|
||||
[[ -n "${!1+x}" ]]
|
||||
result=$?
|
||||
$nounset
|
||||
return $result
|
||||
}
|
||||
|
||||
# Control Functions
|
||||
# =================
|
||||
@ -381,7 +391,11 @@ function warn {
|
||||
# ``os_UPDATE`` - update: ex. the ``5`` in ``RHEL6.5``
|
||||
# ``os_PACKAGE`` - package type: ``deb`` or ``rpm``
|
||||
# ``os_CODENAME`` - vendor's codename for release: ``snow leopard``, ``trusty``
|
||||
declare os_VENDOR os_RELEASE os_UPDATE os_PACKAGE os_CODENAME
|
||||
os_VENDOR=""
|
||||
os_RELEASE=""
|
||||
os_UPDATE=""
|
||||
os_PACKAGE=""
|
||||
os_CODENAME=""
|
||||
|
||||
# GetOSVersion
|
||||
function GetOSVersion {
|
||||
@ -577,8 +591,7 @@ function get_release_name_from_branch {
|
||||
# Set global ``RECLONE=yes`` to simulate a clone when dest-dir exists
|
||||
# Set global ``ERROR_ON_CLONE=True`` to abort execution with an error if the git repo
|
||||
# does not exist (default is False, meaning the repo will be cloned).
|
||||
# Set global ``GIT_DEPTH=<number>`` to limit the history depth of the git clone
|
||||
# Uses globals ``ERROR_ON_CLONE``, ``OFFLINE``, ``RECLONE``, ``GIT_DEPTH``
|
||||
# Uses globals ``ERROR_ON_CLONE``, ``OFFLINE``, ``RECLONE``
|
||||
# git_clone remote dest-dir branch
|
||||
function git_clone {
|
||||
local git_remote=$1
|
||||
@ -587,8 +600,7 @@ function git_clone {
|
||||
local orig_dir=$(pwd)
|
||||
local git_clone_flags=""
|
||||
|
||||
RECLONE=$(trueorfalse False $RECLONE)
|
||||
|
||||
RECLONE=$(trueorfalse False RECLONE)
|
||||
if [[ -n "${GIT_DEPTH}" ]]; then
|
||||
git_clone_flags="$git_clone_flags --depth $GIT_DEPTH"
|
||||
fi
|
||||
@ -995,9 +1007,10 @@ function apt_get {
|
||||
[[ "$(id -u)" = "0" ]] && sudo="env"
|
||||
|
||||
$xtrace
|
||||
|
||||
$sudo DEBIAN_FRONTEND=noninteractive \
|
||||
http_proxy=$http_proxy https_proxy=$https_proxy \
|
||||
no_proxy=$no_proxy \
|
||||
http_proxy=${http_proxy:-} https_proxy=${https_proxy:-} \
|
||||
no_proxy=${no_proxy:-} \
|
||||
apt-get --option "Dpkg::Options::=--force-confold" --assume-yes "$@"
|
||||
}
|
||||
|
||||
@ -1016,10 +1029,10 @@ function get_packages {
|
||||
set +o xtrace
|
||||
local services=$@
|
||||
local package_dir=$(_get_package_dir)
|
||||
local file_to_parse
|
||||
local service
|
||||
local file_to_parse=""
|
||||
local service=""
|
||||
|
||||
INSTALL_TESTONLY_PACKAGES=$(trueorfalse False $INSTALL_TESTONLY_PACKAGES)
|
||||
INSTALL_TESTONLY_PACKAGES=$(trueorfalse False INSTALL_TESTONLY_PACKAGES)
|
||||
|
||||
if [[ -z "$package_dir" ]]; then
|
||||
echo "No package directory supplied"
|
||||
@ -1129,6 +1142,10 @@ function get_packages {
|
||||
# Uses globals ``NO_UPDATE_REPOS``, ``REPOS_UPDATED``, ``RETRY_UPDATE``
|
||||
# install_package package [package ...]
|
||||
function update_package_repo {
|
||||
NO_UPDATE_REPOS=${NO_UPDATE_REPOS:-False}
|
||||
REPOS_UPDATED=${REPOS_UPDATED:-False}
|
||||
RETRY_UPDATE=${RETRY_UPDATE:-False}
|
||||
|
||||
if [[ "$NO_UPDATE_REPOS" = "True" ]]; then
|
||||
return 0
|
||||
fi
|
||||
@ -1338,7 +1355,7 @@ function screen_process {
|
||||
|
||||
SCREEN_NAME=${SCREEN_NAME:-stack}
|
||||
SERVICE_DIR=${SERVICE_DIR:-${DEST}/status}
|
||||
USE_SCREEN=$(trueorfalse True $USE_SCREEN)
|
||||
USE_SCREEN=$(trueorfalse True USE_SCREEN)
|
||||
|
||||
# Append the process to the screen rc file
|
||||
screen_rc "$name" "$command"
|
||||
@ -1411,7 +1428,7 @@ function screen_stop_service {
|
||||
|
||||
SCREEN_NAME=${SCREEN_NAME:-stack}
|
||||
SERVICE_DIR=${SERVICE_DIR:-${DEST}/status}
|
||||
USE_SCREEN=$(trueorfalse True $USE_SCREEN)
|
||||
USE_SCREEN=$(trueorfalse True USE_SCREEN)
|
||||
|
||||
if is_service_enabled $service; then
|
||||
# Clean up the screen window
|
||||
@ -1429,7 +1446,7 @@ function stop_process {
|
||||
local service=$1
|
||||
|
||||
SERVICE_DIR=${SERVICE_DIR:-${DEST}/status}
|
||||
USE_SCREEN=$(trueorfalse True $USE_SCREEN)
|
||||
USE_SCREEN=$(trueorfalse True USE_SCREEN)
|
||||
|
||||
if is_service_enabled $service; then
|
||||
# Kill via pid if we have one available
|
||||
@ -1479,7 +1496,7 @@ function tail_log {
|
||||
local name=$1
|
||||
local logfile=$2
|
||||
|
||||
USE_SCREEN=$(trueorfalse True $USE_SCREEN)
|
||||
USE_SCREEN=$(trueorfalse True USE_SCREEN)
|
||||
if [[ "$USE_SCREEN" = "True" ]]; then
|
||||
screen_process "$name" "sudo tail -f $logfile"
|
||||
fi
|
||||
@ -1589,7 +1606,8 @@ function get_python_exec_prefix {
|
||||
function pip_install {
|
||||
local xtrace=$(set +o | grep xtrace)
|
||||
set +o xtrace
|
||||
if [[ "$OFFLINE" = "True" || -z "$@" ]]; then
|
||||
local offline=${OFFLINE:-False}
|
||||
if [[ "$offline" == "True" || -z "$@" ]]; then
|
||||
$xtrace
|
||||
return
|
||||
fi
|
||||
@ -1618,20 +1636,20 @@ function pip_install {
|
||||
|
||||
$xtrace
|
||||
$sudo_pip \
|
||||
http_proxy=$http_proxy \
|
||||
https_proxy=$https_proxy \
|
||||
no_proxy=$no_proxy \
|
||||
http_proxy=${http_proxy:-} \
|
||||
https_proxy=${https_proxy:-} \
|
||||
no_proxy=${no_proxy:-} \
|
||||
$cmd_pip install \
|
||||
$@
|
||||
|
||||
INSTALL_TESTONLY_PACKAGES=$(trueorfalse False $INSTALL_TESTONLY_PACKAGES)
|
||||
INSTALL_TESTONLY_PACKAGES=$(trueorfalse False INSTALL_TESTONLY_PACKAGES)
|
||||
if [[ "$INSTALL_TESTONLY_PACKAGES" == "True" ]]; then
|
||||
local test_req="$@/test-requirements.txt"
|
||||
if [[ -e "$test_req" ]]; then
|
||||
$sudo_pip \
|
||||
http_proxy=$http_proxy \
|
||||
https_proxy=$https_proxy \
|
||||
no_proxy=$no_proxy \
|
||||
http_proxy=${http_proxy:-} \
|
||||
https_proxy=${https_proxy:-} \
|
||||
no_proxy=${no_proxy:-} \
|
||||
$cmd_pip install \
|
||||
-r $test_req
|
||||
fi
|
||||
@ -2101,13 +2119,13 @@ function cp_it {
|
||||
# http_proxy=http://proxy.example.com:3128/ no_proxy=repo.example.net ./stack.sh
|
||||
|
||||
function export_proxy_variables {
|
||||
if [[ -n "$http_proxy" ]]; then
|
||||
if isset http_proxy ; then
|
||||
export http_proxy=$http_proxy
|
||||
fi
|
||||
if [[ -n "$https_proxy" ]]; then
|
||||
if isset https_proxy ; then
|
||||
export https_proxy=$https_proxy
|
||||
fi
|
||||
if [[ -n "$no_proxy" ]]; then
|
||||
if isset no_proxy ; then
|
||||
export no_proxy=$no_proxy
|
||||
fi
|
||||
}
|
||||
|
@ -75,11 +75,14 @@ CEILOMETER_BACKEND=${CEILOMETER_BACKEND:-mysql}
|
||||
CEILOMETER_SERVICE_PROTOCOL=http
|
||||
CEILOMETER_SERVICE_HOST=$SERVICE_HOST
|
||||
CEILOMETER_SERVICE_PORT=${CEILOMETER_SERVICE_PORT:-8777}
|
||||
CEILOMETER_USE_MOD_WSGI=$(trueorfalse False $CEILOMETER_USE_MOD_WSGI)
|
||||
CEILOMETER_USE_MOD_WSGI=$(trueorfalse False CEILOMETER_USE_MOD_WSGI)
|
||||
|
||||
# To enable OSprofiler change value of this variable to "notifications,profiler"
|
||||
CEILOMETER_NOTIFICATION_TOPICS=${CEILOMETER_NOTIFICATION_TOPICS:-notifications}
|
||||
|
||||
CEILOMETER_COORDINATION_URL=${CEILOMETER_COORDINATION_URL:-}
|
||||
CEILOMETER_PIPELINE_INTERVAL=${CEILOMETER_PIPELINE_INTERVAL:-}
|
||||
|
||||
# Tell Tempest this project is present
|
||||
TEMPEST_SERVICES+=,ceilometer
|
||||
|
||||
|
@ -68,7 +68,7 @@ fi
|
||||
# Maintain this here for backward-compatibility with the old configuration
|
||||
# DEPRECATED: Use CINDER_ENABLED_BACKENDS instead
|
||||
# Support for multi lvm backend configuration (default is no support)
|
||||
CINDER_MULTI_LVM_BACKEND=$(trueorfalse False $CINDER_MULTI_LVM_BACKEND)
|
||||
CINDER_MULTI_LVM_BACKEND=$(trueorfalse False CINDER_MULTI_LVM_BACKEND)
|
||||
|
||||
# Default backends
|
||||
# The backend format is type:name where type is one of the supported backend
|
||||
@ -85,7 +85,7 @@ fi
|
||||
# Should cinder perform secure deletion of volumes?
|
||||
# Defaults to true, can be set to False to avoid this bug when testing:
|
||||
# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1023755
|
||||
CINDER_SECURE_DELETE=`trueorfalse True $CINDER_SECURE_DELETE`
|
||||
CINDER_SECURE_DELETE=$(trueorfalse True CINDER_SECURE_DELETE)
|
||||
|
||||
# Cinder reports allocations back to the scheduler on periodic intervals
|
||||
# it turns out we can get an "out of space" issue when we run tests too
|
||||
|
@ -33,6 +33,7 @@ set +o xtrace
|
||||
# If ``VOLUME_GROUP`` is set, use it, otherwise we'll build a VG name based
|
||||
# on ``VOLUME_GROUP_NAME`` that includes the backend name
|
||||
# Grenade doesn't use ``VOLUME_GROUP2`` so it is left out
|
||||
VOLUME_GROUP=${VOLUME_GROUP:-}
|
||||
VOLUME_GROUP_NAME=${VOLUME_GROUP:-${VOLUME_GROUP_NAME:-stack-volumes}}
|
||||
|
||||
# TODO: resurrect backing device...need to know how to set values
|
||||
|
@ -23,6 +23,7 @@
|
||||
XTRACE=$(set +o | grep xtrace)
|
||||
set +o xtrace
|
||||
|
||||
DATABASE_BACKENDS=""
|
||||
|
||||
# Register a database backend
|
||||
#
|
||||
@ -30,7 +31,7 @@ set +o xtrace
|
||||
#
|
||||
# This is required to be defined before the specific database scripts are sourced
|
||||
function register_database {
|
||||
[ -z "$DATABASE_BACKENDS" ] && DATABASE_BACKENDS=$1 || DATABASE_BACKENDS+=" $1"
|
||||
DATABASE_BACKENDS+=" $1"
|
||||
}
|
||||
|
||||
# Sourcing the database libs sets DATABASE_BACKENDS with the available list
|
||||
|
@ -14,12 +14,22 @@ set +o xtrace
|
||||
|
||||
register_database mysql
|
||||
|
||||
# Linux distros, thank you for being incredibly consistent
|
||||
MYSQL=mysql
|
||||
if is_fedora; then
|
||||
if [[ $DISTRO =~ (rhel6) ]]; then
|
||||
MYSQL=mysqld
|
||||
else
|
||||
MYSQL=mariadb
|
||||
fi
|
||||
fi
|
||||
|
||||
# Functions
|
||||
# ---------
|
||||
|
||||
# Get rid of everything enough to cleanly change database backends
|
||||
function cleanup_database_mysql {
|
||||
stop_service $MYSQL
|
||||
if is_ubuntu; then
|
||||
# Get ruthless with mysql
|
||||
stop_service $MYSQL
|
||||
|
2
lib/dib
2
lib/dib
@ -26,7 +26,7 @@ TIE_DIR=$DEST/tripleo-image-elements
|
||||
# NOTE: Setting DIB_APT_SOURCES assumes you will be building
|
||||
# Debian/Ubuntu based images. Leave unset for other flavors.
|
||||
DIB_APT_SOURCES=${DIB_APT_SOURCES:-""}
|
||||
DIB_BUILD_OFFLINE=$(trueorfalse False $DIB_BUILD_OFFLINE)
|
||||
DIB_BUILD_OFFLINE=$(trueorfalse False DIB_BUILD_OFFLINE)
|
||||
DIB_IMAGE_CACHE=$DATA_DIR/diskimage-builder/image-create
|
||||
DIB_PIP_REPO=$DATA_DIR/diskimage-builder/pip-repo
|
||||
DIB_PIP_REPO_PORT=${DIB_PIP_REPO_PORT:-8899}
|
||||
|
6
lib/heat
6
lib/heat
@ -37,13 +37,13 @@ HEAT_DIR=$DEST/heat
|
||||
HEAT_CFNTOOLS_DIR=$DEST/heat-cfntools
|
||||
HEAT_TEMPLATES_REPO_DIR=$DEST/heat-templates
|
||||
HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat}
|
||||
HEAT_STANDALONE=`trueorfalse False $HEAT_STANDALONE`
|
||||
HEAT_ENABLE_ADOPT_ABANDON=`trueorfalse False $HEAT_ENABLE_ADOPT_ABANDON`
|
||||
HEAT_STANDALONE=$(trueorfalse False HEAT_STANDALONE)
|
||||
HEAT_ENABLE_ADOPT_ABANDON=$(trueorfalse False HEAT_ENABLE_ADOPT_ABANDON)
|
||||
HEAT_CONF_DIR=/etc/heat
|
||||
HEAT_CONF=$HEAT_CONF_DIR/heat.conf
|
||||
HEAT_ENV_DIR=$HEAT_CONF_DIR/environment.d
|
||||
HEAT_TEMPLATES_DIR=$HEAT_CONF_DIR/templates
|
||||
HEAT_STACK_DOMAIN=`trueorfalse True $HEAT_STACK_DOMAIN`
|
||||
HEAT_STACK_DOMAIN=$(trueorfalse True HEAT_STACK_DOMAIN)
|
||||
HEAT_API_HOST=${HEAT_API_HOST:-$HOST_IP}
|
||||
HEAT_API_PORT=${HEAT_API_PORT:-8004}
|
||||
|
||||
|
@ -173,7 +173,7 @@ function install_horizon {
|
||||
# Apache installation, because we mark it NOPRIME
|
||||
install_apache_wsgi
|
||||
|
||||
git_clone $HORIZON_REPO $HORIZON_DIR $HORIZON_BRANCH $HORIZON_TAG
|
||||
git_clone $HORIZON_REPO $HORIZON_DIR $HORIZON_BRANCH
|
||||
}
|
||||
|
||||
# start_horizon() - Start running processes, including screen
|
||||
|
@ -60,7 +60,7 @@ IRONIC_IPMIINFO_FILE=${IRONIC_IPMIINFO_FILE:-$IRONIC_DATA_DIR/hardware_info}
|
||||
# Set up defaults for functional / integration testing
|
||||
IRONIC_SCRIPTS_DIR=${IRONIC_SCRIPTS_DIR:-$TOP_DIR/tools/ironic/scripts}
|
||||
IRONIC_TEMPLATES_DIR=${IRONIC_TEMPLATES_DIR:-$TOP_DIR/tools/ironic/templates}
|
||||
IRONIC_BAREMETAL_BASIC_OPS=$(trueorfalse False $IRONIC_BAREMETAL_BASIC_OPS)
|
||||
IRONIC_BAREMETAL_BASIC_OPS=$(trueorfalse False IRONIC_BAREMETAL_BASIC_OPS)
|
||||
IRONIC_ENABLED_DRIVERS=${IRONIC_ENABLED_DRIVERS:-fake,pxe_ssh,pxe_ipmitool}
|
||||
IRONIC_SSH_USERNAME=${IRONIC_SSH_USERNAME:-`whoami`}
|
||||
IRONIC_SSH_KEY_DIR=${IRONIC_SSH_KEY_DIR:-$IRONIC_DATA_DIR/ssh_keys}
|
||||
@ -87,7 +87,7 @@ IRONIC_VM_LOG_CONSOLE=${IRONIC_VM_LOG_CONSOLE:-True}
|
||||
IRONIC_VM_LOG_DIR=${IRONIC_VM_LOG_DIR:-$IRONIC_DATA_DIR/logs/}
|
||||
|
||||
# Use DIB to create deploy ramdisk and kernel.
|
||||
IRONIC_BUILD_DEPLOY_RAMDISK=`trueorfalse True $IRONIC_BUILD_DEPLOY_RAMDISK`
|
||||
IRONIC_BUILD_DEPLOY_RAMDISK=$(trueorfalse True IRONIC_BUILD_DEPLOY_RAMDISK)
|
||||
# If not use DIB, these files are used as deploy ramdisk/kernel.
|
||||
# (The value must be a absolute path)
|
||||
IRONIC_DEPLOY_RAMDISK=${IRONIC_DEPLOY_RAMDISK:-}
|
||||
@ -116,7 +116,7 @@ IRONIC_HOSTPORT=${IRONIC_HOSTPORT:-$SERVICE_HOST:$IRONIC_SERVICE_PORT}
|
||||
TEMPEST_SERVICES+=,ironic
|
||||
|
||||
# Enable iPXE
|
||||
IRONIC_IPXE_ENABLED=$(trueorfalse False $IRONIC_IPXE_ENABLED)
|
||||
IRONIC_IPXE_ENABLED=$(trueorfalse False IRONIC_IPXE_ENABLED)
|
||||
IRONIC_HTTP_DIR=${IRONIC_HTTP_DIR:-$IRONIC_DATA_DIR/httpboot}
|
||||
IRONIC_HTTP_SERVER=${IRONIC_HTTP_SERVER:-$HOST_IP}
|
||||
IRONIC_HTTP_PORT=${IRONIC_HTTP_PORT:-8088}
|
||||
|
@ -71,6 +71,7 @@ KEYSTONE_ASSIGNMENT_BACKEND=${KEYSTONE_ASSIGNMENT_BACKEND:-sql}
|
||||
|
||||
# Select Keystone's token format
|
||||
# Choose from 'UUID', 'PKI', or 'PKIZ'
|
||||
KEYSTONE_TOKEN_FORMAT=${KEYSTONE_TOKEN_FORMAT:-}
|
||||
KEYSTONE_TOKEN_FORMAT=$(echo ${KEYSTONE_TOKEN_FORMAT} | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
# Set Keystone interface configuration
|
||||
|
10
lib/nova
10
lib/nova
@ -106,7 +106,7 @@ GUEST_INTERFACE_DEFAULT=$(ip link \
|
||||
|
||||
# $NOVA_VNC_ENABLED can be used to forcibly enable vnc configuration.
|
||||
# In multi-node setups allows compute hosts to not run n-novnc.
|
||||
NOVA_VNC_ENABLED=$(trueorfalse False $NOVA_VNC_ENABLED)
|
||||
NOVA_VNC_ENABLED=$(trueorfalse False NOVA_VNC_ENABLED)
|
||||
|
||||
# Get hypervisor configuration
|
||||
# ----------------------------
|
||||
@ -145,11 +145,11 @@ FLAT_INTERFACE=${FLAT_INTERFACE:-$GUEST_INTERFACE_DEFAULT}
|
||||
# ``MULTI_HOST`` is a mode where each compute node runs its own network node. This
|
||||
# allows network operations and routing for a VM to occur on the server that is
|
||||
# running the VM - removing a SPOF and bandwidth bottleneck.
|
||||
MULTI_HOST=`trueorfalse False $MULTI_HOST`
|
||||
MULTI_HOST=$(trueorfalse False MULTI_HOST)
|
||||
|
||||
# ``NOVA_ALLOW_MOVE_TO_SAME_HOST` can be set to False in multi node devstack,
|
||||
# where there are at least two nova-computes.
|
||||
NOVA_ALLOW_MOVE_TO_SAME_HOST=`trueorfalse True $NOVA_ALLOW_MOVE_TO_SAME_HOST`
|
||||
NOVA_ALLOW_MOVE_TO_SAME_HOST=$(trueorfalse True NOVA_ALLOW_MOVE_TO_SAME_HOST)
|
||||
|
||||
# Test floating pool and range are used for testing. They are defined
|
||||
# here until the admin APIs can replace nova-manage
|
||||
@ -657,7 +657,7 @@ function install_nova {
|
||||
|
||||
if is_service_enabled n-novnc; then
|
||||
# a websockets/html5 or flash powered VNC console for vm instances
|
||||
NOVNC_FROM_PACKAGE=`trueorfalse False $NOVNC_FROM_PACKAGE`
|
||||
NOVNC_FROM_PACKAGE=$(trueorfalse False NOVNC_FROM_PACKAGE)
|
||||
if [ "$NOVNC_FROM_PACKAGE" = "True" ]; then
|
||||
NOVNC_WEB_DIR=/usr/share/novnc
|
||||
install_package novnc
|
||||
@ -669,7 +669,7 @@ function install_nova {
|
||||
|
||||
if is_service_enabled n-spice; then
|
||||
# a websockets/html5 or flash powered SPICE console for vm instances
|
||||
SPICE_FROM_PACKAGE=`trueorfalse True $SPICE_FROM_PACKAGE`
|
||||
SPICE_FROM_PACKAGE=$(trueorfalse True SPICE_FROM_PACKAGE)
|
||||
if [ "$SPICE_FROM_PACKAGE" = "True" ]; then
|
||||
SPICE_WEB_DIR=/usr/share/spice-html5
|
||||
install_package spice-html5
|
||||
|
@ -15,7 +15,7 @@ set +o xtrace
|
||||
# --------
|
||||
|
||||
# if we should turn on massive libvirt debugging
|
||||
DEBUG_LIBVIRT=$(trueorfalse False $DEBUG_LIBVIRT)
|
||||
DEBUG_LIBVIRT=$(trueorfalse False DEBUG_LIBVIRT)
|
||||
|
||||
# Installs required distro-specific libvirt packages.
|
||||
function install_libvirt {
|
||||
|
@ -54,7 +54,7 @@ function configure_nova_hypervisor {
|
||||
iniset $NOVA_CONF DEFAULT vnc_enabled "false"
|
||||
fi
|
||||
|
||||
ENABLE_FILE_INJECTION=$(trueorfalse False $ENABLE_FILE_INJECTION)
|
||||
ENABLE_FILE_INJECTION=$(trueorfalse False ENABLE_FILE_INJECTION)
|
||||
if [[ "$ENABLE_FILE_INJECTION" = "True" ]] ; then
|
||||
# When libguestfs is available for file injection, enable using
|
||||
# libguestfs to inspect the image and figure out the proper
|
||||
|
@ -21,6 +21,11 @@
|
||||
XTRACE=$(set +o | grep xtrace)
|
||||
set +o xtrace
|
||||
|
||||
RPC_MESSAGING_PROTOCOL=${RPC_MESSAGING_PROTOCOL:-0.9}
|
||||
|
||||
# TODO(sdague): RPC backend selection is super wonky because we treat
|
||||
# messaging server as a service, which it really isn't for multi host
|
||||
QPID_HOST=${QPID_HOST:-}
|
||||
|
||||
# Functions
|
||||
# ---------
|
||||
@ -68,9 +73,6 @@ function check_rpc_backend {
|
||||
function cleanup_rpc_backend {
|
||||
if is_service_enabled rabbit; then
|
||||
# Obliterate rabbitmq-server
|
||||
if [ -n "$RABBIT_USERID" ]; then
|
||||
sudo rabbitmqctl delete_user "$RABBIT_USERID"
|
||||
fi
|
||||
uninstall_package rabbitmq-server
|
||||
sudo killall epmd || sudo killall -9 epmd
|
||||
if is_ubuntu; then
|
||||
|
@ -82,7 +82,7 @@ SWIFT_EXTRAS_MIDDLEWARE=${SWIFT_EXTRAS_MIDDLEWARE:-formpost staticweb}
|
||||
|
||||
# Set ``SWIFT_EXTRAS_MIDDLEWARE_LAST`` to extras middlewares that need to be at
|
||||
# the end of the pipeline.
|
||||
SWIFT_EXTRAS_MIDDLEWARE_LAST=${SWIFT_EXTRAS_MIDDLEWARE_LAST}
|
||||
SWIFT_EXTRAS_MIDDLEWARE_LAST=${SWIFT_EXTRAS_MIDDLEWARE_LAST:-}
|
||||
|
||||
# Set ``SWIFT_EXTRAS_MIDDLEWARE_NO_AUTH`` to extras middlewares that need to be at
|
||||
# the beginning of the pipeline, before authentication middlewares.
|
||||
@ -127,7 +127,7 @@ ACCOUNT_PORT_BASE=${ACCOUNT_PORT_BASE:-6012}
|
||||
|
||||
# Enable tempurl feature
|
||||
SWIFT_ENABLE_TEMPURLS=${SWIFT_ENABLE_TEMPURLS:-False}
|
||||
SWIFT_TEMPURL_KEY=${SWIFT_TEMPURL_KEY}
|
||||
SWIFT_TEMPURL_KEY=${SWIFT_TEMPURL_KEY:-}
|
||||
|
||||
# Tell Tempest this project is present
|
||||
TEMPEST_SERVICES+=,swift
|
||||
|
@ -75,8 +75,8 @@ TEMPEST_DEFAULT_STORAGE_PROTOCOL="iSCSI"
|
||||
TEMPEST_STORAGE_PROTOCOL=${TEMPEST_STORAGE_PROTOCOL:-$TEMPEST_DEFAULT_STORAGE_PROTOCOL}
|
||||
|
||||
# Neutron/Network variables
|
||||
IPV6_ENABLED=$(trueorfalse True $IPV6_ENABLED)
|
||||
IPV6_SUBNET_ATTRIBUTES_ENABLED=$(trueorfalse True $IPV6_SUBNET_ATTRIBUTES_ENABLED)
|
||||
IPV6_ENABLED=$(trueorfalse True IPV6_ENABLED)
|
||||
IPV6_SUBNET_ATTRIBUTES_ENABLED=$(trueorfalse True IPV6_SUBNET_ATTRIBUTES_ENABLED)
|
||||
|
||||
# Functions
|
||||
# ---------
|
||||
|
72
stack.sh
72
stack.sh
@ -40,6 +40,12 @@ PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin
|
||||
# Keep track of the devstack directory
|
||||
TOP_DIR=$(cd $(dirname "$0") && pwd)
|
||||
|
||||
# Check for uninitialized variables, a big cause of bugs
|
||||
NOUNSET=${NOUNSET:-}
|
||||
if [[ -n "$NOUNSET" ]]; then
|
||||
set -o nounset
|
||||
fi
|
||||
|
||||
# Sanity Checks
|
||||
# -------------
|
||||
|
||||
@ -79,6 +85,9 @@ fi
|
||||
# Prepare the environment
|
||||
# -----------------------
|
||||
|
||||
# Initialize variables:
|
||||
LAST_SPINNER_PID=""
|
||||
|
||||
# Import common functions
|
||||
source $TOP_DIR/functions
|
||||
|
||||
@ -172,12 +181,12 @@ export_proxy_variables
|
||||
disable_negated_services
|
||||
|
||||
# Look for obsolete stuff
|
||||
if [[ ,${ENABLED_SERVICES}, =~ ,"swift", ]]; then
|
||||
echo "FATAL: 'swift' is not supported as a service name"
|
||||
echo "FATAL: Use the actual swift service names to enable them as required:"
|
||||
echo "FATAL: s-proxy s-object s-container s-account"
|
||||
exit 1
|
||||
fi
|
||||
# if [[ ,${ENABLED_SERVICES}, =~ ,"swift", ]]; then
|
||||
# echo "FATAL: 'swift' is not supported as a service name"
|
||||
# echo "FATAL: Use the actual swift service names to enable them as required:"
|
||||
# echo "FATAL: s-proxy s-object s-container s-account"
|
||||
# exit 1
|
||||
# fi
|
||||
|
||||
# Configure sudo
|
||||
# --------------
|
||||
@ -311,7 +320,7 @@ fi
|
||||
# -----------------
|
||||
|
||||
# Set up logging level
|
||||
VERBOSE=$(trueorfalse True $VERBOSE)
|
||||
VERBOSE=$(trueorfalse True VERBOSE)
|
||||
|
||||
# Draw a spinner so the user knows something is happening
|
||||
function spinner {
|
||||
@ -482,47 +491,6 @@ set -o errexit
|
||||
# an error. It is also useful for following along as the install occurs.
|
||||
set -o xtrace
|
||||
|
||||
|
||||
# Common Configuration
|
||||
# --------------------
|
||||
|
||||
# Set ``OFFLINE`` to ``True`` to configure ``stack.sh`` to run cleanly without
|
||||
# Internet access. ``stack.sh`` must have been previously run with Internet
|
||||
# access to install prerequisites and fetch repositories.
|
||||
OFFLINE=`trueorfalse False $OFFLINE`
|
||||
|
||||
# Set ``ERROR_ON_CLONE`` to ``True`` to configure ``stack.sh`` to exit if
|
||||
# the destination git repository does not exist during the ``git_clone``
|
||||
# operation.
|
||||
ERROR_ON_CLONE=`trueorfalse False $ERROR_ON_CLONE`
|
||||
|
||||
# Whether to enable the debug log level in OpenStack services
|
||||
ENABLE_DEBUG_LOG_LEVEL=`trueorfalse True $ENABLE_DEBUG_LOG_LEVEL`
|
||||
|
||||
# Set fixed and floating range here so we can make sure not to use addresses
|
||||
# from either range when attempting to guess the IP to use for the host.
|
||||
# Note that setting FIXED_RANGE may be necessary when running DevStack
|
||||
# in an OpenStack cloud that uses either of these address ranges internally.
|
||||
FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.0/24}
|
||||
FIXED_RANGE=${FIXED_RANGE:-10.0.0.0/24}
|
||||
FIXED_NETWORK_SIZE=${FIXED_NETWORK_SIZE:-256}
|
||||
|
||||
HOST_IP=$(get_default_host_ip $FIXED_RANGE $FLOATING_RANGE "$HOST_IP_IFACE" "$HOST_IP")
|
||||
if [ "$HOST_IP" == "" ]; then
|
||||
die $LINENO "Could not determine host ip address. See local.conf for suggestions on setting HOST_IP."
|
||||
fi
|
||||
|
||||
# Allow the use of an alternate hostname (such as localhost/127.0.0.1) for service endpoints.
|
||||
SERVICE_HOST=${SERVICE_HOST:-$HOST_IP}
|
||||
|
||||
# Configure services to use syslog instead of writing to individual log files
|
||||
SYSLOG=`trueorfalse False $SYSLOG`
|
||||
SYSLOG_HOST=${SYSLOG_HOST:-$HOST_IP}
|
||||
SYSLOG_PORT=${SYSLOG_PORT:-516}
|
||||
|
||||
# Use color for logging output (only available if syslog is not used)
|
||||
LOG_COLOR=`trueorfalse True $LOG_COLOR`
|
||||
|
||||
# Reset the bundle of CA certificates
|
||||
SSL_BUNDLE_FILE="$DATA_DIR/ca-bundle.pem"
|
||||
rm -f $SSL_BUNDLE_FILE
|
||||
@ -535,9 +503,6 @@ source $TOP_DIR/lib/rpc_backend
|
||||
# and the specified rpc backend is available on your platform.
|
||||
check_rpc_backend
|
||||
|
||||
# Use native SSL for servers in SSL_ENABLED_SERVICES
|
||||
USE_SSL=$(trueorfalse False $USE_SSL)
|
||||
|
||||
# Service to enable with SSL if USE_SSL is True
|
||||
SSL_ENABLED_SERVICES="key,nova,cinder,glance,s-proxy,neutron"
|
||||
|
||||
@ -708,7 +673,7 @@ source $TOP_DIR/tools/install_prereqs.sh
|
||||
|
||||
# Configure an appropriate python environment
|
||||
if [[ "$OFFLINE" != "True" ]]; then
|
||||
PYPI_ALTERNATIVE_URL=$PYPI_ALTERNATIVE_URL $TOP_DIR/tools/install_pip.sh
|
||||
PYPI_ALTERNATIVE_URL=${PYPI_ALTERNATIVE_URL:-""} $TOP_DIR/tools/install_pip.sh
|
||||
fi
|
||||
|
||||
TRACK_DEPENDS=${TRACK_DEPENDS:-False}
|
||||
@ -944,13 +909,14 @@ fi
|
||||
# Configure screen
|
||||
# ----------------
|
||||
|
||||
USE_SCREEN=$(trueorfalse True $USE_SCREEN)
|
||||
USE_SCREEN=$(trueorfalse True USE_SCREEN)
|
||||
if [[ "$USE_SCREEN" == "True" ]]; then
|
||||
# Create a new named screen to run processes in
|
||||
screen -d -m -S $SCREEN_NAME -t shell -s /bin/bash
|
||||
sleep 1
|
||||
|
||||
# Set a reasonable status bar
|
||||
SCREEN_HARDSTATUS=${SCREEN_HARDSTATUS-:}
|
||||
if [ -z "$SCREEN_HARDSTATUS" ]; then
|
||||
SCREEN_HARDSTATUS='%{= .} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
|
||||
fi
|
||||
|
62
stackrc
62
stackrc
@ -43,9 +43,17 @@ REGION_NAME=${REGION_NAME:-RegionOne}
|
||||
# enable_service q-meta
|
||||
# # Optional, to enable tempest configuration as part of devstack
|
||||
# enable_service tempest
|
||||
function isset {
|
||||
local nounset=$(set +o | grep nounset)
|
||||
set +o nounset
|
||||
[[ -n "${!1+x}" ]]
|
||||
result=$?
|
||||
$nounset
|
||||
return $result
|
||||
}
|
||||
|
||||
# this allows us to pass ENABLED_SERVICES
|
||||
if [[ -z "$ENABLED_SERVICES" ]]; then
|
||||
if ! isset ENABLED_SERVICES ; then
|
||||
# core compute (glance / keystone / nova (+ nova-network))
|
||||
ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,n-sch,n-xvnc,n-cauth
|
||||
# cinder
|
||||
@ -106,7 +114,7 @@ fi
|
||||
|
||||
# This can be used to turn database query logging on and off
|
||||
# (currently only implemented for MySQL backend)
|
||||
DATABASE_QUERY_LOGGING=$(trueorfalse True $DATABASE_QUERY_LOGGING)
|
||||
DATABASE_QUERY_LOGGING=$(trueorfalse True DATABASE_QUERY_LOGGING)
|
||||
|
||||
# Set a timeout for git operations. If git is still running when the
|
||||
# timeout expires, the command will be retried up to 3 times. This is
|
||||
@ -593,7 +601,7 @@ fi
|
||||
|
||||
# Staging Area for New Images, have them here for at least 24hrs for nodepool
|
||||
# to cache them otherwise the failure rates in the gate are too high
|
||||
PRECACHE_IMAGES=$(trueorfalse False $PRECACHE_IMAGES)
|
||||
PRECACHE_IMAGES=$(trueorfalse False PRECACHE_IMAGES)
|
||||
if [[ "$PRECACHE_IMAGES" == "True" ]]; then
|
||||
# staging in update for nodepool
|
||||
IMAGE_URL="https://download.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"
|
||||
@ -646,6 +654,54 @@ SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
|
||||
# till we get to the point we need to handle this automatically
|
||||
YUM=${YUM:-yum}
|
||||
|
||||
# Common Configuration
|
||||
# --------------------
|
||||
|
||||
# Set ``OFFLINE`` to ``True`` to configure ``stack.sh`` to run cleanly without
|
||||
# Internet access. ``stack.sh`` must have been previously run with Internet
|
||||
# access to install prerequisites and fetch repositories.
|
||||
OFFLINE=$(trueorfalse False OFFLINE)
|
||||
|
||||
# Set ``ERROR_ON_CLONE`` to ``True`` to configure ``stack.sh`` to exit if
|
||||
# the destination git repository does not exist during the ``git_clone``
|
||||
# operation.
|
||||
ERROR_ON_CLONE=$(trueorfalse False ERROR_ON_CLONE)
|
||||
|
||||
# Whether to enable the debug log level in OpenStack services
|
||||
ENABLE_DEBUG_LOG_LEVEL=$(trueorfalse True ENABLE_DEBUG_LOG_LEVEL)
|
||||
|
||||
# Set fixed and floating range here so we can make sure not to use addresses
|
||||
# from either range when attempting to guess the IP to use for the host.
|
||||
# Note that setting FIXED_RANGE may be necessary when running DevStack
|
||||
# in an OpenStack cloud that uses either of these address ranges internally.
|
||||
FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.0/24}
|
||||
FIXED_RANGE=${FIXED_RANGE:-10.0.0.0/24}
|
||||
FIXED_NETWORK_SIZE=${FIXED_NETWORK_SIZE:-256}
|
||||
HOST_IP_IFACE=${HOST_IP_IFACE:-}
|
||||
HOST_IP=${HOST_IP:-}
|
||||
|
||||
HOST_IP=$(get_default_host_ip $FIXED_RANGE $FLOATING_RANGE "$HOST_IP_IFACE" "$HOST_IP")
|
||||
if [ "$HOST_IP" == "" ]; then
|
||||
die $LINENO "Could not determine host ip address. See local.conf for suggestions on setting HOST_IP."
|
||||
fi
|
||||
|
||||
# Allow the use of an alternate hostname (such as localhost/127.0.0.1) for service endpoints.
|
||||
SERVICE_HOST=${SERVICE_HOST:-$HOST_IP}
|
||||
|
||||
# Configure services to use syslog instead of writing to individual log files
|
||||
SYSLOG=$(trueorfalse False SYSLOG)
|
||||
SYSLOG_HOST=${SYSLOG_HOST:-$HOST_IP}
|
||||
SYSLOG_PORT=${SYSLOG_PORT:-516}
|
||||
|
||||
# Use color for logging output (only available if syslog is not used)
|
||||
LOG_COLOR=$(trueorfalse True LOG_COLOR)
|
||||
|
||||
# Set global ``GIT_DEPTH=<number>`` to limit the history depth of the git clone
|
||||
GIT_DEPTH=${GIT_DEPTH:-1}
|
||||
|
||||
# Use native SSL for servers in SSL_ENABLED_SERVICES
|
||||
USE_SSL=$(trueorfalse False USE_SSL)
|
||||
|
||||
# Following entries need to be last items in file
|
||||
|
||||
# Local variables:
|
||||
|
34
tests/test_functions.sh
Executable file
34
tests/test_functions.sh
Executable file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Tests for DevStack meta-config functions
|
||||
|
||||
TOP=$(cd $(dirname "$0")/.. && pwd)
|
||||
|
||||
# Import common functions
|
||||
source $TOP/functions
|
||||
source $TOP/tests/unittest.sh
|
||||
|
||||
function test_truefalse {
|
||||
local one=1
|
||||
local captrue=True
|
||||
local lowtrue=true
|
||||
local abrevtrue=t
|
||||
local zero=0
|
||||
local capfalse=False
|
||||
local lowfalse=false
|
||||
local abrevfalse=f
|
||||
for against in True False; do
|
||||
for name in one captrue lowtrue abrevtrue; do
|
||||
assert_equal "True" $(trueorfalse $against $name) "\$(trueorfalse $against $name)"
|
||||
done
|
||||
done
|
||||
for against in True False; do
|
||||
for name in zero capfalse lowfalse abrevfalse; do
|
||||
assert_equal "False" $(trueorfalse $against $name) "\$(trueorfalse $against $name)"
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
test_truefalse
|
||||
|
||||
report_results
|
39
tests/unittest.sh
Normal file
39
tests/unittest.sh
Normal file
@ -0,0 +1,39 @@
|
||||
#!/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.
|
||||
|
||||
# we always start with no errors
|
||||
ERROR=0
|
||||
FAILED_FUNCS=""
|
||||
|
||||
function assert_equal {
|
||||
local lineno=`caller 0 | awk '{print $1}'`
|
||||
local function=`caller 0 | awk '{print $2}'`
|
||||
local msg=$3
|
||||
if [[ "$1" != "$2" ]]; then
|
||||
FAILED_FUNCS+="$function:L$lineno\n"
|
||||
echo "ERROR: $1 != $2 in $function:L$lineno!"
|
||||
echo " $msg"
|
||||
ERROR=1
|
||||
else
|
||||
echo "$function:L$lineno - ok"
|
||||
fi
|
||||
}
|
||||
|
||||
function report_results {
|
||||
if [[ $ERROR -eq 1 ]]; then
|
||||
echo "Tests FAILED"
|
||||
echo $FAILED_FUNCS
|
||||
exit 1
|
||||
fi
|
||||
}
|
@ -8,9 +8,15 @@
|
||||
#
|
||||
# -f Force an install run now
|
||||
|
||||
if [[ -n "$1" && "$1" = "-f" ]]; then
|
||||
FORCE_PREREQ=1
|
||||
fi
|
||||
FORCE_PREREQ=0
|
||||
|
||||
while getopts ":f" opt; do
|
||||
case $opt in
|
||||
f)
|
||||
FORCE_PREREQ=1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# If TOP_DIR is set we're being sourced rather than running stand-alone
|
||||
# or in a sub-shell
|
||||
|
19
unstack.sh
19
unstack.sh
@ -6,11 +6,22 @@
|
||||
# mysql and rabbit are left running as OpenStack code refreshes
|
||||
# do not require them to be restarted.
|
||||
#
|
||||
# Stop all processes by setting ``UNSTACK_ALL`` or specifying ``--all``
|
||||
# Stop all processes by setting ``UNSTACK_ALL`` or specifying ``-a``
|
||||
# on the command line
|
||||
|
||||
UNSTACK_ALL=""
|
||||
|
||||
while getopts ":a" opt; do
|
||||
case $opt in
|
||||
a)
|
||||
UNSTACK_ALL=""
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Keep track of the current devstack directory.
|
||||
TOP_DIR=$(cd $(dirname "$0") && pwd)
|
||||
FILES=$TOP_DIR/files
|
||||
|
||||
# Import common functions
|
||||
source $TOP_DIR/functions
|
||||
@ -19,7 +30,7 @@ source $TOP_DIR/functions
|
||||
source $TOP_DIR/lib/database
|
||||
|
||||
# Load local configuration
|
||||
source $TOP_DIR/stackrc
|
||||
source $TOP_DIR/openrc
|
||||
|
||||
# Destination path for service data
|
||||
DATA_DIR=${DATA_DIR:-${DEST}/data}
|
||||
@ -72,10 +83,6 @@ load_plugin_settings
|
||||
# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME``
|
||||
GetOSVersion
|
||||
|
||||
if [[ "$1" == "--all" ]]; then
|
||||
UNSTACK_ALL=${UNSTACK_ALL:-1}
|
||||
fi
|
||||
|
||||
# Run extras
|
||||
# ==========
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user