Compare commits
73 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6f91538d1d | |||
| de6f9c2c4a | |||
| 001b1cdddc | |||
| 8c26f80481 | |||
| 42854dc87c | |||
| fce1f19ed9 | |||
| 5a78e1d9fa | |||
| 228e96a89f | |||
| 47110b0f35 | |||
| 93a198b931 | |||
| ab0ab55d35 | |||
| de4b188bf4 | |||
| bcbee577dd | |||
| 991c7ea5ce | |||
| 3d76ff6317 | |||
| 287f99ed45 | |||
| 03e20f350e | |||
| 484938d38f | |||
| f610ae9e0e | |||
| 66b1102def | |||
| 3d54dc9969 | |||
| a68d21a058 | |||
| 8c601bcc51 | |||
| ed506406b8 | |||
| 660faaeffb | |||
| 7c42fda76b | |||
| 36558ba381 | |||
| 402cf95028 | |||
| 94c12267f4 | |||
| 9cd50be86c | |||
| 463cb7aa93 | |||
| 6dae13645f | |||
| d6701ae79d | |||
| 57be53b51a | |||
| f40284ce6e | |||
| cb247b60ba | |||
| 3b4cff7c0b | |||
| 04da2a7ee9 | |||
| 5217d9e102 | |||
| bcba698d6c | |||
| 3be5e02cf8 | |||
| ec0a60e6f0 | |||
| 5f26dcb21f | |||
| 752af80e21 | |||
| b9cc446096 | |||
| f001a89f9e | |||
| 2316193495 | |||
| 715a9b866b | |||
| 3071efd1c8 | |||
| 51392964e3 | |||
| 817e9b637a | |||
| 67d547c9bb | |||
| 1bd396036d | |||
| a571e4abe8 | |||
| a6a3142857 | |||
| 3710f94b95 | |||
| 7eac0c927c | |||
| fb2cb1a246 | |||
| ab0a04735f | |||
| d54c2bdf45 | |||
| 6a7185c905 | |||
| 9de37a1125 | |||
| 56deab2a39 | |||
| d6f700db33 | |||
| 137b71174a | |||
| 9bb1a44a88 | |||
| 2d311df771 | |||
| 508b17bc02 | |||
| 4cc31d9571 | |||
| 3b87335fb5 | |||
| 7e2f8a21b9 | |||
| 81c45e921b | |||
| d265cbdc64 |
@@ -2,3 +2,4 @@
|
||||
host=review.openstack.org
|
||||
port=29418
|
||||
project=openstack-dev/devstack.git
|
||||
defaultbranch=stable/juno
|
||||
|
||||
@@ -297,7 +297,7 @@ If tempest has been successfully configured, a basic set of smoke
|
||||
tests can be run as follows:
|
||||
|
||||
$ cd /opt/stack/tempest
|
||||
$ nosetests tempest/scenario/test_network_basic_ops.py
|
||||
$ tox -efull tempest.scenario.test_network_basic_ops
|
||||
|
||||
# DevStack on Xenserver
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ if is_service_enabled trove; then
|
||||
cleanup_trove
|
||||
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
|
||||
echo_summary "Configuring Trove"
|
||||
configure_troveclient
|
||||
configure_trove
|
||||
|
||||
if is_service_enabled key; then
|
||||
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
bridge-utils
|
||||
pylint
|
||||
python-setuptools
|
||||
screen
|
||||
unzip
|
||||
@@ -12,7 +11,6 @@ lsof # useful when debugging
|
||||
openssh-server
|
||||
openssl
|
||||
python-virtualenv
|
||||
python-unittest2
|
||||
iputils-ping
|
||||
wget
|
||||
curl
|
||||
@@ -27,3 +25,4 @@ bc
|
||||
libyaml-dev
|
||||
libffi-dev
|
||||
libssl-dev # for pyOpenSSL
|
||||
gettext # used for compiling message catalogs
|
||||
|
||||
@@ -9,9 +9,7 @@ python-routes
|
||||
python-xattr
|
||||
python-sqlalchemy
|
||||
python-webob
|
||||
pylint
|
||||
python-eventlet
|
||||
python-nose
|
||||
python-sphinx
|
||||
python-mox
|
||||
python-coverage
|
||||
|
||||
@@ -12,6 +12,7 @@ python-libvirt
|
||||
qemu
|
||||
qemu-kvm
|
||||
qemu-utils
|
||||
sgabios
|
||||
syslinux
|
||||
tftpd-hpa
|
||||
xinetd
|
||||
|
||||
@@ -5,7 +5,6 @@ python-coverage
|
||||
python-eventlet
|
||||
python-greenlet
|
||||
python-netifaces
|
||||
python-nose
|
||||
python-pastedeploy
|
||||
python-simplejson
|
||||
python-webob
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
diff -r b2efb7df637b discover.py
|
||||
--- a/discover.py Thu Mar 24 00:31:02 2011 -0400
|
||||
+++ b/discover.py Thu Nov 28 12:02:19 2013 +0000
|
||||
@@ -82,7 +82,11 @@
|
||||
"""
|
||||
testMethodPrefix = 'test'
|
||||
sortTestMethodsUsing = cmp
|
||||
- suiteClass = unittest.TestSuite
|
||||
+ try:
|
||||
+ import unittest2
|
||||
+ suiteClass = unittest2.TestSuite
|
||||
+ except ImportError:
|
||||
+ suiteClass = unittest.TestSuite
|
||||
_top_level_dir = None
|
||||
|
||||
def loadTestsFromTestCase(self, testCaseClass):
|
||||
@@ -14,9 +14,7 @@ openssh
|
||||
openssl
|
||||
psmisc
|
||||
python-cmd2 # dist:opensuse-12.3
|
||||
python-pylint
|
||||
python-setuptools # instead of python-distribute; dist:sle11sp2
|
||||
python-unittest2
|
||||
screen
|
||||
tar
|
||||
tcpdump
|
||||
|
||||
@@ -13,7 +13,5 @@ python-coverage
|
||||
python-dateutil
|
||||
python-eventlet
|
||||
python-mox
|
||||
python-nose
|
||||
python-pylint
|
||||
python-sqlalchemy-migrate
|
||||
python-xattr
|
||||
|
||||
@@ -8,7 +8,6 @@ python-devel
|
||||
python-eventlet
|
||||
python-greenlet
|
||||
python-netifaces
|
||||
python-nose
|
||||
python-simplejson
|
||||
python-xattr
|
||||
sqlite3
|
||||
|
||||
+1
-2
@@ -12,10 +12,8 @@ libffi-devel
|
||||
libxml2-devel
|
||||
libxslt-devel
|
||||
psmisc
|
||||
pylint
|
||||
python-setuptools
|
||||
python-prettytable # dist:rhel6 [1]
|
||||
python-unittest2
|
||||
python-virtualenv
|
||||
python-devel
|
||||
screen
|
||||
@@ -26,6 +24,7 @@ wget
|
||||
which
|
||||
bc
|
||||
libyaml-devel
|
||||
gettext # used for compiling message catalogs
|
||||
|
||||
# [1] : some of installed tools have unversioned dependencies on this,
|
||||
# but others have versioned (<=0.7). So if a later version (0.7.1)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
Django
|
||||
httpd # NOPRIME
|
||||
mod_wsgi # NOPRIME
|
||||
pylint
|
||||
python-anyjson
|
||||
python-BeautifulSoup
|
||||
python-coverage
|
||||
@@ -11,7 +10,6 @@ python-greenlet
|
||||
python-httplib2
|
||||
python-migrate
|
||||
python-mox
|
||||
python-nose
|
||||
python-paste #dist:f19,f20
|
||||
python-paste-deploy #dist:f19,f20
|
||||
python-routes
|
||||
|
||||
@@ -9,6 +9,7 @@ net-tools
|
||||
openssh-clients
|
||||
openvswitch
|
||||
python-libguestfs
|
||||
sgabios
|
||||
syslinux
|
||||
tftp-server
|
||||
xinetd
|
||||
|
||||
@@ -5,7 +5,6 @@ python-coverage
|
||||
python-eventlet
|
||||
python-greenlet
|
||||
python-netifaces
|
||||
python-nose
|
||||
python-paste-deploy # dist:f19,f20,rhel7
|
||||
python-simplejson
|
||||
python-webob
|
||||
|
||||
+42
-3
@@ -1288,8 +1288,13 @@ function screen_service {
|
||||
|
||||
# sleep to allow bash to be ready to be send the command - we are
|
||||
# creating a new window in screen and then sends characters, so if
|
||||
# bash isn't running by the time we send the command, nothing happens
|
||||
sleep 3
|
||||
# bash isn't running by the time we send the command, nothing
|
||||
# happens. This sleep was added originally to handle gate runs
|
||||
# where we needed this to be at least 3 seconds to pass
|
||||
# consistently on slow clouds. Now this is configurable so that we
|
||||
# can determine a reasonable value for the local case which should
|
||||
# be much smaller.
|
||||
sleep ${SCREEN_SLEEP:-3}
|
||||
|
||||
NL=`echo -ne '\015'`
|
||||
# This fun command does the following:
|
||||
@@ -1519,6 +1524,18 @@ function get_python_exec_prefix {
|
||||
fi
|
||||
}
|
||||
|
||||
# Wrapper for ``pip install`` that only installs versions of libraries
|
||||
# from the global-requirements specification.
|
||||
#
|
||||
# Uses globals ``REQUIREMENTS_DIR``
|
||||
#
|
||||
# pip_install_gr packagename
|
||||
function pip_install_gr {
|
||||
local name=$1
|
||||
local clean_name=$(get_from_global_requirements $name)
|
||||
pip_install $clean_name
|
||||
}
|
||||
|
||||
# Wrapper for ``pip install`` to set cache and proxy environment variables
|
||||
# Uses globals ``OFFLINE``, ``PIP_DOWNLOAD_CACHE``, ``PIP_USE_MIRRORS``,
|
||||
# ``TRACK_DEPENDS``, ``*_proxy``
|
||||
@@ -1543,7 +1560,7 @@ function pip_install {
|
||||
local sudo_pip="env"
|
||||
else
|
||||
local cmd_pip=$(get_pip_command)
|
||||
local sudo_pip="sudo"
|
||||
local sudo_pip="sudo -H"
|
||||
fi
|
||||
|
||||
# Mirror option not needed anymore because pypi has CDN available,
|
||||
@@ -1575,6 +1592,17 @@ function pip_install {
|
||||
fi
|
||||
}
|
||||
|
||||
# get version of a package from global requirements file
|
||||
# get_from_global_requirements <package>
|
||||
function get_from_global_requirements {
|
||||
local package=$1
|
||||
local required_pkg=$(grep -h ^${package} $REQUIREMENTS_DIR/global-requirements.txt | cut -d\# -f1)
|
||||
if [[ $required_pkg == "" ]]; then
|
||||
die $LINENO "Can't find package $package in requirements"
|
||||
fi
|
||||
echo $required_pkg
|
||||
}
|
||||
|
||||
# should we use this library from their git repo, or should we let it
|
||||
# get pulled in via pip dependencies.
|
||||
function use_library_from_git {
|
||||
@@ -1594,6 +1622,17 @@ function setup_lib {
|
||||
setup_install $dir
|
||||
}
|
||||
|
||||
# setup a library by name in editiable mode. If we are trying to use
|
||||
# the library from git, we'll do a git based install, otherwise we'll
|
||||
# punt and the library should be installed by a requirements pull from
|
||||
# another project.
|
||||
#
|
||||
# use this for non namespaced libraries
|
||||
function setup_dev_lib {
|
||||
local name=$1
|
||||
local dir=${GITDIR[$name]}
|
||||
setup_develop $dir
|
||||
}
|
||||
|
||||
# this should be used if you want to install globally, all libraries should
|
||||
# use this, especially *oslo* ones
|
||||
|
||||
+1
-1
@@ -162,7 +162,7 @@ function is_baremetal {
|
||||
# so that we can build the deployment kernel & ramdisk
|
||||
function prepare_baremetal_toolchain {
|
||||
if [[ $(type -P ramdisk-image-create) == "" ]]; then
|
||||
pip_install diskimage_builder
|
||||
pip_install_gr diskimage-builder
|
||||
fi
|
||||
local shellinabox_basename=$(basename $BM_SHELL_IN_A_BOX)
|
||||
if [[ ! -e $DEST/$shellinabox_basename ]]; then
|
||||
|
||||
+7
-4
@@ -35,8 +35,9 @@ set +o xtrace
|
||||
# --------
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["python-ceilometerclient"]=$DEST/python-ceilometerclient
|
||||
|
||||
CEILOMETER_DIR=$DEST/ceilometer
|
||||
CEILOMETERCLIENT_DIR=$DEST/python-ceilometerclient
|
||||
CEILOMETER_CONF_DIR=/etc/ceilometer
|
||||
CEILOMETER_CONF=$CEILOMETER_CONF_DIR/ceilometer.conf
|
||||
CEILOMETER_API_LOG_DIR=/var/log/ceilometer-api
|
||||
@@ -246,9 +247,11 @@ function install_ceilometer {
|
||||
|
||||
# install_ceilometerclient() - Collect source and prepare
|
||||
function install_ceilometerclient {
|
||||
git_clone $CEILOMETERCLIENT_REPO $CEILOMETERCLIENT_DIR $CEILOMETERCLIENT_BRANCH
|
||||
setup_develop $CEILOMETERCLIENT_DIR
|
||||
sudo install -D -m 0644 -o $STACK_USER {$CEILOMETERCLIENT_DIR/tools/,/etc/bash_completion.d/}ceilometer.bash_completion
|
||||
if use_library_from_git "python-ceilometerclient"; then
|
||||
git_clone_by_name "python-ceilometerclient"
|
||||
setup_dev_lib "python-ceilometerclient"
|
||||
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-ceilometerclient"]}/tools/,/etc/bash_completion.d/}ceilometer.bash_completion
|
||||
fi
|
||||
}
|
||||
|
||||
# start_ceilometer() - Start running processes, including screen
|
||||
|
||||
+7
-12
@@ -36,8 +36,9 @@ if [[ -r $CINDER_PLUGINS/$CINDER_DRIVER ]]; then
|
||||
fi
|
||||
|
||||
# set up default directories
|
||||
GITDIR["python-cinderclient"]=$DEST/python-cinderclient
|
||||
|
||||
CINDER_DIR=$DEST/cinder
|
||||
CINDERCLIENT_DIR=$DEST/python-cinderclient
|
||||
CINDER_STATE_PATH=${CINDER_STATE_PATH:=$DATA_DIR/cinder}
|
||||
CINDER_AUTH_CACHE_DIR=${CINDER_AUTH_CACHE_DIR:-/var/cache/cinder}
|
||||
|
||||
@@ -401,9 +402,11 @@ function install_cinder {
|
||||
|
||||
# install_cinderclient() - Collect source and prepare
|
||||
function install_cinderclient {
|
||||
git_clone $CINDERCLIENT_REPO $CINDERCLIENT_DIR $CINDERCLIENT_BRANCH
|
||||
setup_develop $CINDERCLIENT_DIR
|
||||
sudo install -D -m 0644 -o $STACK_USER {$CINDERCLIENT_DIR/tools/,/etc/bash_completion.d/}cinder.bash_completion
|
||||
if use_library_from_git "python-cinderclient"; then
|
||||
git_clone_by_name "python-cinderclient"
|
||||
setup_dev_lib "python-cinderclient"
|
||||
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-cinderclient"]}/tools/,/etc/bash_completion.d/}cinder.bash_completion
|
||||
fi
|
||||
}
|
||||
|
||||
# apply config.d approach for cinder volumes directory
|
||||
@@ -473,14 +476,6 @@ function stop_cinder {
|
||||
for serv in c-api c-bak c-sch c-vol; do
|
||||
stop_process $serv
|
||||
done
|
||||
|
||||
if is_service_enabled c-vol; then
|
||||
if is_ubuntu; then
|
||||
stop_service tgt
|
||||
else
|
||||
stop_service tgtd
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# create_volume_types() - Create Cinder's configured volume types
|
||||
|
||||
+3
-5
@@ -82,8 +82,6 @@ function merge_config_file {
|
||||
local matchgroup=$2
|
||||
local configfile=$3
|
||||
|
||||
# note in the awk below, \x27 is ascii for ' -- this avoids
|
||||
# having to do nasty quoting games
|
||||
get_meta_section $file $matchgroup $configfile | \
|
||||
$CONFIG_AWK_CMD -v configfile=$configfile '
|
||||
BEGIN {
|
||||
@@ -140,13 +138,13 @@ function merge_config_file {
|
||||
for (attr_no = cfg_sec_attr_count[sno] - 1; attr_no >=0; attr_no--) {
|
||||
attr = cfg_sec_attr_name[sno, attr_no]
|
||||
if (cfg_attr_count[section, attr] == 1)
|
||||
print "iniset " configfile " " section " " attr " \x27" cfg_attr[section, attr, 0] "\x27"
|
||||
print "iniset " configfile " " section " " attr " \"" cfg_attr[section, attr, 0] "\""
|
||||
else {
|
||||
# For multiline, invoke the ini routines in the reverse order
|
||||
count = cfg_attr_count[section, attr]
|
||||
print "iniset " configfile " " section " " attr " \x27" cfg_attr[section, attr, count - 1] "\x27"
|
||||
print "iniset " configfile " " section " " attr " \"" cfg_attr[section, attr, count - 1] "\""
|
||||
for (l = count -2; l >= 0; l--)
|
||||
print "iniadd_literal " configfile " " section " " attr " \x27" cfg_attr[section, attr, l] "\x27"
|
||||
print "iniadd_literal " configfile " " section " " attr " \"" cfg_attr[section, attr, l] "\""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ fi
|
||||
|
||||
# install_dib() - Collect source and prepare
|
||||
function install_dib {
|
||||
pip_install diskimage-builder
|
||||
pip_install_gr diskimage-builder
|
||||
|
||||
git_clone $TIE_REPO $TIE_DIR $TIE_BRANCH
|
||||
git_clone $OCC_REPO $OCC_DIR $OCC_BRANCH
|
||||
|
||||
+11
-6
@@ -27,9 +27,10 @@ set +o xtrace
|
||||
# --------
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["python-glanceclient"]=$DEST/python-glanceclient
|
||||
GITDIR["glance_store"]=$DEST/glance_store
|
||||
|
||||
GLANCE_DIR=$DEST/glance
|
||||
GLANCE_STORE_DIR=$DEST/glance_store
|
||||
GLANCECLIENT_DIR=$DEST/python-glanceclient
|
||||
GLANCE_CACHE_DIR=${GLANCE_CACHE_DIR:=$DATA_DIR/glance/cache}
|
||||
GLANCE_IMAGE_DIR=${GLANCE_IMAGE_DIR:=$DATA_DIR/glance/images}
|
||||
GLANCE_AUTH_CACHE_DIR=${GLANCE_AUTH_CACHE_DIR:-/var/cache/glance}
|
||||
@@ -286,16 +287,20 @@ function init_glance {
|
||||
|
||||
# install_glanceclient() - Collect source and prepare
|
||||
function install_glanceclient {
|
||||
git_clone $GLANCECLIENT_REPO $GLANCECLIENT_DIR $GLANCECLIENT_BRANCH
|
||||
setup_develop $GLANCECLIENT_DIR
|
||||
if use_library_from_git "python-glanceclient"; then
|
||||
git_clone_by_name "python-glanceclient"
|
||||
setup_dev_lib "python-glanceclient"
|
||||
fi
|
||||
}
|
||||
|
||||
# install_glance() - Collect source and prepare
|
||||
function install_glance {
|
||||
# Install glance_store from git so we make sure we're testing
|
||||
# the latest code.
|
||||
git_clone $GLANCE_STORE_REPO $GLANCE_STORE_DIR $GLANCE_STORE_BRANCH
|
||||
setup_develop $GLANCE_STORE_DIR
|
||||
if use_library_from_git "glance_store"; then
|
||||
git_clone_by_name "glance_store"
|
||||
setup_dev_lib "glance_store"
|
||||
fi
|
||||
|
||||
git_clone $GLANCE_REPO $GLANCE_DIR $GLANCE_BRANCH
|
||||
setup_develop $GLANCE_DIR
|
||||
|
||||
@@ -29,8 +29,9 @@ set +o xtrace
|
||||
# --------
|
||||
|
||||
# set up default directories
|
||||
GITDIR["python-heatclient"]=$DEST/python-heatclient
|
||||
|
||||
HEAT_DIR=$DEST/heat
|
||||
HEATCLIENT_DIR=$DEST/python-heatclient
|
||||
HEAT_CFNTOOLS_DIR=$DEST/heat-cfntools
|
||||
HEAT_TEMPLATES_REPO_DIR=$DEST/heat-templates
|
||||
HEAT_AUTH_CACHE_DIR=${HEAT_AUTH_CACHE_DIR:-/var/cache/heat}
|
||||
@@ -131,6 +132,7 @@ function configure_heat {
|
||||
|
||||
# OpenStack API
|
||||
iniset $HEAT_CONF heat_api bind_port $HEAT_API_PORT
|
||||
iniset $HEAT_CONF heat_api workers "$API_WORKERS"
|
||||
|
||||
# Cloudformation API
|
||||
iniset $HEAT_CONF heat_api_cfn bind_port $HEAT_API_CFN_PORT
|
||||
@@ -183,9 +185,11 @@ function create_heat_cache_dir {
|
||||
|
||||
# install_heatclient() - Collect source and prepare
|
||||
function install_heatclient {
|
||||
git_clone $HEATCLIENT_REPO $HEATCLIENT_DIR $HEATCLIENT_BRANCH
|
||||
setup_develop $HEATCLIENT_DIR
|
||||
sudo install -D -m 0644 -o $STACK_USER {$HEATCLIENT_DIR/tools/,/etc/bash_completion.d/}heat.bash_completion
|
||||
if use_library_from_git "python-heatclient"; then
|
||||
git_clone_by_name "python-heatclient"
|
||||
setup_dev_lib "python-heatclient"
|
||||
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-heatclient"]}/tools/,/etc/bash_completion.d/}heat.bash_completion
|
||||
fi
|
||||
}
|
||||
|
||||
# install_heat() - Collect source and prepare
|
||||
|
||||
+23
-3
@@ -25,8 +25,9 @@ set +o xtrace
|
||||
# --------
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["django_openstack_auth"]=$DEST/django_openstack_auth
|
||||
|
||||
HORIZON_DIR=$DEST/horizon
|
||||
HORIZONAUTH_DIR=$DEST/django_openstack_auth
|
||||
|
||||
# local_settings.py is used to customize Dashboard settings.
|
||||
# The example file in Horizon repo is used by default.
|
||||
@@ -84,6 +85,12 @@ function cleanup_horizon {
|
||||
# configure_horizon() - Set config files, create data dirs, etc
|
||||
function configure_horizon {
|
||||
setup_develop $HORIZON_DIR
|
||||
|
||||
# Compile message catalogs.
|
||||
# Horizon is installed as develop mode, so we can compile here.
|
||||
# Message catalog compilation is handled by Django admin script,
|
||||
# so compiling them after the installation avoids Django installation twice.
|
||||
(cd $HORIZON_DIR; ./run_tests.sh -N --compilemessages)
|
||||
}
|
||||
|
||||
# init_horizon() - Initialize databases, etc.
|
||||
@@ -137,8 +144,16 @@ function init_horizon {
|
||||
|
||||
# install_django_openstack_auth() - Collect source and prepare
|
||||
function install_django_openstack_auth {
|
||||
git_clone $HORIZONAUTH_REPO $HORIZONAUTH_DIR $HORIZONAUTH_BRANCH
|
||||
setup_install $HORIZONAUTH_DIR
|
||||
if use_library_from_git "django_openstack_auth"; then
|
||||
local dir=${GITDIR["django_openstack_auth"]}
|
||||
git_clone_by_name "django_openstack_auth"
|
||||
# Compile message catalogs before installation
|
||||
_prepare_message_catalog_compilation
|
||||
(cd $dir; python setup.py compile_catalog)
|
||||
setup_dev_lib "django_openstack_auth"
|
||||
fi
|
||||
# if we aren't using this library from git, then we just let it
|
||||
# get dragged in by the horizon setup.
|
||||
}
|
||||
|
||||
# install_horizon() - Collect source and prepare
|
||||
@@ -160,6 +175,11 @@ function stop_horizon {
|
||||
stop_apache_server
|
||||
}
|
||||
|
||||
# NOTE: It can be moved to common functions, but it is only used by compilation
|
||||
# of django_openstack_auth catalogs at the moment.
|
||||
function _prepare_message_catalog_compilation {
|
||||
pip_install_gr Babel
|
||||
}
|
||||
|
||||
# Restore xtrace
|
||||
$XTRACE
|
||||
|
||||
@@ -27,15 +27,19 @@ REQUIREMENTS_DIR=$DEST/requirements
|
||||
|
||||
# install_infra() - Collect source and prepare
|
||||
function install_infra {
|
||||
local PIP_VIRTUAL_ENV="$REQUIREMENTS_DIR/.venv"
|
||||
# bring down global requirements
|
||||
git_clone $REQUIREMENTS_REPO $REQUIREMENTS_DIR $REQUIREMENTS_BRANCH
|
||||
pip_install $REQUIREMENTS_DIR
|
||||
|
||||
# Install pbr
|
||||
if use_library_from_git "pbr"; then
|
||||
git_clone_by_name "pbr"
|
||||
setup_lib "pbr"
|
||||
else
|
||||
pip_install "pbr"
|
||||
# Always upgrade pbr to latest version as we may have pulled it
|
||||
# in via system packages.
|
||||
pip_install "-U" "pbr"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
+52
-9
@@ -28,11 +28,12 @@ set +o pipefail
|
||||
# --------
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["python-ironicclient"]=$DEST/python-ironicclient
|
||||
|
||||
IRONIC_DIR=$DEST/ironic
|
||||
IRONIC_PYTHON_AGENT_DIR=$DEST/ironic-python-agent
|
||||
IRONIC_DATA_DIR=$DATA_DIR/ironic
|
||||
IRONIC_STATE_PATH=/var/lib/ironic
|
||||
IRONICCLIENT_DIR=$DEST/python-ironicclient
|
||||
IRONIC_AUTH_CACHE_DIR=${IRONIC_AUTH_CACHE_DIR:-/var/cache/ironic}
|
||||
IRONIC_CONF_DIR=${IRONIC_CONF_DIR:-/etc/ironic}
|
||||
IRONIC_CONF_FILE=$IRONIC_CONF_DIR/ironic.conf
|
||||
@@ -150,9 +151,14 @@ function install_ironic {
|
||||
|
||||
# install_ironicclient() - Collect sources and prepare
|
||||
function install_ironicclient {
|
||||
git_clone $IRONICCLIENT_REPO $IRONICCLIENT_DIR $IRONICCLIENT_BRANCH
|
||||
setup_develop $IRONICCLIENT_DIR
|
||||
sudo install -D -m 0644 -o $STACK_USER {$IRONICCLIENT_DIR/tools/,/etc/bash_completion.d/}ironic.bash_completion
|
||||
if use_library_from_git "python-ironicclient"; then
|
||||
git_clone_by_name "python-ironicclient"
|
||||
setup_dev_lib "python-ironicclient"
|
||||
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-ironicclient"]}/tools/,/etc/bash_completion.d/}ironic.bash_completion
|
||||
else
|
||||
# nothing actually "requires" ironicclient, so force instally from pypi
|
||||
pip_install_gr python-ironicclient
|
||||
fi
|
||||
}
|
||||
|
||||
# _cleanup_ironic_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
|
||||
@@ -270,9 +276,22 @@ function configure_ironic_conductor {
|
||||
iniset $IRONIC_CONF_FILE pxe tftp_server $HOST_IP
|
||||
iniset $IRONIC_CONF_FILE pxe tftp_root $IRONIC_TFTPBOOT_DIR
|
||||
iniset $IRONIC_CONF_FILE pxe tftp_master_path $IRONIC_TFTPBOOT_DIR/master_images
|
||||
|
||||
local pxe_params=""
|
||||
if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] ; then
|
||||
iniset $IRONIC_CONF_FILE pxe pxe_append_params "nofb nomodeset vga=normal console=ttyS0"
|
||||
pxe_params="nofb nomodeset vga=normal console=ttyS0"
|
||||
fi
|
||||
|
||||
# When booting with less than 1GB, we need to switch from default tmpfs
|
||||
# to ramfs for ramdisks to decompress successfully.
|
||||
if [[ "$IRONIC_VM_SPECS_RAM" -lt 1024 ]]; then
|
||||
pxe_params+=" rootfstype=ramfs"
|
||||
fi
|
||||
|
||||
if [[ -n "$pxe_params" ]]; then
|
||||
iniset $IRONIC_CONF_FILE pxe pxe_append_params "$pxe_params"
|
||||
fi
|
||||
|
||||
if [[ "$IRONIC_DEPLOY_DRIVER" == "agent_ssh" ]] ; then
|
||||
if [[ "$SWIFT_ENABLE_TEMPURLS" == "True" ]] ; then
|
||||
iniset $IRONIC_CONF_FILE glance swift_temp_url_key $SWIFT_TEMPURL_KEY
|
||||
@@ -456,9 +475,25 @@ function create_bridge_and_vms {
|
||||
create_ovs_taps
|
||||
}
|
||||
|
||||
function wait_for_nova_resources {
|
||||
# After nodes have been enrolled, we need to wait for both ironic and
|
||||
# nova's periodic tasks to populate the resource tracker with available
|
||||
# nodes and resources. Wait up to 2 minutes for a given resource before
|
||||
# timing out.
|
||||
local resource=$1
|
||||
local expected_count=$2
|
||||
echo_summary "Waiting 2 minutes for Nova resource tracker to pick up $resource >= $expected_count"
|
||||
for i in $(seq 1 120); do
|
||||
if [ $(nova hypervisor-stats | grep " $resource " | get_field 2) -ge $expected_count ]; then
|
||||
return 0
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
die $LINENO "Timed out waiting for Nova hypervisor-stats $resource >= $expected_count"
|
||||
}
|
||||
|
||||
function enroll_vms {
|
||||
local chassis_id=$(ironic chassis-create -d "ironic test chassis" | grep " uuid " | get_field 2)
|
||||
local idx=0
|
||||
|
||||
if [[ "$IRONIC_DEPLOY_DRIVER" == "pxe_ssh" ]] ; then
|
||||
local _IRONIC_DEPLOY_KERNEL_KEY=pxe_deploy_kernel
|
||||
@@ -468,6 +503,8 @@ function enroll_vms {
|
||||
local _IRONIC_DEPLOY_RAMDISK_KEY=deploy_ramdisk
|
||||
fi
|
||||
|
||||
local total_nodes=0
|
||||
local total_cpus=0
|
||||
while read MAC; do
|
||||
|
||||
local node_id=$(ironic node-create --chassis_uuid $chassis_id \
|
||||
@@ -487,7 +524,8 @@ function enroll_vms {
|
||||
|
||||
ironic port-create --address $MAC --node_uuid $node_id
|
||||
|
||||
idx=$((idx+1))
|
||||
total_nodes=$((total_nodes+1))
|
||||
total_cpus=$((total_cpus+$IRONIC_VM_SPECS_CPU))
|
||||
done < $IRONIC_VM_MACS_CSV_FILE
|
||||
|
||||
# create the nova flavor
|
||||
@@ -502,6 +540,11 @@ function enroll_vms {
|
||||
# from the flavor after the completion of
|
||||
# https://blueprints.launchpad.net/ironic/+spec/add-node-instance-info
|
||||
nova flavor-key baremetal set "cpu_arch"="x86_64" "baremetal:deploy_kernel_id"="$IRONIC_DEPLOY_KERNEL_ID" "baremetal:deploy_ramdisk_id"="$IRONIC_DEPLOY_RAMDISK_ID"
|
||||
|
||||
if [ "$VIRT_DRIVER" == "ironic" ]; then
|
||||
wait_for_nova_resources "count" $total_nodes
|
||||
wait_for_nova_resources "vcpus" $total_cpus
|
||||
fi
|
||||
}
|
||||
|
||||
function configure_iptables {
|
||||
@@ -579,7 +622,7 @@ function upload_baremetal_ironic_deploy {
|
||||
|
||||
# install diskimage-builder
|
||||
if [[ $(type -P ramdisk-image-create) == "" ]]; then
|
||||
pip_install diskimage_builder
|
||||
pip_install_gr diskimage-builder
|
||||
fi
|
||||
|
||||
if [ -z "$IRONIC_DEPLOY_KERNEL" -o -z "$IRONIC_DEPLOY_RAMDISK" ]; then
|
||||
@@ -638,12 +681,12 @@ function upload_baremetal_ironic_deploy {
|
||||
}
|
||||
|
||||
function prepare_baremetal_basic_ops {
|
||||
configure_ironic_auxiliary
|
||||
upload_baremetal_ironic_deploy
|
||||
create_bridge_and_vms
|
||||
enroll_vms
|
||||
configure_tftpd
|
||||
configure_iptables
|
||||
configure_ironic_auxiliary
|
||||
}
|
||||
|
||||
function cleanup_baremetal_basic_ops {
|
||||
|
||||
+15
-8
@@ -33,6 +33,9 @@ set +o xtrace
|
||||
# --------
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["python-keystoneclient"]=$DEST/python-keystoneclient
|
||||
GITDIR["keystonemiddleware"]=$DEST/keystonemiddleware
|
||||
|
||||
KEYSTONE_DIR=$DEST/keystone
|
||||
KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone}
|
||||
KEYSTONE_CONF=$KEYSTONE_CONF_DIR/keystone.conf
|
||||
@@ -44,9 +47,6 @@ else
|
||||
KEYSTONE_WSGI_DIR=${KEYSTONE_WSGI_DIR:-/var/www/keystone}
|
||||
fi
|
||||
|
||||
KEYSTONEMIDDLEWARE_DIR=$DEST/keystonemiddleware
|
||||
KEYSTONECLIENT_DIR=$DEST/python-keystoneclient
|
||||
|
||||
# Set up additional extensions, such as oauth1, federation
|
||||
# Example of KEYSTONE_EXTENSIONS=oauth1,federation
|
||||
KEYSTONE_EXTENSIONS=${KEYSTONE_EXTENSIONS:-}
|
||||
@@ -479,15 +479,22 @@ function init_keystone {
|
||||
|
||||
# install_keystoneclient() - Collect source and prepare
|
||||
function install_keystoneclient {
|
||||
git_clone $KEYSTONECLIENT_REPO $KEYSTONECLIENT_DIR $KEYSTONECLIENT_BRANCH
|
||||
setup_develop $KEYSTONECLIENT_DIR
|
||||
sudo install -D -m 0644 -o $STACK_USER {$KEYSTONECLIENT_DIR/tools/,/etc/bash_completion.d/}keystone.bash_completion
|
||||
if use_library_from_git "python-keystoneclient"; then
|
||||
git_clone_by_name "python-keystoneclient"
|
||||
setup_dev_lib "python-keystoneclient"
|
||||
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-keystoneclient"]}/tools/,/etc/bash_completion.d/}keystone.bash_completion
|
||||
fi
|
||||
}
|
||||
|
||||
# install_keystonemiddleware() - Collect source and prepare
|
||||
function install_keystonemiddleware {
|
||||
git_clone $KEYSTONEMIDDLEWARE_REPO $KEYSTONEMIDDLEWARE_DIR $KEYSTONEMIDDLEWARE_BRANCH
|
||||
setup_install $KEYSTONEMIDDLEWARE_DIR
|
||||
if use_library_from_git "keystonemiddleware"; then
|
||||
git_clone_by_name "keystonemiddleware"
|
||||
setup_dev_lib "keystonemiddleware"
|
||||
else
|
||||
# When not installing from repo, keystonemiddleware is still needed...
|
||||
pip_install_gr keystonemiddleware
|
||||
fi
|
||||
}
|
||||
|
||||
# install_keystone() - Collect source and prepare
|
||||
|
||||
@@ -138,7 +138,6 @@ function install_ldap {
|
||||
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
|
||||
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
|
||||
fi
|
||||
|
||||
rm -rf $tmp_ldap_dir
|
||||
}
|
||||
|
||||
|
||||
+23
-7
@@ -75,8 +75,10 @@ fi
|
||||
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["python-neutronclient"]=$DEST/python-neutronclient
|
||||
|
||||
|
||||
NEUTRON_DIR=$DEST/neutron
|
||||
NEUTRONCLIENT_DIR=$DEST/python-neutronclient
|
||||
NEUTRON_AUTH_CACHE_DIR=${NEUTRON_AUTH_CACHE_DIR:-/var/cache/neutron}
|
||||
|
||||
# Support entry points installation of console scripts
|
||||
@@ -505,7 +507,7 @@ function create_neutron_initial_network {
|
||||
if [[ "$PUBLIC_INTERFACE" == '' || "$OVS_PHYSICAL_BRIDGE" == '' ]]; then
|
||||
die $LINENO "Neutron settings for baremetal not set.. exiting"
|
||||
fi
|
||||
sudo ovs-vsctl add-port $OVS_PHYSICAL_BRIDGE $PUBLIC_INTERFACE
|
||||
sudo ovs-vsctl --no-wait -- --may-exist add-port $OVS_PHYSICAL_BRIDGE $PUBLIC_INTERFACE
|
||||
for IP in $(ip addr show dev $PUBLIC_INTERFACE | grep ' inet ' | awk '{print $2}'); do
|
||||
sudo ip addr del $IP dev $PUBLIC_INTERFACE
|
||||
sudo ip addr add $IP dev $OVS_PHYSICAL_BRIDGE
|
||||
@@ -599,9 +601,11 @@ function install_neutron {
|
||||
|
||||
# install_neutronclient() - Collect source and prepare
|
||||
function install_neutronclient {
|
||||
git_clone $NEUTRONCLIENT_REPO $NEUTRONCLIENT_DIR $NEUTRONCLIENT_BRANCH
|
||||
setup_develop $NEUTRONCLIENT_DIR
|
||||
sudo install -D -m 0644 -o $STACK_USER {$NEUTRONCLIENT_DIR/tools/,/etc/bash_completion.d/}neutron.bash_completion
|
||||
if use_library_from_git "python-neutronclient"; then
|
||||
git_clone_by_name "python-neutronclient"
|
||||
setup_dev_lib "python-neutronclient"
|
||||
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-neutronclient"]}/tools/,/etc/bash_completion.d/}neutron.bash_completion
|
||||
fi
|
||||
}
|
||||
|
||||
# install_neutron_agent_packages() - Collect source and prepare
|
||||
@@ -651,7 +655,7 @@ function start_neutron_agents {
|
||||
run_process q-dhcp "python $AGENT_DHCP_BINARY --config-file $NEUTRON_CONF --config-file=$Q_DHCP_CONF_FILE"
|
||||
|
||||
if is_provider_network; then
|
||||
sudo ovs-vsctl add-port $OVS_PHYSICAL_BRIDGE $PUBLIC_INTERFACE
|
||||
sudo ovs-vsctl --no-wait -- --may-exist add-port $OVS_PHYSICAL_BRIDGE $PUBLIC_INTERFACE
|
||||
sudo ip link set $OVS_PHYSICAL_BRIDGE up
|
||||
sudo ip link set br-int up
|
||||
sudo ip link set $PUBLIC_INTERFACE up
|
||||
@@ -681,6 +685,18 @@ function start_neutron_agents {
|
||||
|
||||
# stop_neutron() - Stop running processes (non-screen)
|
||||
function stop_neutron {
|
||||
stop_process q-svc
|
||||
stop_process q-agent
|
||||
stop_process q-dhcp
|
||||
stop_process q-lbaas
|
||||
stop_process q-fwaas
|
||||
stop_process q-vpn
|
||||
stop_process q-l3
|
||||
stop_process q-metering
|
||||
|
||||
# BUG: this is all legacy gorp by previous attempts that don't
|
||||
# really understand how devstack works. It can probably mostly be
|
||||
# removed.
|
||||
if is_service_enabled q-dhcp; then
|
||||
pid=$(ps aux | awk '/[d]nsmasq.+interface=(tap|ns-)/ { print $2 }')
|
||||
[ ! -z "$pid" ] && sudo kill -9 $pid
|
||||
@@ -733,7 +749,7 @@ function _configure_neutron_common {
|
||||
# For addition plugin config files, set ``Q_PLUGIN_EXTRA_CONF_PATH``,
|
||||
# ``Q_PLUGIN_EXTRA_CONF_FILES``. For example:
|
||||
#
|
||||
# ``Q_PLUGIN_EXTRA_CONF_FILES=(file1, file2)``
|
||||
# ``Q_PLUGIN_EXTRA_CONF_FILES=(file1 file2)``
|
||||
neutron_plugin_configure_common
|
||||
|
||||
if [[ "$Q_PLUGIN_CONF_PATH" == '' || "$Q_PLUGIN_CONF_FILENAME" == '' || "$Q_PLUGIN_CLASS" == '' ]]; then
|
||||
|
||||
Vendored
+1
-1
@@ -58,7 +58,7 @@ function install_ryu {
|
||||
if [[ "$_RYU_INSTALLED" == "False" ]]; then
|
||||
git_clone $RYU_REPO $RYU_DIR $RYU_BRANCH
|
||||
export PYTHONPATH=$RYU_DIR:$PYTHONPATH
|
||||
pip_install $(cat $RYU_DIR/tools/pip-requires)
|
||||
pip_install -r $RYU_DIR/tools/pip-requires
|
||||
_RYU_INSTALLED=True
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -29,8 +29,10 @@ set +o xtrace
|
||||
# --------
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["python-novaclient"]=$DEST/python-novaclient
|
||||
|
||||
|
||||
NOVA_DIR=$DEST/nova
|
||||
NOVACLIENT_DIR=$DEST/python-novaclient
|
||||
NOVA_STATE_PATH=${NOVA_STATE_PATH:=$DATA_DIR/nova}
|
||||
# INSTANCES_PATH is the previous name for this
|
||||
NOVA_INSTANCES_PATH=${NOVA_INSTANCES_PATH:=${INSTANCES_PATH:=$NOVA_STATE_PATH/instances}}
|
||||
@@ -631,9 +633,11 @@ function init_nova {
|
||||
|
||||
# install_novaclient() - Collect source and prepare
|
||||
function install_novaclient {
|
||||
git_clone $NOVACLIENT_REPO $NOVACLIENT_DIR $NOVACLIENT_BRANCH
|
||||
setup_develop $NOVACLIENT_DIR
|
||||
sudo install -D -m 0644 -o $STACK_USER {$NOVACLIENT_DIR/tools/,/etc/bash_completion.d/}nova.bash_completion
|
||||
if use_library_from_git "python-novaclient"; then
|
||||
git_clone_by_name "python-novaclient"
|
||||
setup_dev_lib "python-novaclient"
|
||||
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-novaclient"]}/tools/,/etc/bash_completion.d/}nova.bash_completion
|
||||
fi
|
||||
}
|
||||
|
||||
# install_nova() - Collect source and prepare
|
||||
|
||||
@@ -42,6 +42,7 @@ function configure_nova_hypervisor {
|
||||
iniset $NOVA_CONF DEFAULT scheduler_host_manager nova.scheduler.ironic_host_manager.IronicHostManager
|
||||
iniset $NOVA_CONF DEFAULT ram_allocation_ratio 1.0
|
||||
iniset $NOVA_CONF DEFAULT reserved_host_memory_mb 0
|
||||
iniset $NOVA_CONF DEFAULT force_config_drive False
|
||||
# ironic section
|
||||
iniset $NOVA_CONF ironic admin_username admin
|
||||
iniset $NOVA_CONF ironic admin_password $ADMIN_PASSWORD
|
||||
@@ -56,6 +57,13 @@ function install_nova_hypervisor {
|
||||
die $LINENO "Neutron should be enabled for usage of the Ironic Nova driver."
|
||||
fi
|
||||
install_libvirt
|
||||
if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] && is_ubuntu; then
|
||||
# Ubuntu packaging+apparmor issue prevents libvirt from loading
|
||||
# the ROM from /usr/share/misc. Workaround by installing it directly
|
||||
# to a directory that it can read from. (LP: #1393548)
|
||||
sudo rm -rf /usr/share/qemu/sgabios.bin
|
||||
sudo cp /usr/share/misc/sgabios.bin /usr/share/qemu/sgabios.bin
|
||||
fi
|
||||
}
|
||||
|
||||
# start_nova_hypervisor - Start any required external services
|
||||
|
||||
@@ -25,7 +25,6 @@ GITDIR["oslo.config"]=$DEST/oslo.config
|
||||
GITDIR["oslo.concurrency"]=$DEST/oslo.concurrency
|
||||
GITDIR["oslo.db"]=$DEST/oslo.db
|
||||
GITDIR["oslo.i18n"]=$DEST/oslo.i18n
|
||||
GITDIR["oslo.log"]=$DEST/oslo.log
|
||||
GITDIR["oslo.middleware"]=$DEST/oslo.middleware
|
||||
GITDIR["oslo.messaging"]=$DEST/oslo.messaging
|
||||
GITDIR["oslo.rootwrap"]=$DEST/oslo.rootwrap
|
||||
@@ -58,7 +57,6 @@ function install_oslo {
|
||||
_do_install_oslo_lib "oslo.serialization"
|
||||
_do_install_oslo_lib "oslo.config"
|
||||
_do_install_oslo_lib "oslo.concurrency"
|
||||
_do_install_oslo_lib "oslo.log"
|
||||
_do_install_oslo_lib "oslo.middleware"
|
||||
_do_install_oslo_lib "oslo.messaging"
|
||||
_do_install_oslo_lib "oslo.rootwrap"
|
||||
|
||||
+1
-1
@@ -125,7 +125,7 @@ function install_rpc_backend {
|
||||
# TODO(kgiusti) can remove once python qpid bindings are
|
||||
# available on all supported platforms _and_ pyngus is added
|
||||
# to the requirements.txt file in oslo.messaging
|
||||
pip_install pyngus
|
||||
pip_install_gr pyngus
|
||||
fi
|
||||
|
||||
if is_service_enabled rabbit; then
|
||||
|
||||
+24
-13
@@ -21,16 +21,9 @@ set +o xtrace
|
||||
# Defaults
|
||||
# --------
|
||||
|
||||
# Set up default repos
|
||||
SAHARA_REPO=${SAHARA_REPO:-${GIT_BASE}/openstack/sahara.git}
|
||||
SAHARA_BRANCH=${SAHARA_BRANCH:-master}
|
||||
|
||||
SAHARA_PYTHONCLIENT_REPO=${SAHARA_PYTHONCLIENT_REPO:-${GIT_BASE}/openstack/python-saharaclient.git}
|
||||
SAHARA_PYTHONCLIENT_BRANCH=${SAHARA_PYTHONCLIENT_BRANCH:-master}
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["python-saharaclient"]=$DEST/python-saharaclient
|
||||
SAHARA_DIR=$DEST/sahara
|
||||
SAHARA_PYTHONCLIENT_DIR=$DEST/python-saharaclient
|
||||
|
||||
SAHARA_CONF_DIR=${SAHARA_CONF_DIR:-/etc/sahara}
|
||||
SAHARA_CONF_FILE=${SAHARA_CONF_DIR}/sahara.conf
|
||||
@@ -72,9 +65,25 @@ function create_sahara_accounts {
|
||||
|
||||
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
|
||||
|
||||
local sahara_service=$(get_or_create_service "sahara" \
|
||||
"data_processing" "Sahara Data Processing")
|
||||
get_or_create_endpoint $sahara_service \
|
||||
# TODO: remove "data_processing" service when #1356053 will be fixed
|
||||
local sahara_service_old=$(openstack service create \
|
||||
"sahara" \
|
||||
--type "data_processing" \
|
||||
--description "Sahara Data Processing (for Juno release)" \
|
||||
-f value -c id
|
||||
)
|
||||
local sahara_service_new=$(openstack service create \
|
||||
"sahara" \
|
||||
--type "data-processing" \
|
||||
--description "Sahara Data Processing (for Kilo and future releases)" \
|
||||
-f value -c id
|
||||
)
|
||||
get_or_create_endpoint $sahara_service_old \
|
||||
"$REGION_NAME" \
|
||||
"$SAHARA_SERVICE_PROTOCOL://$SAHARA_SERVICE_HOST:$SAHARA_SERVICE_PORT/v1.1/\$(tenant_id)s" \
|
||||
"$SAHARA_SERVICE_PROTOCOL://$SAHARA_SERVICE_HOST:$SAHARA_SERVICE_PORT/v1.1/\$(tenant_id)s" \
|
||||
"$SAHARA_SERVICE_PROTOCOL://$SAHARA_SERVICE_HOST:$SAHARA_SERVICE_PORT/v1.1/\$(tenant_id)s"
|
||||
get_or_create_endpoint $sahara_service_new \
|
||||
"$REGION_NAME" \
|
||||
"$SAHARA_SERVICE_PROTOCOL://$SAHARA_SERVICE_HOST:$SAHARA_SERVICE_PORT/v1.1/\$(tenant_id)s" \
|
||||
"$SAHARA_SERVICE_PROTOCOL://$SAHARA_SERVICE_HOST:$SAHARA_SERVICE_PORT/v1.1/\$(tenant_id)s" \
|
||||
@@ -153,8 +162,10 @@ function install_sahara {
|
||||
|
||||
# install_python_saharaclient() - Collect source and prepare
|
||||
function install_python_saharaclient {
|
||||
git_clone $SAHARA_PYTHONCLIENT_REPO $SAHARA_PYTHONCLIENT_DIR $SAHARA_PYTHONCLIENT_BRANCH
|
||||
setup_develop $SAHARA_PYTHONCLIENT_DIR
|
||||
if use_library_from_git "python-saharaclient"; then
|
||||
git_clone_by_name "python-saharaclient"
|
||||
setup_dev_lib "python-saharaclient"
|
||||
fi
|
||||
}
|
||||
|
||||
# start_sahara() - Start running processes, including screen
|
||||
|
||||
@@ -34,8 +34,10 @@ if is_ssl_enabled_service "s-proxy" || is_service_enabled tls-proxy; then
|
||||
fi
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["python-swiftclient"]=$DEST/python-swiftclient
|
||||
|
||||
|
||||
SWIFT_DIR=$DEST/swift
|
||||
SWIFTCLIENT_DIR=$DEST/python-swiftclient
|
||||
SWIFT_AUTH_CACHE_DIR=${SWIFT_AUTH_CACHE_DIR:-/var/cache/swift}
|
||||
SWIFT_APACHE_WSGI_DIR=${SWIFT_APACHE_WSGI_DIR:-/var/www/swift}
|
||||
SWIFT3_DIR=$DEST/swift3
|
||||
@@ -330,7 +332,12 @@ function configure_swift {
|
||||
SWIFT_CONFIG_PROXY_SERVER=${SWIFT_CONF_DIR}/proxy-server.conf
|
||||
cp ${SWIFT_DIR}/etc/proxy-server.conf-sample ${SWIFT_CONFIG_PROXY_SERVER}
|
||||
|
||||
cp ${SWIFT_DIR}/etc/container-sync-realms.conf-sample ${SWIFT_CONF_DIR}/container-sync-realms.conf
|
||||
# To run container sync feature introduced in Swift ver 1.12.0,
|
||||
# container sync "realm" is added in container-sync-realms.conf
|
||||
local csyncfile=${SWIFT_CONF_DIR}/container-sync-realms.conf
|
||||
cp ${SWIFT_DIR}/etc/container-sync-realms.conf-sample ${csyncfile}
|
||||
iniset ${csyncfile} realm1 key realm1key
|
||||
iniset ${csyncfile} realm1 cluster_name1 "$SWIFT_SERVICE_PROTOCOL://$SERVICE_HOST:8080/v1/"
|
||||
|
||||
iniuncomment ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT user
|
||||
iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT user ${STACK_USER}
|
||||
@@ -649,8 +656,10 @@ function install_swift {
|
||||
}
|
||||
|
||||
function install_swiftclient {
|
||||
git_clone $SWIFTCLIENT_REPO $SWIFTCLIENT_DIR $SWIFTCLIENT_BRANCH
|
||||
setup_develop $SWIFTCLIENT_DIR
|
||||
if use_library_from_git "python-swiftclient"; then
|
||||
git_clone_by_name "python-swiftclient"
|
||||
setup_dev_lib "python-swiftclient"
|
||||
fi
|
||||
}
|
||||
|
||||
# start_swift() - Start running processes, including screen
|
||||
|
||||
+179
-119
@@ -44,11 +44,12 @@ set +o xtrace
|
||||
# --------
|
||||
|
||||
# Set up default directories
|
||||
GITDIR["tempest-lib"]=$DEST/tempest-lib
|
||||
|
||||
TEMPEST_DIR=$DEST/tempest
|
||||
TEMPEST_CONFIG_DIR=${TEMPEST_CONFIG_DIR:-$TEMPEST_DIR/etc}
|
||||
TEMPEST_CONFIG=$TEMPEST_CONFIG_DIR/tempest.conf
|
||||
TEMPEST_STATE_PATH=${TEMPEST_STATE_PATH:=$DATA_DIR/tempest}
|
||||
TEMPEST_LIB_DIR=$DEST/tempest-lib
|
||||
|
||||
NOVA_SOURCE_DIR=$DEST/nova
|
||||
|
||||
@@ -76,7 +77,9 @@ IPV6_SUBNET_ATTRIBUTES_ENABLED=$(trueorfalse True $IPV6_SUBNET_ATTRIBUTES_ENABLE
|
||||
|
||||
# configure_tempest() - Set config files, create data dirs, etc
|
||||
function configure_tempest {
|
||||
setup_develop $TEMPEST_DIR
|
||||
# install testr since its used to process tempest logs
|
||||
pip_install_gr testrepository
|
||||
|
||||
local image_lines
|
||||
local images
|
||||
local num_images
|
||||
@@ -107,43 +110,44 @@ function configure_tempest {
|
||||
# ... Also ensure we only take active images, so we don't get snapshots in process
|
||||
declare -a images
|
||||
|
||||
while read -r IMAGE_NAME IMAGE_UUID; do
|
||||
if [ "$IMAGE_NAME" = "$DEFAULT_IMAGE_NAME" ]; then
|
||||
image_uuid="$IMAGE_UUID"
|
||||
image_uuid_alt="$IMAGE_UUID"
|
||||
fi
|
||||
images+=($IMAGE_UUID)
|
||||
# TODO(stevemar): update this command to use openstackclient's `openstack image list`
|
||||
# when it supports listing by status.
|
||||
done < <(glance image-list --status=active | awk -F'|' '!/^(+--)|ID|aki|ari/ { print $3,$2 }')
|
||||
|
||||
case "${#images[*]}" in
|
||||
0)
|
||||
echo "Found no valid images to use!"
|
||||
exit 1
|
||||
;;
|
||||
1)
|
||||
if [ -z "$image_uuid" ]; then
|
||||
image_uuid=${images[0]}
|
||||
image_uuid_alt=${images[0]}
|
||||
if is_service_enabled glance; then
|
||||
while read -r IMAGE_NAME IMAGE_UUID; do
|
||||
if [ "$IMAGE_NAME" = "$DEFAULT_IMAGE_NAME" ]; then
|
||||
image_uuid="$IMAGE_UUID"
|
||||
image_uuid_alt="$IMAGE_UUID"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if [ -z "$image_uuid" ]; then
|
||||
image_uuid=${images[0]}
|
||||
image_uuid_alt=${images[1]}
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
images+=($IMAGE_UUID)
|
||||
# TODO(stevemar): update this command to use openstackclient's `openstack image list`
|
||||
# when it supports listing by status.
|
||||
done < <(glance image-list --status=active | awk -F'|' '!/^(+--)|ID|aki|ari/ { print $3,$2 }')
|
||||
|
||||
# Create tempest.conf from tempest.conf.sample
|
||||
# copy every time, because the image UUIDS are going to change
|
||||
case "${#images[*]}" in
|
||||
0)
|
||||
echo "Found no valid images to use!"
|
||||
exit 1
|
||||
;;
|
||||
1)
|
||||
if [ -z "$image_uuid" ]; then
|
||||
image_uuid=${images[0]}
|
||||
image_uuid_alt=${images[0]}
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if [ -z "$image_uuid" ]; then
|
||||
image_uuid=${images[0]}
|
||||
image_uuid_alt=${images[1]}
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# (Re)create ``tempest.conf``
|
||||
# Create every time because the image UUIDS are going to change
|
||||
if [[ ! -d $TEMPEST_CONFIG_DIR ]]; then
|
||||
sudo mkdir -p $TEMPEST_CONFIG_DIR
|
||||
fi
|
||||
sudo chown $STACK_USER $TEMPEST_CONFIG_DIR
|
||||
cp $TEMPEST_DIR/etc/tempest.conf.sample $TEMPEST_CONFIG
|
||||
chmod 644 $TEMPEST_CONFIG
|
||||
rm -f $TEMPEST_CONFIG
|
||||
|
||||
password=${ADMIN_PASSWORD:-secrete}
|
||||
|
||||
@@ -158,63 +162,65 @@ function configure_tempest {
|
||||
ALT_TENANT_NAME=${ALT_TENANT_NAME:-alt_demo}
|
||||
ADMIN_TENANT_ID=$(openstack project list | awk "/ admin / { print \$2 }")
|
||||
|
||||
# If the ``DEFAULT_INSTANCE_TYPE`` not declared, use the new behavior
|
||||
# Tempest creates instane types for himself
|
||||
if [[ -z "$DEFAULT_INSTANCE_TYPE" ]]; then
|
||||
available_flavors=$(nova flavor-list)
|
||||
if [[ ! ( $available_flavors =~ 'm1.nano' ) ]]; then
|
||||
if is_arch "ppc64"; then
|
||||
# qemu needs at least 128MB of memory to boot on ppc64
|
||||
nova flavor-create m1.nano 42 128 0 1
|
||||
else
|
||||
nova flavor-create m1.nano 42 64 0 1
|
||||
if is_service_enabled nova; then
|
||||
# If the ``DEFAULT_INSTANCE_TYPE`` not declared, use the new behavior
|
||||
# Tempest creates instane types for himself
|
||||
if [[ -z "$DEFAULT_INSTANCE_TYPE" ]]; then
|
||||
available_flavors=$(nova flavor-list)
|
||||
if [[ ! ( $available_flavors =~ 'm1.nano' ) ]]; then
|
||||
if is_arch "ppc64"; then
|
||||
# qemu needs at least 128MB of memory to boot on ppc64
|
||||
nova flavor-create m1.nano 42 128 0 1
|
||||
else
|
||||
nova flavor-create m1.nano 42 64 0 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
flavor_ref=42
|
||||
boto_instance_type=m1.nano
|
||||
if [[ ! ( $available_flavors =~ 'm1.micro' ) ]]; then
|
||||
if is_arch "ppc64"; then
|
||||
nova flavor-create m1.micro 84 256 0 1
|
||||
else
|
||||
nova flavor-create m1.micro 84 128 0 1
|
||||
flavor_ref=42
|
||||
boto_instance_type=m1.nano
|
||||
if [[ ! ( $available_flavors =~ 'm1.micro' ) ]]; then
|
||||
if is_arch "ppc64"; then
|
||||
nova flavor-create m1.micro 84 256 0 1
|
||||
else
|
||||
nova flavor-create m1.micro 84 128 0 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
flavor_ref_alt=84
|
||||
else
|
||||
# Check Nova for existing flavors and, if set, look for the
|
||||
# ``DEFAULT_INSTANCE_TYPE`` and use that.
|
||||
boto_instance_type=$DEFAULT_INSTANCE_TYPE
|
||||
flavor_lines=`nova flavor-list`
|
||||
IFS=$'\r\n'
|
||||
flavors=""
|
||||
for line in $flavor_lines; do
|
||||
f=$(echo $line | awk "/ $DEFAULT_INSTANCE_TYPE / { print \$2 }")
|
||||
flavors="$flavors $f"
|
||||
done
|
||||
flavor_ref_alt=84
|
||||
else
|
||||
# Check Nova for existing flavors and, if set, look for the
|
||||
# ``DEFAULT_INSTANCE_TYPE`` and use that.
|
||||
boto_instance_type=$DEFAULT_INSTANCE_TYPE
|
||||
flavor_lines=`nova flavor-list`
|
||||
IFS=$'\r\n'
|
||||
flavors=""
|
||||
for line in $flavor_lines; do
|
||||
f=$(echo $line | awk "/ $DEFAULT_INSTANCE_TYPE / { print \$2 }")
|
||||
flavors="$flavors $f"
|
||||
done
|
||||
|
||||
for line in $flavor_lines; do
|
||||
flavors="$flavors `echo $line | grep -v "^\(|\s*ID\|+--\)" | cut -d' ' -f2`"
|
||||
done
|
||||
for line in $flavor_lines; do
|
||||
flavors="$flavors `echo $line | grep -v "^\(|\s*ID\|+--\)" | cut -d' ' -f2`"
|
||||
done
|
||||
|
||||
IFS=" "
|
||||
flavors=($flavors)
|
||||
num_flavors=${#flavors[*]}
|
||||
echo "Found $num_flavors flavors"
|
||||
if [[ $num_flavors -eq 0 ]]; then
|
||||
echo "Found no valid flavors to use!"
|
||||
exit 1
|
||||
fi
|
||||
flavor_ref=${flavors[0]}
|
||||
flavor_ref_alt=$flavor_ref
|
||||
|
||||
# ensure flavor_ref and flavor_ref_alt have different values
|
||||
# some resize instance in tempest tests depends on this.
|
||||
for f in ${flavors[@]:1}; do
|
||||
if [[ $f -ne $flavor_ref ]]; then
|
||||
flavor_ref_alt=$f
|
||||
break
|
||||
IFS=" "
|
||||
flavors=($flavors)
|
||||
num_flavors=${#flavors[*]}
|
||||
echo "Found $num_flavors flavors"
|
||||
if [[ $num_flavors -eq 0 ]]; then
|
||||
echo "Found no valid flavors to use!"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
flavor_ref=${flavors[0]}
|
||||
flavor_ref_alt=$flavor_ref
|
||||
|
||||
# ensure flavor_ref and flavor_ref_alt have different values
|
||||
# some resize instance in tempest tests depends on this.
|
||||
for f in ${flavors[@]:1}; do
|
||||
if [[ $f -ne $flavor_ref ]]; then
|
||||
flavor_ref_alt=$f
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$Q_USE_NAMESPACE" != "False" ]; then
|
||||
@@ -268,6 +274,9 @@ function configure_tempest {
|
||||
iniset $TEMPEST_CONFIG identity admin_domain_name $ADMIN_DOMAIN_NAME
|
||||
iniset $TEMPEST_CONFIG identity auth_version ${TEMPEST_AUTH_VERSION:-v2}
|
||||
|
||||
# Identity Features
|
||||
iniset $TEMPEST_CONFIG identity-feature-enabled xml_api True
|
||||
|
||||
# Image
|
||||
# for the gate we want to be able to override this variable so we aren't
|
||||
# doing an HTTP fetch over the wide internet for this test
|
||||
@@ -277,6 +286,7 @@ function configure_tempest {
|
||||
|
||||
# Compute
|
||||
iniset $TEMPEST_CONFIG compute allow_tenant_isolation ${TEMPEST_ALLOW_TENANT_ISOLATION:-True}
|
||||
iniset $TEMPEST_CONFIG auth tempest_roles "Member"
|
||||
iniset $TEMPEST_CONFIG compute ssh_user ${DEFAULT_INSTANCE_USER:-cirros} # DEPRECATED
|
||||
iniset $TEMPEST_CONFIG compute network_for_ssh $PRIVATE_NETWORK_NAME
|
||||
iniset $TEMPEST_CONFIG compute ip_version_for_ssh 4
|
||||
@@ -288,14 +298,40 @@ function configure_tempest {
|
||||
iniset $TEMPEST_CONFIG compute flavor_ref $flavor_ref
|
||||
iniset $TEMPEST_CONFIG compute flavor_ref_alt $flavor_ref_alt
|
||||
iniset $TEMPEST_CONFIG compute ssh_connect_method $ssh_connect_method
|
||||
iniset $TEMPEST_CONFIG compute fixed_network_name $PRIVATE_NETWORK_NAME
|
||||
|
||||
# Compute Features
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled resize True
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled live_migration ${LIVE_MIGRATION_AVAILABLE:-False}
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled change_password False
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled block_migration_for_live_migration ${USE_BLOCK_MIGRATION_FOR_LIVE_MIGRATION:-False}
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled api_extensions ${COMPUTE_API_EXTENSIONS:-"all"}
|
||||
iniset $TEMPEST_CONFIG compute-feature-disabled api_extensions ${DISABLE_COMPUTE_API_EXTENSIONS}
|
||||
|
||||
DEFAULT_COMPUTE_EXT="NMN, OS-DCF, OS-EXT-AZ, OS-EXT-IMG-SIZE, OS-EXT-IPS, OS-EXT-IPS-MAC, OS-EXT-SRV-ATTR, OS-EXT-STS"
|
||||
DEFAULT_COMPUTE_EXT+=", OS-EXT-VIF-NET, OS-FLV-DISABLED, OS-FLV-EXT-DATA, OS-SCH-HNT, OS-SRV-USG"
|
||||
DEFAULT_COMPUTE_EXT+=", os-admin-actions, os-agents, os-aggregates, os-assisted-volume-snapshots"
|
||||
DEFAULT_COMPUTE_EXT+=", os-attach-interfaces, os-availability-zone, os-baremetal-ext-status, os-baremetal-nodes"
|
||||
DEFAULT_COMPUTE_EXT+=", os-block-device-mapping-v2-boot, os-cell-capacities, os-cells, os-certificates"
|
||||
DEFAULT_COMPUTE_EXT+=", os-cloudpipe, os-cloudpipe-update, os-config-drive, os-console-auth-tokens"
|
||||
DEFAULT_COMPUTE_EXT+=", os-console-output, os-consoles, os-create-server-ext, os-deferred-delete, os-evacuate"
|
||||
DEFAULT_COMPUTE_EXT+=", os-extended-evacuate-find-host, os-extended-floating-ips, os-extended-hypervisors"
|
||||
DEFAULT_COMPUTE_EXT+=", os-extended-networks, os-extended-quotas, os-extended-rescue-with-image"
|
||||
DEFAULT_COMPUTE_EXT+=", os-extended-services, os-extended-services-delete, os-extended-volumes, os-fixed-ips"
|
||||
DEFAULT_COMPUTE_EXT+=", os-flavor-access, os-flavor-extra-specs, os-flavor-manage, os-flavor-rxtx"
|
||||
DEFAULT_COMPUTE_EXT+=", os-flavor-swap, os-floating-ip-dns, os-floating-ip-pools, os-floating-ips"
|
||||
DEFAULT_COMPUTE_EXT+=", os-floating-ips-bulk, os-fping, os-hide-server-addresses, os-hosts, os-hypervisor-status"
|
||||
DEFAULT_COMPUTE_EXT+=", os-hypervisors, os-instance-actions, os-instance_usage_audit_log, os-keypairs"
|
||||
DEFAULT_COMPUTE_EXT+=", os-migrations, os-multiple-create, os-networks, os-networks-associate"
|
||||
DEFAULT_COMPUTE_EXT+=", os-preserve-ephemeral-rebuild, os-quota-class-sets, os-quota-sets, os-rescue"
|
||||
DEFAULT_COMPUTE_EXT+=", os-security-group-default-rules, os-security-groups, os-server-diagnostics"
|
||||
DEFAULT_COMPUTE_EXT+=", os-server-external-events, os-server-group-quotas, os-server-groups"
|
||||
DEFAULT_COMPUTE_EXT+=", os-server-list-multi-status, os-server-password, os-server-start-stop, os-services"
|
||||
DEFAULT_COMPUTE_EXT+=", os-shelve, os-simple-tenant-usage, os-tenant-networks, os-used-limits"
|
||||
DEFAULT_COMPUTE_EXT+=", os-used-limits-for-admin, os-user-data, os-user-quotas, os-virtual-interfaces"
|
||||
DEFAULT_COMPUTE_EXT+=", os-volume-attachment-update, os-volumes"
|
||||
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled api_extensions "${COMPUTE_API_EXTENSIONS:-$DEFAULT_COMPUTE_EXT}"
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled xml_api_v2 ${COMPUTE_XML_API_V2:-True}
|
||||
iniset $TEMPEST_CONFIG compute-feature-disabled api_extensions "${DISABLE_COMPUTE_API_EXTENSIONS}"
|
||||
|
||||
# Compute admin
|
||||
iniset $TEMPEST_CONFIG "compute-admin" username $ADMIN_USERNAME
|
||||
@@ -310,19 +346,30 @@ function configure_tempest {
|
||||
iniset $TEMPEST_CONFIG network default_network "$FIXED_RANGE"
|
||||
iniset $TEMPEST_CONFIG network-feature-enabled ipv6 "$IPV6_ENABLED"
|
||||
iniset $TEMPEST_CONFIG network-feature-enabled ipv6_subnet_attributes "$IPV6_SUBNET_ATTRIBUTES_ENABLED"
|
||||
iniset $TEMPEST_CONFIG network-feature-enabled api_extensions ${NETWORK_API_EXTENSIONS:-"all"}
|
||||
iniset $TEMPEST_CONFIG network-feature-disabled api_extensions ${DISABLE_NETWORK_API_EXTENSIONS}
|
||||
DEFAULT_NET_EXT="agent, allowed-address-pairs, binding, dhcp_agent_scheduler, dvr, ext-gw-mode, external-net, extra_dhcp_opt"
|
||||
DEFAULT_NET_EXT+=", extraroute, fwaas, l3-ha, l3_agent_scheduler, lbaas, lbaas_agent_scheduler, metering"
|
||||
DEFAULT_NET_EXT+=", multi-provider, provider, quotas, router, security-group, service-type, vpnaas"
|
||||
iniset $TEMPEST_CONFIG network-feature-enabled api_extensions "${NETWORK_API_EXTENSIONS:-$DEFAULT_NET_EXT}"
|
||||
iniset $TEMPEST_CONFIG network-feature-disabled api_extensions "${DISABLE_NETWORK_API_EXTENSIONS}"
|
||||
iniset $TEMPEST_CONFIG network-feature-enabled xml_api True
|
||||
|
||||
# boto
|
||||
iniset $TEMPEST_CONFIG boto ec2_url "$EC2_SERVICE_PROTOCOL://$SERVICE_HOST:8773/services/Cloud"
|
||||
iniset $TEMPEST_CONFIG boto s3_url "http://$SERVICE_HOST:${S3_SERVICE_PORT:-3333}"
|
||||
iniset $TEMPEST_CONFIG boto s3_materials_path "$BOTO_MATERIALS_PATH"
|
||||
iniset $TEMPEST_CONFIG boto ari_manifest cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-initrd.manifest.xml
|
||||
iniset $TEMPEST_CONFIG boto ami_manifest cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-blank.img.manifest.xml
|
||||
iniset $TEMPEST_CONFIG boto aki_manifest cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-vmlinuz.manifest.xml
|
||||
iniset $TEMPEST_CONFIG boto instance_type "$boto_instance_type"
|
||||
iniset $TEMPEST_CONFIG boto http_socket_timeout 30
|
||||
iniset $TEMPEST_CONFIG boto ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
|
||||
# boto - disabled
|
||||
#
|
||||
# because of compat issues boto in icehouse is not testable
|
||||
# against tempest. Set FORCE_BOTO=1 in local.conf to enable.
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled ec2_api False
|
||||
if [[ -n "$FORCE_BOTO" ]]; then
|
||||
iniset $TEMPEST_CONFIG boto ec2_url "$EC2_SERVICE_PROTOCOL://$SERVICE_HOST:8773/services/Cloud"
|
||||
iniset $TEMPEST_CONFIG boto s3_url "http://$SERVICE_HOST:${S3_SERVICE_PORT:-3333}"
|
||||
iniset $TEMPEST_CONFIG boto s3_materials_path "$BOTO_MATERIALS_PATH"
|
||||
iniset $TEMPEST_CONFIG boto ari_manifest cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-initrd.manifest.xml
|
||||
iniset $TEMPEST_CONFIG boto ami_manifest cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-blank.img.manifest.xml
|
||||
iniset $TEMPEST_CONFIG boto aki_manifest cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-vmlinuz.manifest.xml
|
||||
iniset $TEMPEST_CONFIG boto instance_type "$boto_instance_type"
|
||||
iniset $TEMPEST_CONFIG boto http_socket_timeout 30
|
||||
iniset $TEMPEST_CONFIG boto ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
|
||||
iniset $TEMPEST_CONFIG compute-feature-enabled ec2_api True
|
||||
fi
|
||||
|
||||
# Orchestration Tests
|
||||
if is_service_enabled heat; then
|
||||
@@ -353,12 +400,21 @@ function configure_tempest {
|
||||
iniset $TEMPEST_CONFIG telemetry too_slow_to_test "False"
|
||||
|
||||
# Object storage
|
||||
iniset $TEMPEST_CONFIG object-storage-feature-enabled discoverable_apis ${OBJECT_STORAGE_API_EXTENSIONS:-"all"}
|
||||
iniset $TEMPEST_CONFIG object-storage-feature-disabled discoverable_apis ${OBJECT_STORAGE_DISABLE_API_EXTENSIONS}
|
||||
DEFAULT_SWIFT_OPT="account_quotas, bulk_delete, bulk_upload, container_quotas, container_sync, crossdomain, formpost"
|
||||
DEFAULT_SWIFT_OPT+=", keystoneauth, ratelimit, slo, staticweb, tempauth, tempurl"
|
||||
iniset $TEMPEST_CONFIG object-storage-feature-enabled discoverable_apis "${OBJECT_STORAGE_API_EXTENSIONS:-$DEFAULT_SWIFT_OPT}"
|
||||
iniset $TEMPEST_CONFIG object-storage-feature-disabled discoverable_apis "${OBJECT_STORAGE_DISABLE_API_EXTENSIONS}"
|
||||
|
||||
# Volume
|
||||
iniset $TEMPEST_CONFIG volume-feature-enabled api_extensions ${VOLUME_API_EXTENSIONS:-"all"}
|
||||
iniset $TEMPEST_CONFIG volume-feature-disabled api_extensions ${DISABLE_VOLUME_API_EXTENSIONS}
|
||||
DEFAULT_VOL_EXT="OS-SCH-HNT, backups, cgsnapshots, consistencygroups, encryption, os-admin-actions, os-availability-zone"
|
||||
DEFAULT_VOL_EXT+=", os-extended-services, os-extended-snapshot-attributes, os-hosts, os-image-create"
|
||||
DEFAULT_VOL_EXT+=", os-quota-class-sets, os-quota-sets, os-services, os-snapshot-actions, os-types-extra-specs"
|
||||
DEFAULT_VOL_EXT+=", os-types-manage, os-used-limits, os-vol-host-attr, os-vol-image-meta"
|
||||
DEFAULT_VOL_EXT+=", os-vol-mig-status-attr, os-vol-tenant-attr, os-volume-actions, os-volume-encryption-metadata"
|
||||
DEFAULT_VOL_EXT+=", os-volume-manage, os-volume-replication, os-volume-transfer, os-volume-unmanage, qos-specs"
|
||||
DEFAULT_VOL_EXT+=", scheduler-stats"
|
||||
iniset $TEMPEST_CONFIG volume-feature-enabled api_extensions "${VOLUME_API_EXTENSIONS:-$DEFAULT_VOL_EXT}"
|
||||
iniset $TEMPEST_CONFIG volume-feature-disabled api_extensions "${DISABLE_VOLUME_API_EXTENSIONS}"
|
||||
if ! is_service_enabled c-bak; then
|
||||
iniset $TEMPEST_CONFIG volume-feature-enabled backup False
|
||||
fi
|
||||
@@ -428,8 +484,10 @@ function create_tempest_accounts {
|
||||
|
||||
# install_tempest_lib() - Collect source, prepare, and install tempest-lib
|
||||
function install_tempest_lib {
|
||||
git_clone $TEMPEST_LIB_REPO $TEMPEST_LIB_DIR $TEMPEST_LIB_BRANCH
|
||||
setup_develop $TEMPEST_LIB_DIR
|
||||
if use_library_from_git "tempest-lib"; then
|
||||
git_clone_by_name "tempest-lib"
|
||||
setup_dev_lib "tempest-lib"
|
||||
fi
|
||||
}
|
||||
|
||||
# install_tempest() - Collect source and prepare
|
||||
@@ -447,20 +505,22 @@ function init_tempest {
|
||||
local kernel="$image_dir/${base_image_name}-vmlinuz"
|
||||
local ramdisk="$image_dir/${base_image_name}-initrd"
|
||||
local disk_image="$image_dir/${base_image_name}-blank.img"
|
||||
# if the cirros uec downloaded and the system is uec capable
|
||||
if [ -f "$kernel" -a -f "$ramdisk" -a -f "$disk_image" -a "$VIRT_DRIVER" != "openvz" \
|
||||
-a \( "$LIBVIRT_TYPE" != "lxc" -o "$VIRT_DRIVER" != "libvirt" \) ]; then
|
||||
echo "Prepare aki/ari/ami Images"
|
||||
mkdir -p $BOTO_MATERIALS_PATH
|
||||
( #new namespace
|
||||
# tenant:demo ; user: demo
|
||||
source $TOP_DIR/accrc/demo/demo
|
||||
euca-bundle-image -r ${CIRROS_ARCH} -i "$kernel" --kernel true -d "$BOTO_MATERIALS_PATH"
|
||||
euca-bundle-image -r ${CIRROS_ARCH} -i "$ramdisk" --ramdisk true -d "$BOTO_MATERIALS_PATH"
|
||||
euca-bundle-image -r ${CIRROS_ARCH} -i "$disk_image" -d "$BOTO_MATERIALS_PATH"
|
||||
) 2>&1 </dev/null | cat
|
||||
else
|
||||
echo "Boto materials are not prepared"
|
||||
if is_service_enabled nova; then
|
||||
# if the cirros uec downloaded and the system is uec capable
|
||||
if [ -f "$kernel" -a -f "$ramdisk" -a -f "$disk_image" -a "$VIRT_DRIVER" != "openvz" \
|
||||
-a \( "$LIBVIRT_TYPE" != "lxc" -o "$VIRT_DRIVER" != "libvirt" \) ]; then
|
||||
echo "Prepare aki/ari/ami Images"
|
||||
mkdir -p $BOTO_MATERIALS_PATH
|
||||
( #new namespace
|
||||
# tenant:demo ; user: demo
|
||||
source $TOP_DIR/accrc/demo/demo
|
||||
euca-bundle-image -r ${CIRROS_ARCH} -i "$kernel" --kernel true -d "$BOTO_MATERIALS_PATH"
|
||||
euca-bundle-image -r ${CIRROS_ARCH} -i "$ramdisk" --ramdisk true -d "$BOTO_MATERIALS_PATH"
|
||||
euca-bundle-image -r ${CIRROS_ARCH} -i "$disk_image" -d "$BOTO_MATERIALS_PATH"
|
||||
) 2>&1 </dev/null | cat
|
||||
else
|
||||
echo "Boto materials are not prepared"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -28,8 +28,9 @@ else
|
||||
fi
|
||||
|
||||
# Set up default configuration
|
||||
GITDIR["python-troveclient"]=$DEST/python-troveclient
|
||||
|
||||
TROVE_DIR=$DEST/trove
|
||||
TROVECLIENT_DIR=$DEST/python-troveclient
|
||||
TROVE_CONF_DIR=/etc/trove
|
||||
TROVE_LOCAL_CONF_DIR=$TROVE_DIR/etc/trove
|
||||
TROVE_AUTH_CACHE_DIR=${TROVE_AUTH_CACHE_DIR:-/var/cache/trove}
|
||||
@@ -109,10 +110,6 @@ function cleanup_trove {
|
||||
rm -fr $TROVE_CONF_DIR/*
|
||||
}
|
||||
|
||||
# configure_troveclient() - Set config files, create data dirs, etc
|
||||
function configure_troveclient {
|
||||
setup_develop $TROVECLIENT_DIR
|
||||
}
|
||||
|
||||
# configure_trove() - Set config files, create data dirs, etc
|
||||
function configure_trove {
|
||||
@@ -184,7 +181,10 @@ function configure_trove {
|
||||
|
||||
# install_troveclient() - Collect source and prepare
|
||||
function install_troveclient {
|
||||
git_clone $TROVECLIENT_REPO $TROVECLIENT_DIR $TROVECLIENT_BRANCH
|
||||
if use_library_from_git "python-troveclient"; then
|
||||
git_clone_by_name "python-troveclient"
|
||||
setup_dev_lib "python-troveclient"
|
||||
fi
|
||||
}
|
||||
|
||||
# install_trove() - Collect source and prepare
|
||||
|
||||
@@ -48,7 +48,7 @@ ZAQAR_BACKEND=${ZAQAR_BACKEND:-mongodb}
|
||||
|
||||
# Set Zaqar repository
|
||||
ZAQAR_REPO=${ZAQAR_REPO:-${GIT_BASE}/openstack/zaqar.git}
|
||||
ZAQAR_BRANCH=${ZAQAR_BRANCH:-master}
|
||||
ZAQAR_BRANCH=${ZAQAR_BRANCH:-stable/juno}
|
||||
|
||||
# Set client library repository
|
||||
ZAQARCLIENT_REPO=${ZAQARCLIENT_REPO:-${GIT_BASE}/openstack/python-zaqarclient.git}
|
||||
|
||||
+9
-38
@@ -18,47 +18,18 @@
|
||||
PASSES=""
|
||||
FAILURES=""
|
||||
|
||||
# Check the return code and add the test to PASSES or FAILURES as appropriate
|
||||
# pass_fail <result> <expected> <name>
|
||||
function pass_fail {
|
||||
local result=$1
|
||||
local expected=$2
|
||||
local test_name=$3
|
||||
|
||||
if [[ $result -ne $expected ]]; then
|
||||
FAILURES="$FAILURES $test_name"
|
||||
else
|
||||
PASSES="$PASSES $test_name"
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ -n $@ ]]; then
|
||||
FILES=$@
|
||||
else
|
||||
LIBS=`find lib -type f | grep -v \.md`
|
||||
SCRIPTS=`find . -type f -name \*\.sh`
|
||||
EXTRA="functions functions-common stackrc openrc exerciserc eucarc"
|
||||
FILES="$SCRIPTS $LIBS $EXTRA"
|
||||
fi
|
||||
|
||||
echo "Running bash8..."
|
||||
|
||||
./tools/bash8.py -v $FILES
|
||||
pass_fail $? 0 bash8
|
||||
|
||||
|
||||
# Test that no one is trying to land crazy refs as branches
|
||||
|
||||
echo "Ensuring we don't have crazy refs"
|
||||
|
||||
REFS=`grep BRANCH stackrc | grep -v -- '-master'`
|
||||
rc=$?
|
||||
pass_fail $rc 1 crazy-refs
|
||||
if [[ $rc -eq 0 ]]; then
|
||||
echo "Branch defaults must be master. Found:"
|
||||
echo $REFS
|
||||
fi
|
||||
for testfile in tests/test_*.sh; do
|
||||
$testfile
|
||||
if [[ $? -eq 0 ]]; then
|
||||
PASSES="$PASSES $testfile"
|
||||
else
|
||||
FAILURES="$FAILURES $testfile"
|
||||
fi
|
||||
done
|
||||
|
||||
# Summary display now that all is said and done
|
||||
echo "====================================================================="
|
||||
for script in $PASSES; do
|
||||
echo PASS $script
|
||||
|
||||
@@ -215,7 +215,7 @@ fi
|
||||
# image was created (fix in the works). Remove all pip packages
|
||||
# before we do anything else
|
||||
if [[ $DISTRO = "rhel7" && is_rackspace ]]; then
|
||||
(sudo pip freeze | xargs sudo pip uninstall -y) || true
|
||||
(sudo -H pip freeze | xargs sudo -H pip uninstall -y) || true
|
||||
fi
|
||||
|
||||
# Some distros need to add repos beyond the defaults provided by the vendor
|
||||
@@ -579,9 +579,6 @@ if [[ -d $TOP_DIR/extras.d ]]; then
|
||||
done
|
||||
fi
|
||||
|
||||
# Set the destination directories for other OpenStack projects
|
||||
OPENSTACKCLIENT_DIR=$DEST/python-openstackclient
|
||||
|
||||
# Interactive Configuration
|
||||
# -------------------------
|
||||
|
||||
@@ -783,9 +780,6 @@ fi
|
||||
# Install middleware
|
||||
install_keystonemiddleware
|
||||
|
||||
git_clone $OPENSTACKCLIENT_REPO $OPENSTACKCLIENT_DIR $OPENSTACKCLIENT_BRANCH
|
||||
setup_develop $OPENSTACKCLIENT_DIR
|
||||
|
||||
if is_service_enabled key; then
|
||||
if [ "$KEYSTONE_AUTH_HOST" == "$SERVICE_HOST" ]; then
|
||||
install_keystone
|
||||
@@ -859,7 +853,6 @@ if is_service_enabled tls-proxy || [ "$USE_SSL" == "True" ]; then
|
||||
# don't be naive and add to existing line!
|
||||
fi
|
||||
|
||||
|
||||
# Extras Install
|
||||
# --------------
|
||||
|
||||
@@ -870,6 +863,31 @@ if [[ -d $TOP_DIR/extras.d ]]; then
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# NOTE(mriedem): This is an unfortunate hack to workaround a problem with
|
||||
# uncapped requirements for python-novaclient in python-openstackclient 1.0.1
|
||||
# such that it pulls in the latest python-novaclient if something hasn't
|
||||
# already pulled in novaclient (like cinder) at a version that osc in juno will
|
||||
# accept. The large-ops job doesn't install cinder (since it uses the fake
|
||||
# nova virt driver) so osc is the first thing to install novaclient which
|
||||
# then causes a wedge due to capped novaclient in other juno projects.
|
||||
# So if we're running the large-ops job (per using the nova fake virt driver),
|
||||
# install novaclient per the g-r caps for stable/juno so osc doesn't pull in
|
||||
# the latest novaclient and wedge everything.
|
||||
if [[ "$VIRT_DRIVER" = 'fake' ]]; then
|
||||
pip_install_gr python-novaclient
|
||||
fi
|
||||
|
||||
|
||||
# install the OpenStack client, needed for most setup commands
|
||||
if use_library_from_git "python-openstackclient"; then
|
||||
git_clone_by_name "python-openstackclient"
|
||||
setup_dev_lib "python-openstackclient"
|
||||
else
|
||||
pip_install_gr python-openstackclient
|
||||
fi
|
||||
|
||||
|
||||
if [[ $TRACK_DEPENDS = True ]]; then
|
||||
$DEST/.venv/bin/pip freeze > $DEST/requires-post-pip
|
||||
if ! diff -Nru $DEST/requires-pre-pip $DEST/requires-post-pip > $DEST/requires.diff; then
|
||||
|
||||
@@ -131,47 +131,51 @@ GIT_BASE=${GIT_BASE:-git://git.openstack.org}
|
||||
|
||||
# metering service
|
||||
CEILOMETER_REPO=${CEILOMETER_REPO:-${GIT_BASE}/openstack/ceilometer.git}
|
||||
CEILOMETER_BRANCH=${CEILOMETER_BRANCH:-master}
|
||||
CEILOMETER_BRANCH=${CEILOMETER_BRANCH:-stable/juno}
|
||||
|
||||
# volume service
|
||||
# block storage service
|
||||
CINDER_REPO=${CINDER_REPO:-${GIT_BASE}/openstack/cinder.git}
|
||||
CINDER_BRANCH=${CINDER_BRANCH:-master}
|
||||
CINDER_BRANCH=${CINDER_BRANCH:-stable/juno}
|
||||
|
||||
# image catalog service
|
||||
GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git}
|
||||
GLANCE_BRANCH=${GLANCE_BRANCH:-master}
|
||||
GLANCE_BRANCH=${GLANCE_BRANCH:-stable/juno}
|
||||
|
||||
# heat service
|
||||
HEAT_REPO=${HEAT_REPO:-${GIT_BASE}/openstack/heat.git}
|
||||
HEAT_BRANCH=${HEAT_BRANCH:-master}
|
||||
HEAT_BRANCH=${HEAT_BRANCH:-stable/juno}
|
||||
|
||||
# django powered web control panel for openstack
|
||||
HORIZON_REPO=${HORIZON_REPO:-${GIT_BASE}/openstack/horizon.git}
|
||||
HORIZON_BRANCH=${HORIZON_BRANCH:-master}
|
||||
HORIZON_BRANCH=${HORIZON_BRANCH:-stable/juno}
|
||||
|
||||
# baremetal provisioning service
|
||||
IRONIC_REPO=${IRONIC_REPO:-${GIT_BASE}/openstack/ironic.git}
|
||||
IRONIC_BRANCH=${IRONIC_BRANCH:-master}
|
||||
IRONIC_BRANCH=${IRONIC_BRANCH:-stable/juno}
|
||||
|
||||
# unified auth system (manages accounts/tokens)
|
||||
KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git}
|
||||
KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-master}
|
||||
KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-stable/juno}
|
||||
|
||||
# neutron service
|
||||
NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
|
||||
NEUTRON_BRANCH=${NEUTRON_BRANCH:-master}
|
||||
NEUTRON_BRANCH=${NEUTRON_BRANCH:-stable/juno}
|
||||
|
||||
# compute service
|
||||
NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git}
|
||||
NOVA_BRANCH=${NOVA_BRANCH:-master}
|
||||
NOVA_BRANCH=${NOVA_BRANCH:-stable/juno}
|
||||
|
||||
# storage service
|
||||
# data processing service
|
||||
SAHARA_REPO=${SAHARA_REPO:-${GIT_BASE}/openstack/sahara.git}
|
||||
SAHARA_BRANCH=${SAHARA_BRANCH:-stable/juno}
|
||||
|
||||
# object storage service
|
||||
SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
|
||||
SWIFT_BRANCH=${SWIFT_BRANCH:-master}
|
||||
SWIFT_BRANCH=${SWIFT_BRANCH:-stable/juno}
|
||||
|
||||
# trove service
|
||||
TROVE_REPO=${TROVE_REPO:-${GIT_BASE}/openstack/trove.git}
|
||||
TROVE_BRANCH=${TROVE_BRANCH:-master}
|
||||
TROVE_BRANCH=${TROVE_BRANCH:-stable/juno}
|
||||
|
||||
##############
|
||||
#
|
||||
@@ -181,15 +185,15 @@ TROVE_BRANCH=${TROVE_BRANCH:-master}
|
||||
|
||||
# consolidated openstack requirements
|
||||
REQUIREMENTS_REPO=${REQUIREMENTS_REPO:-${GIT_BASE}/openstack/requirements.git}
|
||||
REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-master}
|
||||
REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-stable/juno}
|
||||
|
||||
# Tempest test suite
|
||||
TEMPEST_REPO=${TEMPEST_REPO:-${GIT_BASE}/openstack/tempest.git}
|
||||
TEMPEST_BRANCH=${TEMPEST_BRANCH:-master}
|
||||
|
||||
# TODO(sdague): this should end up as a library component like below
|
||||
TEMPEST_LIB_REPO=${TEMPEST_LIB_REPO:-${GIT_BASE}/openstack/tempest-lib.git}
|
||||
TEMPEST_LIB_BRANCH=${TEMPEST_LIB_BRANCH:-master}
|
||||
GITREPO["tempest-lib"]=${TEMPEST_LIB_REPO:-${GIT_BASE}/openstack/tempest-lib.git}
|
||||
GITBRANCH["tempest-lib"]=${TEMPEST_LIB_BRANCH:-master}
|
||||
|
||||
|
||||
##############
|
||||
@@ -199,48 +203,54 @@ TEMPEST_LIB_BRANCH=${TEMPEST_LIB_BRANCH:-master}
|
||||
##############
|
||||
|
||||
# ceilometer client library
|
||||
CEILOMETERCLIENT_REPO=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git}
|
||||
CEILOMETERCLIENT_BRANCH=${CEILOMETERCLIENT_BRANCH:-master}
|
||||
GITREPO["python-ceilometerclient"]=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git}
|
||||
GITBRANCH["python-ceilometerclient"]=${CEILOMETERCLIENT_BRANCH:-master}
|
||||
|
||||
# volume client
|
||||
CINDERCLIENT_REPO=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git}
|
||||
CINDERCLIENT_BRANCH=${CINDERCLIENT_BRANCH:-master}
|
||||
GITREPO["python-cinderclient"]=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git}
|
||||
GITBRANCH["python-cinderclient"]=${CINDERCLIENT_BRANCH:-master}
|
||||
|
||||
# python glance client library
|
||||
GLANCECLIENT_REPO=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git}
|
||||
GLANCECLIENT_BRANCH=${GLANCECLIENT_BRANCH:-master}
|
||||
GITREPO["python-glanceclient"]=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git}
|
||||
GITBRANCH["python-glanceclient"]=${GLANCECLIENT_BRANCH:-master}
|
||||
|
||||
# python heat client library
|
||||
HEATCLIENT_REPO=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git}
|
||||
HEATCLIENT_BRANCH=${HEATCLIENT_BRANCH:-master}
|
||||
GITREPO["python-heatclient"]=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git}
|
||||
GITBRANCH["python-heatclient"]=${HEATCLIENT_BRANCH:-master}
|
||||
|
||||
# ironic client
|
||||
IRONICCLIENT_REPO=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git}
|
||||
IRONICCLIENT_BRANCH=${IRONICCLIENT_BRANCH:-master}
|
||||
GITREPO["python-ironicclient"]=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git}
|
||||
GITBRANCH["python-ironicclient"]=${IRONICCLIENT_BRANCH:-master}
|
||||
|
||||
# python keystone client library to nova that horizon uses
|
||||
KEYSTONECLIENT_REPO=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git}
|
||||
KEYSTONECLIENT_BRANCH=${KEYSTONECLIENT_BRANCH:-master}
|
||||
GITREPO["python-keystoneclient"]=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git}
|
||||
GITBRANCH["python-keystoneclient"]=${KEYSTONECLIENT_BRANCH:-master}
|
||||
|
||||
# neutron client
|
||||
NEUTRONCLIENT_REPO=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git}
|
||||
NEUTRONCLIENT_BRANCH=${NEUTRONCLIENT_BRANCH:-master}
|
||||
GITREPO["python-neutronclient"]=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git}
|
||||
GITBRANCH["python-neutronclient"]=${NEUTRONCLIENT_BRANCH:-master}
|
||||
|
||||
# python client library to nova that horizon (and others) use
|
||||
NOVACLIENT_REPO=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git}
|
||||
NOVACLIENT_BRANCH=${NOVACLIENT_BRANCH:-master}
|
||||
GITREPO["python-novaclient"]=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git}
|
||||
GITBRANCH["python-novaclient"]=${NOVACLIENT_BRANCH:-master}
|
||||
|
||||
# python saharaclient
|
||||
GITREPO["python-saharaclient"]=${SAHARACLIENT_REPO:-${GIT_BASE}/openstack/python-saharaclient.git}
|
||||
GITBRANCH["python-saharaclient"]=${SAHARACLIENT_BRANCH:-master}
|
||||
|
||||
# python swift client library
|
||||
SWIFTCLIENT_REPO=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git}
|
||||
SWIFTCLIENT_BRANCH=${SWIFTCLIENT_BRANCH:-master}
|
||||
GITREPO["python-swiftclient"]=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git}
|
||||
GITBRANCH["python-swiftclient"]=${SWIFTCLIENT_BRANCH:-master}
|
||||
|
||||
# trove client library test
|
||||
TROVECLIENT_REPO=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git}
|
||||
TROVECLIENT_BRANCH=${TROVECLIENT_BRANCH:-master}
|
||||
GITREPO["python-troveclient"]=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git}
|
||||
GITBRANCH["python-troveclient"]=${TROVECLIENT_BRANCH:-master}
|
||||
|
||||
# consolidated openstack python client
|
||||
OPENSTACKCLIENT_REPO=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git}
|
||||
OPENSTACKCLIENT_BRANCH=${OPENSTACKCLIENT_BRANCH:-master}
|
||||
GITREPO["python-openstackclient"]=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git}
|
||||
GITBRANCH["python-openstackclient"]=${OPENSTACKCLIENT_BRANCH:-master}
|
||||
# this doesn't exist in a lib file, so set it here
|
||||
GITDIR["python-openstackclient"]=$DEST/python-openstackclient
|
||||
|
||||
###################
|
||||
#
|
||||
@@ -268,10 +278,6 @@ GITBRANCH["oslo.db"]=${OSLODB_BRANCH:-master}
|
||||
GITREPO["oslo.i18n"]=${OSLOI18N_REPO:-${GIT_BASE}/openstack/oslo.i18n.git}
|
||||
GITBRANCH["oslo.i18n"]=${OSLOI18N_BRANCH:-master}
|
||||
|
||||
# oslo.log
|
||||
GITREPO["oslo.log"]=${OSLOLOG_REPO:-${GIT_BASE}/openstack/oslo.log.git}
|
||||
GITBRANCH["oslo.log"]=${OSLOLOG_BRANCH:-master}
|
||||
|
||||
# oslo.messaging
|
||||
GITREPO["oslo.messaging"]=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
|
||||
GITBRANCH["oslo.messaging"]=${OSLOMSG_BRANCH:-master}
|
||||
@@ -319,8 +325,8 @@ GITBRANCH["pbr"]=${PBR_BRANCH:-master}
|
||||
##################
|
||||
|
||||
# glance store library
|
||||
GLANCE_STORE_REPO=${GLANCE_STORE_REPO:-${GIT_BASE}/openstack/glance_store.git}
|
||||
GLANCE_STORE_BRANCH=${GLANCE_STORE_BRANCH:-master}
|
||||
GITREPO["glance_store"]=${GLANCE_STORE_REPO:-${GIT_BASE}/openstack/glance_store.git}
|
||||
GITBRANCH["glance_store"]=${GLANCE_STORE_BRANCH:-master}
|
||||
|
||||
# heat-cfntools server agent
|
||||
HEAT_CFNTOOLS_REPO=${HEAT_CFNTOOLS_REPO:-${GIT_BASE}/openstack/heat-cfntools.git}
|
||||
@@ -331,12 +337,12 @@ HEAT_TEMPLATES_REPO=${HEAT_TEMPLATES_REPO:-${GIT_BASE}/openstack/heat-templates.
|
||||
HEAT_TEMPLATES_BRANCH=${HEAT_TEMPLATES_BRANCH:-master}
|
||||
|
||||
# django openstack_auth library
|
||||
HORIZONAUTH_REPO=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/django_openstack_auth.git}
|
||||
HORIZONAUTH_BRANCH=${HORIZONAUTH_BRANCH:-master}
|
||||
GITREPO["django_openstack_auth"]=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/django_openstack_auth.git}
|
||||
GITBRANCH["django_openstack_auth"]=${HORIZONAUTH_BRANCH:-master}
|
||||
|
||||
# keystone middleware
|
||||
KEYSTONEMIDDLEWARE_REPO=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git}
|
||||
KEYSTONEMIDDLEWARE_BRANCH=${KEYSTONEMIDDLEWARE_BRANCH:-master}
|
||||
GITREPO["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git}
|
||||
GITBRANCH["keystonemiddleware"]=${KEYSTONEMIDDLEWARE_BRANCH:-master}
|
||||
|
||||
# s3 support for swift
|
||||
SWIFT3_REPO=${SWIFT3_REPO:-${GIT_BASE}/stackforge/swift3.git}
|
||||
@@ -469,7 +475,7 @@ esac
|
||||
#IMAGE_URLS="http://smoser.brickies.net/ubuntu/ttylinux-uec/ttylinux-uec-amd64-11.2_2.6.35-15_1.tar.gz" # old ttylinux-uec image
|
||||
#IMAGE_URLS="http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-disk.img" # cirros full disk image
|
||||
|
||||
CIRROS_VERSION=${CIRROS_VERSION:-"0.3.2"}
|
||||
CIRROS_VERSION=${CIRROS_VERSION:-"0.3.4"}
|
||||
CIRROS_ARCH=${CIRROS_ARCH:-"x86_64"}
|
||||
|
||||
# Set default image based on ``VIRT_DRIVER`` and ``LIBVIRT_TYPE``, either of
|
||||
@@ -514,7 +520,7 @@ esac
|
||||
if [[ "$ENABLED_SERVICES" =~ 'h-api' ]]; then
|
||||
case "$VIRT_DRIVER" in
|
||||
libvirt|baremetal|ironic)
|
||||
HEAT_CFN_IMAGE_URL=${HEAT_CFN_IMAGE_URL:-"http://dl.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"}
|
||||
HEAT_CFN_IMAGE_URL=${HEAT_CFN_IMAGE_URL:-"https://download.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"}
|
||||
IMAGE_URLS+=",$HEAT_CFN_IMAGE_URL"
|
||||
;;
|
||||
*)
|
||||
@@ -539,7 +545,7 @@ fi
|
||||
PRECACHE_IMAGES=$(trueorfalse False $PRECACHE_IMAGES)
|
||||
if [[ "$PRECACHE_IMAGES" == "True" ]]; then
|
||||
# staging in update for nodepool
|
||||
IMAGE_URL="http://dl.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"
|
||||
IMAGE_URL="https://download.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"
|
||||
if ! [[ "$IMAGE_URLS" =~ "$IMAGE_URL" ]]; then
|
||||
IMAGE_URLS+=",$IMAGE_URL"
|
||||
fi
|
||||
|
||||
+21
-12
@@ -92,9 +92,9 @@ attribute=value
|
||||
[fff]
|
||||
type=new
|
||||
|
||||
[[test-quote|test-quote.conf]]
|
||||
[[test-env|test-env.conf]]
|
||||
[foo]
|
||||
foo="foo bar" "baz"
|
||||
foo=\${FOO_BAR_BAZ}
|
||||
|
||||
[[test5|test-equals.conf]]
|
||||
[DEFAULT]
|
||||
@@ -126,9 +126,11 @@ cfg_item5 = 5555another
|
||||
|
||||
[[test-multiline|test-multiline.conf]]
|
||||
[multi]
|
||||
cfg_item1 = "ab":"cd", "ef": "gh"
|
||||
cfg_item1 = ab:cd:ef:gh
|
||||
cfg_item1 = abcd
|
||||
cfg_item2 = efgh
|
||||
cfg_item2 = \${FOO_BAR_BAZ}
|
||||
|
||||
EOF
|
||||
|
||||
echo -n "get_meta_section_files: test0 doesn't exist: "
|
||||
@@ -236,14 +238,17 @@ check_result "$VAL" "$EXPECT_VAL"
|
||||
|
||||
echo -n "merge_config_file test-multiline: "
|
||||
rm -f test-multiline.conf
|
||||
FOO_BAR_BAZ="foo bar baz"
|
||||
merge_config_file test.conf test-multiline test-multiline.conf
|
||||
VAL=$(cat test-multiline.conf)
|
||||
EXPECT_VAL='
|
||||
[multi]
|
||||
cfg_item1 = "ab":"cd", "ef": "gh"
|
||||
cfg_item1 = ab:cd:ef:gh
|
||||
cfg_item1 = abcd
|
||||
cfg_item2 = efgh'
|
||||
cfg_item2 = efgh
|
||||
cfg_item2 = foo bar baz'
|
||||
check_result "$VAL" "$EXPECT_VAL"
|
||||
unset FOO_BAR_BAZ
|
||||
|
||||
echo -n "merge_config_group test2: "
|
||||
rm test2a.conf
|
||||
@@ -275,14 +280,16 @@ EXPECT_VAL="
|
||||
attribute = value"
|
||||
check_result "$VAL" "$EXPECT_VAL"
|
||||
|
||||
echo -n "merge_config_file test-quote: "
|
||||
rm -f test-quote.conf
|
||||
merge_config_file test.conf test-quote test-quote.conf
|
||||
VAL=$(cat test-quote.conf)
|
||||
echo -n "merge_config_file test-env: "
|
||||
rm -f test-env.conf
|
||||
FOO_BAR_BAZ="foo bar baz"
|
||||
merge_config_file test.conf test-env test-env.conf
|
||||
VAL=$(cat test-env.conf)
|
||||
EXPECT_VAL='
|
||||
[foo]
|
||||
foo = "foo bar" "baz"'
|
||||
foo = foo bar baz'
|
||||
check_result "$VAL" "$EXPECT_VAL"
|
||||
unset FOO_BAR_BAZ
|
||||
|
||||
echo -n "merge_config_group test4 variable filename: "
|
||||
setup_test4
|
||||
@@ -332,6 +339,8 @@ EXPECT_VAL="
|
||||
servers = 10.11.12.13:80"
|
||||
check_result "$VAL" "$EXPECT_VAL"
|
||||
|
||||
rm -f test.conf test1c.conf test2a.conf test-quote.conf test-space.conf test-equals.conf test-strip.conf test-colon.conf
|
||||
rm -f test-multiline.conf test-multi-sections.conf
|
||||
rm -f test.conf test1c.conf test2a.conf \
|
||||
test-space.conf test-equals.conf test-strip.conf \
|
||||
test-colon.conf test-env.conf test-multiline.conf \
|
||||
test-multi-sections.conf
|
||||
rm -rf test-etc
|
||||
|
||||
Executable
+97
@@ -0,0 +1,97 @@
|
||||
#!/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.
|
||||
|
||||
|
||||
TOP=$(cd $(dirname "$0")/.. && pwd)
|
||||
|
||||
export TOP_DIR=$TOP
|
||||
|
||||
# Import common functions
|
||||
source $TOP/functions
|
||||
source $TOP/stackrc
|
||||
source $TOP/lib/tls
|
||||
for i in $TOP/lib/*; do
|
||||
if [[ -f $i ]]; then
|
||||
source $i
|
||||
fi
|
||||
done
|
||||
|
||||
ALL_LIBS="python-novaclient oslo.config pbr python-troveclient python-keystoneclient taskflow oslo.middleware pycadf python-glanceclient python-ironicclient tempest-lib oslo.messaging cliff python-heatclient stevedore python-cinderclient glance_store oslo.concurrency oslo.db oslo.vmware keystonemiddleware oslo.serialization python-saharaclient django_openstack_auth python-openstackclient oslo.rootwrap oslo.i18n python-ceilometerclient oslo.utils python-swiftclient python-neutronclient"
|
||||
|
||||
# Generate the above list with
|
||||
# echo ${!GITREPO[@]}
|
||||
# exit 1
|
||||
|
||||
function check_exists {
|
||||
local thing=$1
|
||||
local hash=$2
|
||||
local key=$3
|
||||
if [[ ! -z "$VERBOSE" ]]; then
|
||||
echo "Checking for $hash[$key]"
|
||||
fi
|
||||
if [[ -z $thing ]]; then
|
||||
echo "$hash[$key] does not exit!"
|
||||
exit 1
|
||||
else
|
||||
if [[ ! -z "$VERBOSE" ]]; then
|
||||
echo "$hash[$key] => $thing"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function test_all_libs_upto_date {
|
||||
# this is all the magics
|
||||
local found_libs=${!GITREPO[@]}
|
||||
declare -A all_libs
|
||||
for lib in $ALL_LIBS; do
|
||||
all_libs[$lib]=1
|
||||
done
|
||||
|
||||
for lib in $found_libs; do
|
||||
if [[ -z ${all_libs[$lib]} ]]; then
|
||||
echo "Library '$lib' not listed in unit tests, please add to ALL_LIBS"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
done
|
||||
echo "test_all_libs_upto_date PASSED"
|
||||
}
|
||||
|
||||
function test_libs_exist {
|
||||
local lib=""
|
||||
for lib in $ALL_LIBS; do
|
||||
check_exists "${GITREPO[$lib]}" "GITREPO" "$lib"
|
||||
check_exists "${GITBRANCH[$lib]}" "GITBRANCH" "$lib"
|
||||
check_exists "${GITDIR[$lib]}" "GITDIR" "$lib"
|
||||
done
|
||||
|
||||
echo "test_libs_exist PASSED"
|
||||
}
|
||||
|
||||
function test_branch_master {
|
||||
for lib in $ALL_LIBS; do
|
||||
if [[ ${GITBRANCH[$lib]} != "master" ]]; then
|
||||
echo "GITBRANCH for $lib not master (${GITBRANCH[$lib]})"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "test_branch_master PASSED"
|
||||
}
|
||||
|
||||
set -o errexit
|
||||
|
||||
test_libs_exist
|
||||
test_branch_master
|
||||
test_all_libs_upto_date
|
||||
Executable
+24
@@ -0,0 +1,24 @@
|
||||
#!/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.
|
||||
|
||||
|
||||
echo "Ensuring we don't have crazy refs"
|
||||
|
||||
REFS=`grep BRANCH stackrc | grep -v -- '-master' | grep -v -- '-stable/'`
|
||||
rc=$?
|
||||
if [[ $rc -eq 0 ]]; then
|
||||
echo "Branch defaults must be master. Found:"
|
||||
echo $REFS
|
||||
exit 1
|
||||
fi
|
||||
+1
-17
@@ -18,7 +18,6 @@
|
||||
# - (re)start messagebus daemon
|
||||
# - remove distro packages python-crypto and python-lxml
|
||||
# - pre-install hgtools to work around a bug in RHEL6 distribute
|
||||
# - install nose 1.1 from EPEL
|
||||
|
||||
# If TOP_DIR is set we're being sourced rather than running stand-alone
|
||||
# or in a sub-shell
|
||||
@@ -79,7 +78,7 @@ function get_package_path {
|
||||
|
||||
# Fix prettytable 0.7.2 permissions
|
||||
# Don't specify --upgrade so we use the existing package if present
|
||||
pip_install 'prettytable>0.7'
|
||||
pip_install 'prettytable>=0.7'
|
||||
PACKAGE_DIR=$(get_package_path prettytable)
|
||||
# Only fix version 0.7.2
|
||||
dir=$(echo $PACKAGE_DIR/prettytable-0.7.2*)
|
||||
@@ -172,19 +171,4 @@ if [[ $DISTRO =~ (rhel6) ]]; then
|
||||
# Note we do this before the track-depends in ``stack.sh``.
|
||||
pip_install hgtools
|
||||
|
||||
|
||||
# RHEL6's version of ``python-nose`` is incompatible with Tempest.
|
||||
# Install nose 1.1 (Tempest-compatible) from EPEL
|
||||
install_package python-nose1.1
|
||||
# Add a symlink for the new nosetests to allow tox for Tempest to
|
||||
# work unmolested.
|
||||
sudo ln -sf /usr/bin/nosetests1.1 /usr/local/bin/nosetests
|
||||
|
||||
# workaround for https://code.google.com/p/unittest-ext/issues/detail?id=79
|
||||
install_package python-unittest2 patch
|
||||
pip_install discover
|
||||
(cd /usr/lib/python2.6/site-packages/; sudo patch <"$FILES/patches/unittest2-discover.patch" || echo 'Assume already applied')
|
||||
# Make sure the discover.pyc is up to date
|
||||
sudo rm /usr/lib/python2.6/site-packages/discover.pyc || true
|
||||
sudo python -c 'import discover'
|
||||
fi
|
||||
|
||||
@@ -46,7 +46,7 @@ function install_get_pip {
|
||||
curl -o $LOCAL_PIP $PIP_GET_PIP_URL || \
|
||||
die $LINENO "Download of get-pip.py failed"
|
||||
fi
|
||||
sudo -E python $LOCAL_PIP
|
||||
sudo -H -E python $LOCAL_PIP
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,13 @@ function configure_pypi_alternative_url {
|
||||
|
||||
}
|
||||
|
||||
# Setuptools 8 implements PEP 440, and 8.0.4 adds a warning triggered any time
|
||||
# pkg_resources inspects the list of installed Python packages if there are
|
||||
# non-compliant version numbers in the egg-info (for example, from distro
|
||||
# system packaged Python libraries). This is off by default after 8.2 but can
|
||||
# be enabled by uncommenting the lines below.
|
||||
#PYTHONWARNINGS=$PYTHONWARNINGS,always::RuntimeWarning:pkg_resources
|
||||
#export PYTHONWARNINGS
|
||||
|
||||
# Show starting versions
|
||||
get_versions
|
||||
|
||||
@@ -78,8 +78,10 @@ def main():
|
||||
params['emulator'] = "/usr/bin/qemu-kvm"
|
||||
|
||||
if args.console_log:
|
||||
params['bios_serial'] = "<bios useserial='yes'/>"
|
||||
params['console_log'] = CONSOLE_LOG % {'console_log': args.console_log}
|
||||
else:
|
||||
params['bios_serial'] = ''
|
||||
params['console_log'] = ''
|
||||
libvirt_template = source_template % params
|
||||
conn = libvirt.open("qemu:///system")
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<type arch='%(arch)s' machine='pc-1.0'>hvm</type>
|
||||
<boot dev='%(bootdev)s'/>
|
||||
<bootmenu enable='no'/>
|
||||
%(bios_serial)s
|
||||
</os>
|
||||
<features>
|
||||
<acpi/>
|
||||
|
||||
+1
-1
@@ -97,7 +97,7 @@ Of course, use real passwords if this machine is exposed.
|
||||
# Download a vhd and a uec image
|
||||
IMAGE_URLS="\
|
||||
https://github.com/downloads/citrix-openstack/warehouse/cirros-0.3.0-x86_64-disk.vhd.tgz,\
|
||||
http://download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-uec.tar.gz"
|
||||
http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-uec.tar.gz"
|
||||
|
||||
# Explicitly set virt driver
|
||||
VIRT_DRIVER=xenserver
|
||||
|
||||
+3
-1
@@ -163,7 +163,9 @@ if is_service_enabled trove; then
|
||||
cleanup_trove
|
||||
fi
|
||||
|
||||
stop_dstat
|
||||
if is_service_enabled dstat; then
|
||||
stop_dstat
|
||||
fi
|
||||
|
||||
# Clean up the remainder of the screen processes
|
||||
SCREEN=$(which screen)
|
||||
|
||||
Reference in New Issue
Block a user