From 242c098498a12c5af60b97818d4c547ff90614d6 Mon Sep 17 00:00:00 2001
From: Fawad Khaliq
Date: Tue, 15 Jul 2014 17:51:44 -0700
Subject: [PATCH 0001/3421] Enable security group extension in PLUMgrid plugin
Implements: blueprint plumgrid-neutron-security-groups
Change-Id: I30392adff5e3250a1c4f9f1f04fc7e0587007226
---
lib/neutron_plugins/plumgrid | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/neutron_plugins/plumgrid b/lib/neutron_plugins/plumgrid
index 178bca7dc2..00e2c95efb 100644
--- a/lib/neutron_plugins/plumgrid
+++ b/lib/neutron_plugins/plumgrid
@@ -46,8 +46,8 @@ function is_neutron_ovs_base_plugin {
}
function has_neutron_plugin_security_group {
- # False
- return 1
+ # return 0 means enabled
+ return 0
}
function neutron_plugin_check_adv_test_requirements {
From 7df9d1be17162feabeaba35faa87baf09debe590 Mon Sep 17 00:00:00 2001
From: Angus Lees
Date: Mon, 21 Jul 2014 15:35:34 +1000
Subject: [PATCH 0002/3421] Ensure sbin is in PATH.
Some distros (Debian) don't have sbin in PATH for non-root users.
Nova (and possibly other services) assumes that it can invoke "sysctl"
without sudo.
Change-Id: Iced21fc1378af309fb49688f9b63f2cd8383e304
Closes-Bug: #1300800
---
stack.sh | 3 +++
1 file changed, 3 insertions(+)
diff --git a/stack.sh b/stack.sh
index 94b90d18c0..5f12a8083a 100755
--- a/stack.sh
+++ b/stack.sh
@@ -34,6 +34,9 @@ export LC_ALL
# Make sure umask is sane
umask 022
+# Not all distros have sbin in PATH for regular users.
+PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin
+
# Keep track of the devstack directory
TOP_DIR=$(cd $(dirname "$0") && pwd)
From 122a16fb95e480126319844d94196ea3327b71e8 Mon Sep 17 00:00:00 2001
From: Andrea Frittoli
Date: Thu, 14 Aug 2014 08:18:40 +0100
Subject: [PATCH 0003/3421] Tempest allow_tenant_isolation in auth section
Tempest change 107685 moves allow_tenant_isolation from compute
group to auth group, making the old format deprecated.
Switching to the new format.
Change-Id: Iff79986c2564610efde4791b7e61df3db859e199
---
lib/tempest | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/tempest b/lib/tempest
index d6d6020adf..4fc064c56d 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -272,8 +272,10 @@ function configure_tempest {
iniset $TEMPEST_CONFIG image http_image $TEMPEST_HTTP_IMAGE
fi
+ # Auth
+ iniset $TEMPEST_CONFIG auth allow_tenant_isolation ${TEMPEST_ALLOW_TENANT_ISOLATION:-True}
+
# Compute
- iniset $TEMPEST_CONFIG compute allow_tenant_isolation ${TEMPEST_ALLOW_TENANT_ISOLATION:-True}
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
From b4495eb410e3ad348700f127dcf7c0562014c325 Mon Sep 17 00:00:00 2001
From: Noboru Iwamatsu
Date: Wed, 2 Jul 2014 18:31:31 +0900
Subject: [PATCH 0004/3421] Use mod_version to clean-up apache version matching
This change uses mod_version (shipped by default on everything we care
about) to set-up version-specific config within apache rather than
within devstack scripts.
Clean up the horizon and keystone config file generation to use the
internal apache matching.
Since I6478db385fda2fa1c75ced12d3e886b2e1152852 the apache matching in
'functions' is actually duplicated. just leave get_apache_version in
lib/apache as it is used for config-file name matching in there.
Change-Id: I6478db385fda2fa1c75ced12d3e886b2e1152852
---
files/apache-horizon.template | 12 +++++++++---
files/apache-keystone.template | 8 ++++++--
functions | 12 ------------
lib/apache | 5 +++++
lib/horizon | 7 -------
lib/keystone | 7 -------
6 files changed, 20 insertions(+), 31 deletions(-)
diff --git a/files/apache-horizon.template b/files/apache-horizon.template
index c1dd6934f3..bca1251bec 100644
--- a/files/apache-horizon.template
+++ b/files/apache-horizon.template
@@ -17,10 +17,16 @@
Options Indexes FollowSymLinks MultiViews
- %HORIZON_REQUIRE%
AllowOverride None
- Order allow,deny
- allow from all
+ # Apache 2.4 uses mod_authz_host for access control now (instead of
+ # "Allow")
+
+ Order allow,deny
+ Allow from all
+
+ = 2.4>
+ Require all granted
+
ErrorLog /var/log/%APACHE_NAME%/horizon_error.log
diff --git a/files/apache-keystone.template b/files/apache-keystone.template
index e7b215768c..b4bdb16f00 100644
--- a/files/apache-keystone.template
+++ b/files/apache-keystone.template
@@ -6,7 +6,9 @@ Listen %ADMINPORT%
WSGIProcessGroup keystone-public
WSGIScriptAlias / %PUBLICWSGI%
WSGIApplicationGroup %{GLOBAL}
- %ERRORLOGFORMAT%
+ = 2.4>
+ ErrorLogFormat "%{cu}t %M"
+
ErrorLog /var/log/%APACHE_NAME%/keystone.log
CustomLog /var/log/%APACHE_NAME%/access.log combined
@@ -16,7 +18,9 @@ Listen %ADMINPORT%
WSGIProcessGroup keystone-admin
WSGIScriptAlias / %ADMINWSGI%
WSGIApplicationGroup %{GLOBAL}
- %ERRORLOGFORMAT%
+ = 2.4>
+ ErrorLogFormat "%{cu}t %M"
+
ErrorLog /var/log/%APACHE_NAME%/keystone.log
CustomLog /var/log/%APACHE_NAME%/access.log combined
diff --git a/functions b/functions
index 76f704792e..0194acf64e 100644
--- a/functions
+++ b/functions
@@ -21,18 +21,6 @@ function function_exists {
declare -f -F $1 > /dev/null
}
-# Checks if installed Apache is <= given version
-# $1 = x.y.z (version string of Apache)
-function check_apache_version {
- local cmd="apachectl"
- if ! [[ -x $(which apachectl 2>/dev/null) ]]; then
- cmd="/usr/sbin/apachectl"
- fi
-
- local version=$($cmd -v | grep version | grep -Po 'Apache/\K[^ ]*')
- expr "$version" '>=' $1 > /dev/null
-}
-
# Cleanup anything from /tmp on unstack
# clean_tmp
diff --git a/lib/apache b/lib/apache
index 6d22290c42..2c436816c3 100644
--- a/lib/apache
+++ b/lib/apache
@@ -59,6 +59,11 @@ function install_apache_wsgi {
else
exit_distro_not_supported "apache installation"
fi
+
+ # ensure mod_version enabled for . This is
+ # built-in statically on anything recent, but precise (2.2)
+ # doesn't have it enabled
+ sudo a2enmod version || true
}
# get_apache_version() - return the version of Apache installed
diff --git a/lib/horizon b/lib/horizon
index 614a0c86a8..19693efd96 100644
--- a/lib/horizon
+++ b/lib/horizon
@@ -120,12 +120,6 @@ function init_horizon {
# Create an empty directory that apache uses as docroot
sudo mkdir -p $HORIZON_DIR/.blackhole
- # Apache 2.4 uses mod_authz_host for access control now (instead of "Allow")
- local horizon_require=''
- if check_apache_version "2.4" ; then
- horizon_require='Require all granted'
- fi
-
local horizon_conf=$(apache_site_config_for horizon)
# Configure apache to run horizon
@@ -135,7 +129,6 @@ function init_horizon {
s,%HORIZON_DIR%,$HORIZON_DIR,g;
s,%APACHE_NAME%,$APACHE_NAME,g;
s,%DEST%,$DEST,g;
- s,%HORIZON_REQUIRE%,$horizon_require,g;
\" $FILES/apache-horizon.template >$horizon_conf"
if is_ubuntu; then
diff --git a/lib/keystone b/lib/keystone
index c1b0b8786f..9e234b49d2 100644
--- a/lib/keystone
+++ b/lib/keystone
@@ -125,12 +125,6 @@ function _config_keystone_apache_wsgi {
local keystone_apache_conf=$(apache_site_config_for keystone)
local apache_version=$(get_apache_version)
- if [[ ${apache_version#*\.} -ge 4 ]]; then
- # Apache 2.4 supports custom error log formats
- # this should mirror the original log formatting.
- local errorlogformat='ErrorLogFormat "%{cu}t %M"'
- fi
-
# copy proxy vhost and wsgi file
sudo cp $KEYSTONE_DIR/httpd/keystone.py $KEYSTONE_WSGI_DIR/main
sudo cp $KEYSTONE_DIR/httpd/keystone.py $KEYSTONE_WSGI_DIR/admin
@@ -143,7 +137,6 @@ function _config_keystone_apache_wsgi {
s|%PUBLICWSGI%|$KEYSTONE_WSGI_DIR/main|g;
s|%ADMINWSGI%|$KEYSTONE_WSGI_DIR/admin|g;
s|%USER%|$STACK_USER|g
- s|%ERRORLOGFORMAT%|$errorlogformat|g;
" -i $keystone_apache_conf
enable_apache_site keystone
}
From ffd17680d523bc0042a3c2eb8be8e29c307ce1b0 Mon Sep 17 00:00:00 2001
From: Dean Troyer
Date: Sat, 2 Aug 2014 16:07:03 -0500
Subject: [PATCH 0005/3421] Re-order stack.sh 3: logging and error traps
Part 3 of a series
Re-order the setup and check bits in the top portion of stack.sh to
have a logical flow with similar things done together.
No behaviour changes are intended aside from the order of execution.
Any such changes are bugs.
* Move logging and error configuration earlier to cover initial project setup.
Change-Id: Ib16bbe20f224b1cf5e86c7a2fda0d9472c108873
---
lib/rpc_backend | 2 +-
stack.sh | 352 ++++++++++++++++++++++++------------------------
2 files changed, 177 insertions(+), 177 deletions(-)
diff --git a/lib/rpc_backend b/lib/rpc_backend
index 38da50c4f8..d527c6bded 100644
--- a/lib/rpc_backend
+++ b/lib/rpc_backend
@@ -43,7 +43,7 @@ function check_rpc_backend {
local rpc_backend_cnt=0
for svc in qpid zeromq rabbit; do
is_service_enabled $svc &&
- ((rpc_backend_cnt++))
+ (( rpc_backend_cnt++ )) || true
done
if [ "$rpc_backend_cnt" -gt 1 ]; then
echo "ERROR: only one rpc backend may be enabled,"
diff --git a/stack.sh b/stack.sh
index 68eac7c04c..f42e50a071 100755
--- a/stack.sh
+++ b/stack.sh
@@ -177,9 +177,6 @@ if [[ ,${ENABLED_SERVICES}, =~ ,"swift", ]]; then
exit 1
fi
-# Set up logging level
-VERBOSE=$(trueorfalse True $VERBOSE)
-
# Configure sudo
# --------------
@@ -285,6 +282,182 @@ if [ -z "`grep ^127.0.0.1 /etc/hosts | grep $LOCAL_HOSTNAME`" ]; then
fi
+# Configure Logging
+# -----------------
+
+# Set up logging level
+VERBOSE=$(trueorfalse True $VERBOSE)
+
+# Draw a spinner so the user knows something is happening
+function spinner {
+ local delay=0.75
+ local spinstr='/-\|'
+ printf "..." >&3
+ while [ true ]; do
+ local temp=${spinstr#?}
+ printf "[%c]" "$spinstr" >&3
+ local spinstr=$temp${spinstr%"$temp"}
+ sleep $delay
+ printf "\b\b\b" >&3
+ done
+}
+
+function kill_spinner {
+ if [ ! -z "$LAST_SPINNER_PID" ]; then
+ kill >/dev/null 2>&1 $LAST_SPINNER_PID
+ printf "\b\b\bdone\n" >&3
+ fi
+}
+
+# Echo text to the log file, summary log file and stdout
+# echo_summary "something to say"
+function echo_summary {
+ if [[ -t 3 && "$VERBOSE" != "True" ]]; then
+ kill_spinner
+ echo -n -e $@ >&6
+ spinner &
+ LAST_SPINNER_PID=$!
+ else
+ echo -e $@ >&6
+ fi
+}
+
+# Echo text only to stdout, no log files
+# echo_nolog "something not for the logs"
+function echo_nolog {
+ echo $@ >&3
+}
+
+if [[ is_fedora && $DISTRO == "rhel6" ]]; then
+ # poor old python2.6 doesn't have argparse by default, which
+ # outfilter.py uses
+ is_package_installed python-argparse || install_package python-argparse
+fi
+
+# Set up logging for ``stack.sh``
+# Set ``LOGFILE`` to turn on logging
+# Append '.xxxxxxxx' to the given name to maintain history
+# where 'xxxxxxxx' is a representation of the date the file was created
+TIMESTAMP_FORMAT=${TIMESTAMP_FORMAT:-"%F-%H%M%S"}
+if [[ -n "$LOGFILE" || -n "$SCREEN_LOGDIR" ]]; then
+ LOGDAYS=${LOGDAYS:-7}
+ CURRENT_LOG_TIME=$(date "+$TIMESTAMP_FORMAT")
+fi
+
+if [[ -n "$LOGFILE" ]]; then
+ # First clean up old log files. Use the user-specified ``LOGFILE``
+ # as the template to search for, appending '.*' to match the date
+ # we added on earlier runs.
+ LOGDIR=$(dirname "$LOGFILE")
+ LOGFILENAME=$(basename "$LOGFILE")
+ mkdir -p $LOGDIR
+ find $LOGDIR -maxdepth 1 -name $LOGFILENAME.\* -mtime +$LOGDAYS -exec rm {} \;
+ LOGFILE=$LOGFILE.${CURRENT_LOG_TIME}
+ SUMFILE=$LOGFILE.${CURRENT_LOG_TIME}.summary
+
+ # Redirect output according to config
+
+ # Set fd 3 to a copy of stdout. So we can set fd 1 without losing
+ # stdout later.
+ exec 3>&1
+ if [[ "$VERBOSE" == "True" ]]; then
+ # Set fd 1 and 2 to write the log file
+ exec 1> >( $TOP_DIR/tools/outfilter.py -v -o "${LOGFILE}" ) 2>&1
+ # Set fd 6 to summary log file
+ exec 6> >( $TOP_DIR/tools/outfilter.py -o "${SUMFILE}" )
+ else
+ # Set fd 1 and 2 to primary logfile
+ exec 1> >( $TOP_DIR/tools/outfilter.py -o "${LOGFILE}" ) 2>&1
+ # Set fd 6 to summary logfile and stdout
+ exec 6> >( $TOP_DIR/tools/outfilter.py -v -o "${SUMFILE}" >&3 )
+ fi
+
+ echo_summary "stack.sh log $LOGFILE"
+ # Specified logfile name always links to the most recent log
+ ln -sf $LOGFILE $LOGDIR/$LOGFILENAME
+ ln -sf $SUMFILE $LOGDIR/$LOGFILENAME.summary
+else
+ # Set up output redirection without log files
+ # Set fd 3 to a copy of stdout. So we can set fd 1 without losing
+ # stdout later.
+ exec 3>&1
+ if [[ "$VERBOSE" != "True" ]]; then
+ # Throw away stdout and stderr
+ exec 1>/dev/null 2>&1
+ fi
+ # Always send summary fd to original stdout
+ exec 6> >( $TOP_DIR/tools/outfilter.py -v >&3 )
+fi
+
+# Set up logging of screen windows
+# Set ``SCREEN_LOGDIR`` to turn on logging of screen windows to the
+# directory specified in ``SCREEN_LOGDIR``, we will log to the the file
+# ``screen-$SERVICE_NAME-$TIMESTAMP.log`` in that dir and have a link
+# ``screen-$SERVICE_NAME.log`` to the latest log file.
+# Logs are kept for as long specified in ``LOGDAYS``.
+if [[ -n "$SCREEN_LOGDIR" ]]; then
+
+ # We make sure the directory is created.
+ if [[ -d "$SCREEN_LOGDIR" ]]; then
+ # We cleanup the old logs
+ find $SCREEN_LOGDIR -maxdepth 1 -name screen-\*.log -mtime +$LOGDAYS -exec rm {} \;
+ else
+ mkdir -p $SCREEN_LOGDIR
+ fi
+fi
+
+
+# Configure Error Traps
+# ---------------------
+
+# Kill background processes on exit
+trap exit_trap EXIT
+function exit_trap {
+ local r=$?
+ jobs=$(jobs -p)
+ # Only do the kill when we're logging through a process substitution,
+ # which currently is only to verbose logfile
+ if [[ -n $jobs && -n "$LOGFILE" && "$VERBOSE" == "True" ]]; then
+ echo "exit_trap: cleaning up child processes"
+ kill 2>&1 $jobs
+ fi
+
+ # Kill the last spinner process
+ kill_spinner
+
+ if [[ $r -ne 0 ]]; then
+ echo "Error on exit"
+ if [[ -z $LOGDIR ]]; then
+ $TOP_DIR/tools/worlddump.py
+ else
+ $TOP_DIR/tools/worlddump.py -d $LOGDIR
+ fi
+ fi
+
+ exit $r
+}
+
+# Exit on any errors so that errors don't compound
+trap err_trap ERR
+function err_trap {
+ local r=$?
+ set +o xtrace
+ if [[ -n "$LOGFILE" ]]; then
+ echo "${0##*/} failed: full log in $LOGFILE"
+ else
+ echo "${0##*/} failed"
+ fi
+ exit $r
+}
+
+# Begin trapping error exit codes
+set -o errexit
+
+# Print the commands being run so that we can see the command that triggers
+# an error. It is also useful for following along as the install occurs.
+set -o xtrace
+
+
# Common Configuration
# --------------------
@@ -494,179 +667,6 @@ if is_service_enabled s-proxy; then
fi
-# Configure logging
-# -----------------
-
-# Draw a spinner so the user knows something is happening
-function spinner {
- local delay=0.75
- local spinstr='/-\|'
- printf "..." >&3
- while [ true ]; do
- local temp=${spinstr#?}
- printf "[%c]" "$spinstr" >&3
- local spinstr=$temp${spinstr%"$temp"}
- sleep $delay
- printf "\b\b\b" >&3
- done
-}
-
-function kill_spinner {
- if [ ! -z "$LAST_SPINNER_PID" ]; then
- kill >/dev/null 2>&1 $LAST_SPINNER_PID
- printf "\b\b\bdone\n" >&3
- fi
-}
-
-# Echo text to the log file, summary log file and stdout
-# echo_summary "something to say"
-function echo_summary {
- if [[ -t 3 && "$VERBOSE" != "True" ]]; then
- kill_spinner
- echo -n -e $@ >&6
- spinner &
- LAST_SPINNER_PID=$!
- else
- echo -e $@ >&6
- fi
-}
-
-# Echo text only to stdout, no log files
-# echo_nolog "something not for the logs"
-function echo_nolog {
- echo $@ >&3
-}
-
-if [[ is_fedora && $DISTRO == "rhel6" ]]; then
- # poor old python2.6 doesn't have argparse by default, which
- # outfilter.py uses
- is_package_installed python-argparse || install_package python-argparse
-fi
-
-# Set up logging for ``stack.sh``
-# Set ``LOGFILE`` to turn on logging
-# Append '.xxxxxxxx' to the given name to maintain history
-# where 'xxxxxxxx' is a representation of the date the file was created
-TIMESTAMP_FORMAT=${TIMESTAMP_FORMAT:-"%F-%H%M%S"}
-if [[ -n "$LOGFILE" || -n "$SCREEN_LOGDIR" ]]; then
- LOGDAYS=${LOGDAYS:-7}
- CURRENT_LOG_TIME=$(date "+$TIMESTAMP_FORMAT")
-fi
-
-if [[ -n "$LOGFILE" ]]; then
- # First clean up old log files. Use the user-specified ``LOGFILE``
- # as the template to search for, appending '.*' to match the date
- # we added on earlier runs.
- LOGDIR=$(dirname "$LOGFILE")
- LOGFILENAME=$(basename "$LOGFILE")
- mkdir -p $LOGDIR
- find $LOGDIR -maxdepth 1 -name $LOGFILENAME.\* -mtime +$LOGDAYS -exec rm {} \;
- LOGFILE=$LOGFILE.${CURRENT_LOG_TIME}
- SUMFILE=$LOGFILE.${CURRENT_LOG_TIME}.summary
-
- # Redirect output according to config
-
- # Set fd 3 to a copy of stdout. So we can set fd 1 without losing
- # stdout later.
- exec 3>&1
- if [[ "$VERBOSE" == "True" ]]; then
- # Set fd 1 and 2 to write the log file
- exec 1> >( $TOP_DIR/tools/outfilter.py -v -o "${LOGFILE}" ) 2>&1
- # Set fd 6 to summary log file
- exec 6> >( $TOP_DIR/tools/outfilter.py -o "${SUMFILE}" )
- else
- # Set fd 1 and 2 to primary logfile
- exec 1> >( $TOP_DIR/tools/outfilter.py -o "${LOGFILE}" ) 2>&1
- # Set fd 6 to summary logfile and stdout
- exec 6> >( $TOP_DIR/tools/outfilter.py -v -o "${SUMFILE}" >&3 )
- fi
-
- echo_summary "stack.sh log $LOGFILE"
- # Specified logfile name always links to the most recent log
- ln -sf $LOGFILE $LOGDIR/$LOGFILENAME
- ln -sf $SUMFILE $LOGDIR/$LOGFILENAME.summary
-else
- # Set up output redirection without log files
- # Set fd 3 to a copy of stdout. So we can set fd 1 without losing
- # stdout later.
- exec 3>&1
- if [[ "$VERBOSE" != "True" ]]; then
- # Throw away stdout and stderr
- exec 1>/dev/null 2>&1
- fi
- # Always send summary fd to original stdout
- exec 6> >( $TOP_DIR/tools/outfilter.py -v >&3 )
-fi
-
-# Set up logging of screen windows
-# Set ``SCREEN_LOGDIR`` to turn on logging of screen windows to the
-# directory specified in ``SCREEN_LOGDIR``, we will log to the the file
-# ``screen-$SERVICE_NAME-$TIMESTAMP.log`` in that dir and have a link
-# ``screen-$SERVICE_NAME.log`` to the latest log file.
-# Logs are kept for as long specified in ``LOGDAYS``.
-if [[ -n "$SCREEN_LOGDIR" ]]; then
-
- # We make sure the directory is created.
- if [[ -d "$SCREEN_LOGDIR" ]]; then
- # We cleanup the old logs
- find $SCREEN_LOGDIR -maxdepth 1 -name screen-\*.log -mtime +$LOGDAYS -exec rm {} \;
- else
- mkdir -p $SCREEN_LOGDIR
- fi
-fi
-
-
-# Set Up Script Execution
-# -----------------------
-
-# Kill background processes on exit
-trap exit_trap EXIT
-function exit_trap {
- local r=$?
- jobs=$(jobs -p)
- # Only do the kill when we're logging through a process substitution,
- # which currently is only to verbose logfile
- if [[ -n $jobs && -n "$LOGFILE" && "$VERBOSE" == "True" ]]; then
- echo "exit_trap: cleaning up child processes"
- kill 2>&1 $jobs
- fi
-
- # Kill the last spinner process
- kill_spinner
-
- if [[ $r -ne 0 ]]; then
- echo "Error on exit"
- if [[ -z $LOGDIR ]]; then
- $TOP_DIR/tools/worlddump.py
- else
- $TOP_DIR/tools/worlddump.py -d $LOGDIR
- fi
- fi
-
- exit $r
-}
-
-# Exit on any errors so that errors don't compound
-trap err_trap ERR
-function err_trap {
- local r=$?
- set +o xtrace
- if [[ -n "$LOGFILE" ]]; then
- echo "${0##*/} failed: full log in $LOGFILE"
- else
- echo "${0##*/} failed"
- fi
- exit $r
-}
-
-
-set -o errexit
-
-# Print the commands being run so that we can see the command that triggers
-# an error. It is also useful for following along as the install occurs.
-set -o xtrace
-
-
# Install Packages
# ================
From 6a95b605bcf94ba8385660a6681ffbbe46f2e39d Mon Sep 17 00:00:00 2001
From: Bob Ball
Date: Wed, 17 Sep 2014 12:39:50 +0100
Subject: [PATCH 0006/3421] XenAPI: Fix race condition waiting for VM to start
Buildroot on Ubuntu Trusty is slow to populate the vnc-port.
Wait for 20 seconds until the port is populated.
Change-Id: I50e5b5a161207d46e8ce0e304d816e8e5b68dbe8
---
tools/xen/install_os_domU.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh
index 12e861e18a..9bf8f73c92 100755
--- a/tools/xen/install_os_domU.sh
+++ b/tools/xen/install_os_domU.sh
@@ -171,6 +171,7 @@ function wait_for_VM_to_halt {
echo "Waiting for the VM to halt. Progress in-VM can be checked with vncviewer:"
mgmt_ip=$(echo $XENAPI_CONNECTION_URL | tr -d -c '1234567890.')
domid=$(get_domid "$GUEST_NAME")
+ sleep 20 # Wait for the vnc-port to be written
port=$(xenstore-read /local/domain/$domid/console/vnc-port)
echo "vncviewer -via root@$mgmt_ip localhost:${port:2}"
while true; do
From 8732afe2f92545f2b9956c37bdfca4ee1bc07cae Mon Sep 17 00:00:00 2001
From: Thomas Bechtold
Date: Mon, 22 Sep 2014 19:04:05 +0200
Subject: [PATCH 0007/3421] Use correct WSGI dir on SUSE distros
The current default (/var/www) leads to:
AH01797: client denied by server configuration:
/var/www/keystone/admin
For /var/www the needed permissions on SUSE are not set.
For /srv/www/htdocs/ the permissions are correct on SUSE systems.
Change-Id: I3f2df896daecdfe510d45ff121af2a8433a4d5be
---
lib/keystone | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/lib/keystone b/lib/keystone
index b6a4e1097a..3998be9061 100644
--- a/lib/keystone
+++ b/lib/keystone
@@ -38,7 +38,11 @@ KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone}
KEYSTONE_CONF=$KEYSTONE_CONF_DIR/keystone.conf
KEYSTONE_PASTE_INI=${KEYSTONE_PASTE_INI:-$KEYSTONE_CONF_DIR/keystone-paste.ini}
KEYSTONE_AUTH_CACHE_DIR=${KEYSTONE_AUTH_CACHE_DIR:-/var/cache/keystone}
-KEYSTONE_WSGI_DIR=${KEYSTONE_WSGI_DIR:-/var/www/keystone}
+if is_suse; then
+ KEYSTONE_WSGI_DIR=${KEYSTONE_WSGI_DIR:-/srv/www/htdocs/keystone}
+else
+ KEYSTONE_WSGI_DIR=${KEYSTONE_WSGI_DIR:-/var/www/keystone}
+fi
KEYSTONEMIDDLEWARE_DIR=$DEST/keystonemiddleware
KEYSTONECLIENT_DIR=$DEST/python-keystoneclient
From e389aed5bdb6d0a0c5b1fbc672f62628726a6544 Mon Sep 17 00:00:00 2001
From: Steve Baker
Date: Tue, 23 Sep 2014 17:10:39 +1200
Subject: [PATCH 0008/3421] Allow heat standalone to work devstack stack
For functional testing of heat-standalone it is desirable for
heat to orchestrate on the rest of the cloud which is brought up
by devstack. This change makes the following changes to enable
this when HEAT_STANDALONE=True:
- Don't register the orchestration endpoint or create any dedicated
heat accounts
- Install and configure the heat keystone V2 auth plugin instead of
the default v3
- set heat.conf [clients_heat] url so that heat can call its own
API when no orchestration endpoint is registered
- Modify create_userrc.sh to set the required heat client env
variables to work with the standalone heat
Change-Id: Idae33bf1a9d550e2575e6390d2d7c8d3b94c401d
---
lib/heat | 13 ++++++++++---
stack.sh | 6 +++++-
tools/create_userrc.sh | 9 ++++++++-
3 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/lib/heat b/lib/heat
index a74d7b51ac..dead3c2b51 100644
--- a/lib/heat
+++ b/lib/heat
@@ -40,6 +40,8 @@ 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_API_HOST=${HEAT_API_HOST:-$HOST_IP}
+HEAT_API_PORT=${HEAT_API_PORT:-8004}
# other default options
HEAT_DEFERRED_AUTH=${HEAT_DEFERRED_AUTH:-trusts}
@@ -69,6 +71,9 @@ function cleanup_heat {
# configure_heat() - Set config files, create data dirs, etc
function configure_heat {
setup_develop $HEAT_DIR
+ if [[ "$HEAT_STANDALONE" = "True" ]]; then
+ setup_develop $HEAT_DIR/contrib/heat_keystoneclient_v2
+ fi
if [[ ! -d $HEAT_CONF_DIR ]]; then
sudo mkdir -p $HEAT_CONF_DIR
@@ -83,8 +88,6 @@ function configure_heat {
HEAT_ENGINE_PORT=${HEAT_ENGINE_PORT:-8001}
HEAT_API_CW_HOST=${HEAT_API_CW_HOST:-$HOST_IP}
HEAT_API_CW_PORT=${HEAT_API_CW_PORT:-8003}
- HEAT_API_HOST=${HEAT_API_HOST:-$HOST_IP}
- HEAT_API_PORT=${HEAT_API_PORT:-8004}
HEAT_API_PASTE_FILE=$HEAT_CONF_DIR/api-paste.ini
HEAT_POLICY_FILE=$HEAT_CONF_DIR/policy.json
@@ -127,7 +130,11 @@ function configure_heat {
iniset $HEAT_CONF ec2authtoken auth_uri $KEYSTONE_SERVICE_URI/v2.0
# paste_deploy
- [[ "$HEAT_STANDALONE" = "True" ]] && iniset $HEAT_CONF paste_deploy flavor standalone
+ if [[ "$HEAT_STANDALONE" = "True" ]]; then
+ iniset $HEAT_CONF paste_deploy flavor standalone
+ iniset $HEAT_CONF DEFAULT keystone_backend heat_keystoneclient_v2.client.KeystoneClientV2
+ iniset $HEAT_CONF clients_heat url "http://$HEAT_API_HOST:$HEAT_API_PORT/v1/%(tenant_id)s"
+ fi
# OpenStack API
iniset $HEAT_CONF heat_api bind_port $HEAT_API_PORT
diff --git a/stack.sh b/stack.sh
index c20e61031d..0b09e5fb61 100755
--- a/stack.sh
+++ b/stack.sh
@@ -988,7 +988,7 @@ if is_service_enabled key; then
create_swift_accounts
fi
- if is_service_enabled heat; then
+ if is_service_enabled heat && [[ "$HEAT_STANDALONE" != "True" ]]; then
create_heat_accounts
fi
@@ -1289,6 +1289,10 @@ if is_service_enabled nova && is_service_enabled key; then
USERRC_PARAMS="$USERRC_PARAMS --os-cacert $SSL_BUNDLE_FILE"
fi
+ if [[ "$HEAT_STANDALONE" = "True" ]]; then
+ USERRC_PARAMS="$USERRC_PARAMS --heat-url http://$HEAT_API_HOST:$HEAT_API_PORT/v1"
+ fi
+
$TOP_DIR/tools/create_userrc.sh $USERRC_PARAMS
fi
diff --git a/tools/create_userrc.sh b/tools/create_userrc.sh
index 5b1111ae54..863fe0359e 100755
--- a/tools/create_userrc.sh
+++ b/tools/create_userrc.sh
@@ -37,6 +37,7 @@ Optional Arguments
-C create user and tenant, the specifid tenant will be the user's tenant
-r when combined with -C and the (-u) user exists it will be the user's tenant role in the (-C)tenant (default: Member)
-p password for the user
+--heat-url
--os-username
--os-password
--os-tenant-name
@@ -53,12 +54,13 @@ $0 -P -C mytenant -u myuser -p mypass
EOF
}
-if ! options=$(getopt -o hPAp:u:r:C: -l os-username:,os-password:,os-tenant-name:,os-tenant-id:,os-auth-url:,target-dir:,skip-tenant:,os-cacert:,help,debug -- "$@"); then
+if ! options=$(getopt -o hPAp:u:r:C: -l os-username:,os-password:,os-tenant-name:,os-tenant-id:,os-auth-url:,target-dir:,heat-url:,skip-tenant:,os-cacert:,help,debug -- "$@"); then
display_help
exit 1
fi
eval set -- $options
ADDPASS=""
+HEAT_URL=""
# The services users usually in the service tenant.
# rc files for service users, is out of scope.
@@ -79,6 +81,7 @@ while [ $# -gt 0 ]; do
--os-auth-url) export OS_AUTH_URL=$2; shift ;;
--os-cacert) export OS_CACERT=$2; shift ;;
--target-dir) ACCOUNT_DIR=$2; shift ;;
+ --heat-url) HEAT_URL=$2; shift ;;
--debug) set -o xtrace ;;
-u) MODE=${MODE:-one}; USER_NAME=$2; shift ;;
-p) USER_PASS=$2; shift ;;
@@ -209,6 +212,10 @@ EOF
if [ -n "$ADDPASS" ]; then
echo "export OS_PASSWORD=\"$user_passwd\"" >>"$rcfile"
fi
+ if [ -n "$HEAT_URL" ]; then
+ echo "export HEAT_URL=\"$HEAT_URL/$tenant_id\"" >>"$rcfile"
+ echo "export OS_NO_CLIENT_AUTH=True" >>"$rcfile"
+ fi
}
#admin users expected
From 0be63f3979d081fb7bf039b753218915a9ec487f Mon Sep 17 00:00:00 2001
From: Bob Ball
Date: Tue, 23 Sep 2014 11:22:41 +0100
Subject: [PATCH 0009/3421] XenAPI: stackrc now depends on nproc
Install it automatically in the devstack DomU
Change-Id: Ie282dd128ebc92377d85800585962bc8767483fe
---
tools/xen/prepare_guest.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/xen/prepare_guest.sh b/tools/xen/prepare_guest.sh
index 2b5e418a6a..cd189db803 100755
--- a/tools/xen/prepare_guest.sh
+++ b/tools/xen/prepare_guest.sh
@@ -74,6 +74,7 @@ EOF
apt-get update
apt-get install -y cracklib-runtime curl wget ssh openssh-server tcpdump ethtool
apt-get install -y curl wget ssh openssh-server python-pip git sudo python-netaddr
+apt-get install -y coreutils
pip install xenapi
# Install XenServer guest utilities
From 107278fa5b2b70669c46237da971e0a9ff84482a Mon Sep 17 00:00:00 2001
From: Pritesh Kothari
Date: Mon, 15 Sep 2014 09:29:55 -0700
Subject: [PATCH 0010/3421] Remove the Cisco Nexus monolithic plugin support
The Cisco Nexus monolithic plugin does not work without the Open
vSwitch plugin. The Open vSwitch plugin is scheduled to be removed
as per #1323729. This patch removes the Nexus Hardware switch
related code from devstack. The N1KV virtual switch related code
will still remain in the tree as it doesn't depend on Open vSwitch
plugin.
Closes-Bug: #1350387
Change-Id: I82ebb09c64589fc9b7bb790982541bc87c66e6e3
---
lib/neutron_plugins/cisco | 199 ++------------------------------------
1 file changed, 6 insertions(+), 193 deletions(-)
diff --git a/lib/neutron_plugins/cisco b/lib/neutron_plugins/cisco
index da90ee32ad..1406e3790c 100644
--- a/lib/neutron_plugins/cisco
+++ b/lib/neutron_plugins/cisco
@@ -20,38 +20,12 @@ Q_CISCO_PLUGIN_VXLAN_ID_RANGES=${Q_CISCO_PLUGIN_VXLAN_ID_RANGES:-5000:10000}
# Specify the VLAN range
Q_CISCO_PLUGIN_VLAN_RANGES=${Q_CISCO_PLUGIN_VLAN_RANGES:-vlan:1:4094}
-# Specify ncclient package information
-NCCLIENT_DIR=$DEST/ncclient
-NCCLIENT_VERSION=${NCCLIENT_VERSION:-0.3.1}
-NCCLIENT_REPO=${NCCLIENT_REPO:-git://github.com/CiscoSystems/ncclient.git}
-NCCLIENT_BRANCH=${NCCLIENT_BRANCH:-master}
-
# This routine put a prefix on an existing function name
function _prefix_function {
declare -F $1 > /dev/null || die "$1 doesn't exist"
eval "$(echo "${2}_${1}()"; declare -f ${1} | tail -n +2)"
}
-function _has_ovs_subplugin {
- local subplugin
- for subplugin in ${Q_CISCO_PLUGIN_SUBPLUGINS[@]}; do
- if [[ "$subplugin" == "openvswitch" ]]; then
- return 0
- fi
- done
- return 1
-}
-
-function _has_nexus_subplugin {
- local subplugin
- for subplugin in ${Q_CISCO_PLUGIN_SUBPLUGINS[@]}; do
- if [[ "$subplugin" == "nexus" ]]; then
- return 0
- fi
- done
- return 1
-}
-
function _has_n1kv_subplugin {
local subplugin
for subplugin in ${Q_CISCO_PLUGIN_SUBPLUGINS[@]}; do
@@ -62,27 +36,6 @@ function _has_n1kv_subplugin {
return 1
}
-# This routine populates the cisco config file with the information for
-# a particular nexus switch
-function _config_switch {
- local cisco_cfg_file=$1
- local switch_ip=$2
- local username=$3
- local password=$4
- local ssh_port=$5
- shift 5
-
- local section="NEXUS_SWITCH:$switch_ip"
- iniset $cisco_cfg_file $section username $username
- iniset $cisco_cfg_file $section password $password
- iniset $cisco_cfg_file $section ssh_port $ssh_port
-
- while [[ ${#@} != 0 ]]; do
- iniset $cisco_cfg_file $section $1 $2
- shift 2
- done
-}
-
# Prefix openvswitch plugin routines with "ovs" in order to differentiate from
# cisco plugin routines. This means, ovs plugin routines will coexist with cisco
# plugin routines in this script.
@@ -98,73 +51,17 @@ _prefix_function neutron_plugin_configure_service ovs
_prefix_function neutron_plugin_setup_interface_driver ovs
_prefix_function has_neutron_plugin_security_group ovs
-# Check the version of the installed ncclient package
-function check_ncclient_version {
-python << EOF
-version = '$NCCLIENT_VERSION'
-import sys
-try:
- import pkg_resources
- import ncclient
- module_version = pkg_resources.get_distribution('ncclient').version
- if version != module_version:
- sys.exit(1)
-except:
- sys.exit(1)
-EOF
-}
-
-# Install the ncclient package
-function install_ncclient {
- git_clone $NCCLIENT_REPO $NCCLIENT_DIR $NCCLIENT_BRANCH
- (cd $NCCLIENT_DIR; sudo python setup.py install)
-}
-
-# Check if the required version of ncclient has been installed
-function is_ncclient_installed {
- # Check if the Cisco ncclient repository exists
- if [[ -d $NCCLIENT_DIR ]]; then
- remotes=$(cd $NCCLIENT_DIR; git remote -v | grep fetch | awk '{ print $2}')
- for remote in $remotes; do
- if [[ $remote == $NCCLIENT_REPO ]]; then
- break;
- fi
- done
- if [[ $remote != $NCCLIENT_REPO ]]; then
- return 1
- fi
- else
- return 1
- fi
-
- # Check if the ncclient is installed with the right version
- if ! check_ncclient_version; then
- return 1
- fi
- return 0
-}
-
function has_neutron_plugin_security_group {
- if _has_ovs_subplugin; then
- ovs_has_neutron_plugin_security_group
- else
- return 1
- fi
+ return 1
}
function is_neutron_ovs_base_plugin {
- # Cisco uses OVS if openvswitch subplugin is deployed
- _has_ovs_subplugin
return
}
# populate required nova configuration parameters
function neutron_plugin_create_nova_conf {
- if _has_ovs_subplugin; then
- ovs_neutron_plugin_create_nova_conf
- else
- _neutron_ovs_base_configure_nova_vif_driver
- fi
+ _neutron_ovs_base_configure_nova_vif_driver
}
function neutron_plugin_install_agent_packages {
@@ -177,32 +74,14 @@ function neutron_plugin_configure_common {
# setup default subplugins
if [ ! -v Q_CISCO_PLUGIN_SUBPLUGINS ]; then
declare -ga Q_CISCO_PLUGIN_SUBPLUGINS
- Q_CISCO_PLUGIN_SUBPLUGINS=(openvswitch nexus)
- fi
- if _has_ovs_subplugin; then
- ovs_neutron_plugin_configure_common
- Q_PLUGIN_EXTRA_CONF_PATH=etc/neutron/plugins/cisco
- Q_PLUGIN_EXTRA_CONF_FILES=(cisco_plugins.ini)
- # Copy extra config files to /etc so that they can be modified
- # later according to Cisco-specific localrc settings.
- mkdir -p /$Q_PLUGIN_EXTRA_CONF_PATH
- local f
- local extra_conf_file
- for (( f=0; $f < ${#Q_PLUGIN_EXTRA_CONF_FILES[@]}; f+=1 )); do
- extra_conf_file=$Q_PLUGIN_EXTRA_CONF_PATH/${Q_PLUGIN_EXTRA_CONF_FILES[$f]}
- cp $NEUTRON_DIR/$extra_conf_file /$extra_conf_file
- done
- else
- Q_PLUGIN_CONF_PATH=etc/neutron/plugins/cisco
- Q_PLUGIN_CONF_FILENAME=cisco_plugins.ini
+ Q_CISCO_PLUGIN_SUBPLUGINS=(n1kv)
fi
+ Q_PLUGIN_CONF_PATH=etc/neutron/plugins/cisco
+ Q_PLUGIN_CONF_FILENAME=cisco_plugins.ini
Q_PLUGIN_CLASS="neutron.plugins.cisco.network_plugin.PluginV2"
}
function neutron_plugin_configure_debug_command {
- if _has_ovs_subplugin; then
- ovs_neutron_plugin_configure_debug_command
- fi
}
function neutron_plugin_configure_dhcp_agent {
@@ -210,53 +89,6 @@ function neutron_plugin_configure_dhcp_agent {
}
function neutron_plugin_configure_l3_agent {
- if _has_ovs_subplugin; then
- ovs_neutron_plugin_configure_l3_agent
- fi
-}
-
-function _configure_nexus_subplugin {
- local cisco_cfg_file=$1
-
- # Install a known compatible ncclient from the Cisco repository if necessary
- if ! is_ncclient_installed; then
- # Preserve the two global variables
- local offline=$OFFLINE
- local reclone=$RECLONE
- # Change their values to allow installation
- OFFLINE=False
- RECLONE=yes
- install_ncclient
- # Restore their values
- OFFLINE=$offline
- RECLONE=$reclone
- fi
-
- # Setup default nexus switch information
- if [ ! -v Q_CISCO_PLUGIN_SWITCH_INFO ]; then
- declare -A Q_CISCO_PLUGIN_SWITCH_INFO
- HOST_NAME=$(hostname)
- Q_CISCO_PLUGIN_SWITCH_INFO=([1.1.1.1]=stack:stack:22:${HOST_NAME}:1/10)
- else
- iniset $cisco_cfg_file CISCO nexus_driver neutron.plugins.cisco.nexus.cisco_nexus_network_driver_v2.CiscoNEXUSDriver
- fi
-
- # Setup the switch configurations
- local nswitch
- local sw_info
- local segment
- local sw_info_array
- declare -i count=0
- for nswitch in ${!Q_CISCO_PLUGIN_SWITCH_INFO[@]}; do
- sw_info=${Q_CISCO_PLUGIN_SWITCH_INFO[$nswitch]}
- sw_info_array=${sw_info//:/ }
- sw_info_array=( $sw_info_array )
- count=${#sw_info_array[@]}
- if [[ $count < 5 || $(( ($count-3) % 2 )) != 0 ]]; then
- die $LINENO "Incorrect switch configuration: ${Q_CISCO_PLUGIN_SWITCH_INFO[$nswitch]}"
- fi
- _config_switch $cisco_cfg_file $nswitch ${sw_info_array[@]}
- done
}
# Configure n1kv plugin
@@ -279,48 +111,29 @@ function _configure_n1kv_subplugin {
}
function neutron_plugin_configure_plugin_agent {
- if _has_ovs_subplugin; then
- ovs_neutron_plugin_configure_plugin_agent
- fi
}
function neutron_plugin_configure_service {
local subplugin
local cisco_cfg_file
- if _has_ovs_subplugin; then
- ovs_neutron_plugin_configure_service
- cisco_cfg_file=/${Q_PLUGIN_EXTRA_CONF_FILES[0]}
- else
- cisco_cfg_file=/$Q_PLUGIN_CONF_FILE
- fi
+ cisco_cfg_file=/$Q_PLUGIN_CONF_FILE
# Setup the [CISCO_PLUGINS] section
if [[ ${#Q_CISCO_PLUGIN_SUBPLUGINS[@]} > 2 ]]; then
die $LINENO "At most two subplugins are supported."
fi
- if _has_ovs_subplugin && _has_n1kv_subplugin; then
- die $LINENO "OVS subplugin and n1kv subplugin cannot coexist"
- fi
-
# Setup the subplugins
- inicomment $cisco_cfg_file CISCO_PLUGINS nexus_plugin
inicomment $cisco_cfg_file CISCO_PLUGINS vswitch_plugin
inicomment $cisco_cfg_file CISCO_TEST host
for subplugin in ${Q_CISCO_PLUGIN_SUBPLUGINS[@]}; do
case $subplugin in
- nexus) iniset $cisco_cfg_file CISCO_PLUGINS nexus_plugin neutron.plugins.cisco.nexus.cisco_nexus_plugin_v2.NexusPlugin;;
- openvswitch) iniset $cisco_cfg_file CISCO_PLUGINS vswitch_plugin neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2;;
n1kv) iniset $cisco_cfg_file CISCO_PLUGINS vswitch_plugin neutron.plugins.cisco.n1kv.n1kv_neutron_plugin.N1kvNeutronPluginV2;;
*) die $LINENO "Unsupported cisco subplugin: $subplugin";;
esac
done
- if _has_nexus_subplugin; then
- _configure_nexus_subplugin $cisco_cfg_file
- fi
-
if _has_n1kv_subplugin; then
_configure_n1kv_subplugin $cisco_cfg_file
fi
From 0843f0ab05a7f477cfc83a70f7711f438e7e8cbd Mon Sep 17 00:00:00 2001
From: Akihiro Motoki
Date: Wed, 24 Sep 2014 04:48:14 +0900
Subject: [PATCH 0011/3421] Update Horizon Neutron-related settings
- Horizon no longer has "enable_security_group" setting
so we need to remove it.
- There is no need to set enable_lb/firewall/vpn to True
when q-lbaas/q-fwaas/q-vpn is enabled because Horizon now checks if
Neutron ext-list and enables corresponding dashboards accordingly.
Change-Id: I37073d73e4cba0103ab1a3d935302f1cd0ef73c5
---
lib/horizon | 18 ------------------
1 file changed, 18 deletions(-)
diff --git a/lib/horizon b/lib/horizon
index c0c3f821e4..07cf31b79f 100644
--- a/lib/horizon
+++ b/lib/horizon
@@ -92,24 +92,6 @@ function init_horizon {
local local_settings=$HORIZON_DIR/openstack_dashboard/local/local_settings.py
cp $HORIZON_SETTINGS $local_settings
- if is_service_enabled neutron; then
- _horizon_config_set $local_settings OPENSTACK_NEUTRON_NETWORK enable_security_group $Q_USE_SECGROUP
- fi
- # enable loadbalancer dashboard in case service is enabled
- if is_service_enabled q-lbaas; then
- _horizon_config_set $local_settings OPENSTACK_NEUTRON_NETWORK enable_lb True
- fi
-
- # enable firewall dashboard in case service is enabled
- if is_service_enabled q-fwaas; then
- _horizon_config_set $local_settings OPENSTACK_NEUTRON_NETWORK enable_firewall True
- fi
-
- # enable VPN dashboard in case service is enabled
- if is_service_enabled q-vpn; then
- _horizon_config_set $local_settings OPENSTACK_NEUTRON_NETWORK enable_vpn True
- fi
-
_horizon_config_set $local_settings "" OPENSTACK_HOST \"${KEYSTONE_SERVICE_HOST}\"
_horizon_config_set $local_settings "" OPENSTACK_KEYSTONE_URL "\"${KEYSTONE_SERVICE_PROTOCOL}://${KEYSTONE_SERVICE_HOST}:${KEYSTONE_SERVICE_PORT}/v2.0\""
if [[ -n "$KEYSTONE_TOKEN_HASH_ALGORITHM" ]]; then
From cbd892b4363716be3d900ba753c81c06639fa97d Mon Sep 17 00:00:00 2001
From: Thomas Bechtold
Date: Wed, 24 Sep 2014 14:50:45 +0200
Subject: [PATCH 0012/3421] Install haproxy on SUSE distros
haproxy package is available for SUSE distros, so install it.
Change-Id: If363dbf439dbea9aafd265c2c665ff4c2b733738
---
lib/neutron_plugins/services/loadbalancer | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/lib/neutron_plugins/services/loadbalancer b/lib/neutron_plugins/services/loadbalancer
index 78e7738345..f84b71076d 100644
--- a/lib/neutron_plugins/services/loadbalancer
+++ b/lib/neutron_plugins/services/loadbalancer
@@ -10,11 +10,8 @@ AGENT_LBAAS_BINARY="$NEUTRON_BIN_DIR/neutron-lbaas-agent"
LBAAS_PLUGIN=neutron.services.loadbalancer.plugin.LoadBalancerPlugin
function neutron_agent_lbaas_install_agent_packages {
- if is_ubuntu || is_fedora; then
+ if is_ubuntu || is_fedora || is_suse; then
install_package haproxy
- elif is_suse; then
- ### FIXME: Find out if package can be pushed to Factory
- echo "HAProxy packages can be installed from server:http project in OBS"
fi
}
From 18d4778cf7bffa60eb2e996a13c129c64f83575f Mon Sep 17 00:00:00 2001
From: Rob Crittenden
Date: Wed, 19 Mar 2014 17:47:42 -0400
Subject: [PATCH 0013/3421] Configure endpoints to use SSL natively or via
proxy
Configure nova, cinder, glance, swift and neutron to use SSL
on the endpoints using either SSL natively or via a TLS proxy
using stud.
To enable SSL via proxy, in local.conf add
ENABLED_SERVICES+=,tls-proxy
This will create a new test root CA, a subordinate CA and an SSL
server cert. It uses the value of hostname -f for the certificate
subject. The CA certicates are also added to the system CA bundle.
To enable SSL natively, in local.conf add:
USE_SSL=True
Native SSL by default will also use the devstack-generate root and
subordinate CA.
You can override this on a per-service basis by setting
_SSL_CERT=/path/to/cert
_SSL_KEY=/path/to/key
_SSL_PATH=/path/to/ca
You should also set SERVICE_HOST to the FQDN of the host. This
value defaults to the host IP address.
Change-Id: I36fe56c063ca921131ad98439bd452cb135916ac
Closes-Bug: 1328226
---
files/apache-keystone.template | 6 +++
files/rpms/keystone | 1 +
functions | 20 +++++-----
lib/cinder | 25 ++++++++++++-
lib/glance | 55 ++++++++++++++++++++++++---
lib/heat | 14 ++++++-
lib/keystone | 43 +++++++++++++++++----
lib/neutron | 49 +++++++++++++++++++++---
lib/nova | 51 ++++++++++++++++++++++---
lib/swift | 32 +++++++++++++---
lib/tempest | 2 +-
lib/tls | 68 +++++++++++++++++++++++++++++-----
stack.sh | 11 +++++-
13 files changed, 326 insertions(+), 51 deletions(-)
diff --git a/files/apache-keystone.template b/files/apache-keystone.template
index 0a286b929c..88492d3408 100644
--- a/files/apache-keystone.template
+++ b/files/apache-keystone.template
@@ -11,6 +11,9 @@ Listen %ADMINPORT%
ErrorLog /var/log/%APACHE_NAME%/keystone.log
CustomLog /var/log/%APACHE_NAME%/keystone_access.log combined
+ %SSLENGINE%
+ %SSLCERTFILE%
+ %SSLKEYFILE%
@@ -23,6 +26,9 @@ Listen %ADMINPORT%
ErrorLog /var/log/%APACHE_NAME%/keystone.log
CustomLog /var/log/%APACHE_NAME%/keystone_access.log combined
+ %SSLENGINE%
+ %SSLCERTFILE%
+ %SSLKEYFILE%
# Workaround for missing path on RHEL6, see
diff --git a/files/rpms/keystone b/files/rpms/keystone
index e1873b7564..ce41ee598b 100644
--- a/files/rpms/keystone
+++ b/files/rpms/keystone
@@ -9,5 +9,6 @@ python-routes
python-sqlalchemy
python-webob
sqlite
+mod_ssl
# Deps installed via pip for RHEL
diff --git a/functions b/functions
index 0194acf64e..376aff05e3 100644
--- a/functions
+++ b/functions
@@ -73,7 +73,7 @@ function upload_image {
# OpenVZ-format images are provided as .tar.gz, but not decompressed prior to loading
if [[ "$image_url" =~ 'openvz' ]]; then
image_name="${image_fname%.tar.gz}"
- openstack --os-token $token --os-url http://$GLANCE_HOSTPORT image create "$image_name" --public --container-format ami --disk-format ami < "${image}"
+ openstack --os-token $token --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image create "$image_name" --public --container-format ami --disk-format ami < "${image}"
return
fi
@@ -184,7 +184,7 @@ function upload_image {
vmdk_adapter_type="${props[1]:-$vmdk_adapter_type}"
vmdk_net_adapter="${props[2]:-$vmdk_net_adapter}"
- openstack --os-token $token --os-url http://$GLANCE_HOSTPORT image create "$image_name" --public --container-format bare --disk-format vmdk --property vmware_disktype="$vmdk_disktype" --property vmware_adaptertype="$vmdk_adapter_type" --property hw_vif_model="$vmdk_net_adapter" < "${image}"
+ openstack --os-token $token --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image create "$image_name" --public --container-format bare --disk-format vmdk --property vmware_disktype="$vmdk_disktype" --property vmware_adaptertype="$vmdk_adapter_type" --property hw_vif_model="$vmdk_net_adapter" < "${image}"
return
fi
@@ -202,7 +202,7 @@ function upload_image {
fi
openstack \
--os-token $token \
- --os-url http://$GLANCE_HOSTPORT \
+ --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT \
image create \
"$image_name" --public \
--container-format=ovf --disk-format=vhd \
@@ -217,7 +217,7 @@ function upload_image {
image_name="${image_fname%.xen-raw.tgz}"
openstack \
--os-token $token \
- --os-url http://$GLANCE_HOSTPORT \
+ --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT \
image create \
"$image_name" --public \
--container-format=tgz --disk-format=raw \
@@ -295,9 +295,9 @@ function upload_image {
if [ "$container_format" = "bare" ]; then
if [ "$unpack" = "zcat" ]; then
- openstack --os-token $token --os-url http://$GLANCE_HOSTPORT image create "$image_name" $img_property --public --container-format=$container_format --disk-format $disk_format < <(zcat --force "${image}")
+ openstack --os-token $token --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image create "$image_name" $img_property --public --container-format=$container_format --disk-format $disk_format < <(zcat --force "${image}")
else
- openstack --os-token $token --os-url http://$GLANCE_HOSTPORT image create "$image_name" $img_property --public --container-format=$container_format --disk-format $disk_format < "${image}"
+ openstack --os-token $token --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image create "$image_name" $img_property --public --container-format=$container_format --disk-format $disk_format < "${image}"
fi
else
# Use glance client to add the kernel the root filesystem.
@@ -305,12 +305,12 @@ function upload_image {
# kernel for use when uploading the root filesystem.
local kernel_id="" ramdisk_id="";
if [ -n "$kernel" ]; then
- kernel_id=$(openstack --os-token $token --os-url http://$GLANCE_HOSTPORT image create "$image_name-kernel" $img_property --public --container-format aki --disk-format aki < "$kernel" | grep ' id ' | get_field 2)
+ kernel_id=$(openstack --os-token $token --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image create "$image_name-kernel" $img_property --public --container-format aki --disk-format aki < "$kernel" | grep ' id ' | get_field 2)
fi
if [ -n "$ramdisk" ]; then
- ramdisk_id=$(openstack --os-token $token --os-url http://$GLANCE_HOSTPORT image create "$image_name-ramdisk" $img_property --public --container-format ari --disk-format ari < "$ramdisk" | grep ' id ' | get_field 2)
+ ramdisk_id=$(openstack --os-token $token --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image create "$image_name-ramdisk" $img_property --public --container-format ari --disk-format ari < "$ramdisk" | grep ' id ' | get_field 2)
fi
- openstack --os-token $token --os-url http://$GLANCE_HOSTPORT image create "${image_name%.img}" $img_property --public --container-format ami --disk-format ami ${kernel_id:+--property kernel_id=$kernel_id} ${ramdisk_id:+--property ramdisk_id=$ramdisk_id} < "${image}"
+ openstack --os-token $token --os-url $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT image create "${image_name%.img}" $img_property --public --container-format ami --disk-format ami ${kernel_id:+--property kernel_id=$kernel_id} ${ramdisk_id:+--property ramdisk_id=$ramdisk_id} < "${image}"
fi
}
@@ -339,7 +339,7 @@ function use_database {
function wait_for_service {
local timeout=$1
local url=$2
- timeout $timeout sh -c "while ! curl --noproxy '*' -s $url >/dev/null; do sleep 1; done"
+ timeout $timeout sh -c "while ! curl -k --noproxy '*' -s $url >/dev/null; do sleep 1; done"
}
diff --git a/lib/cinder b/lib/cinder
index cbca9c0c1d..b30a036d16 100644
--- a/lib/cinder
+++ b/lib/cinder
@@ -46,6 +46,9 @@ CINDER_CONF=$CINDER_CONF_DIR/cinder.conf
CINDER_API_PASTE_INI=$CINDER_CONF_DIR/api-paste.ini
# Public facing bits
+if is_ssl_enabled_service "cinder" || is_service_enabled tls-proxy; then
+ CINDER_SERVICE_PROTOCOL="https"
+fi
CINDER_SERVICE_HOST=${CINDER_SERVICE_HOST:-$SERVICE_HOST}
CINDER_SERVICE_PORT=${CINDER_SERVICE_PORT:-8776}
CINDER_SERVICE_PORT_INT=${CINDER_SERVICE_PORT_INT:-18776}
@@ -299,6 +302,20 @@ function configure_cinder {
fi
iniset $CINDER_CONF DEFAULT osapi_volume_workers "$API_WORKERS"
+
+ iniset $CINDER_CONF DEFAULT glance_api_servers "${GLANCE_SERVICE_PROTOCOL}://${GLANCE_HOSTPORT}"
+ if is_ssl_enabled_service glance || is_service_enabled tls-proxy; then
+ iniset $CINDER_CONF DEFAULT glance_protocol https
+ fi
+
+ # Register SSL certificates if provided
+ if is_ssl_enabled_service cinder; then
+ ensure_certificates CINDER
+
+ iniset $CINDER_CONF DEFAULT ssl_cert_file "$CINDER_SSL_CERT"
+ iniset $CINDER_CONF DEFAULT ssl_key_file "$CINDER_SSL_KEY"
+ fi
+
}
# create_cinder_accounts() - Set up common required cinder accounts
@@ -399,6 +416,12 @@ function _configure_tgt_for_config_d {
# start_cinder() - Start running processes, including screen
function start_cinder {
+ local service_port=$CINDER_SERVICE_PORT
+ local service_protocol=$CINDER_SERVICE_PROTOCOL
+ if is_service_enabled tls-proxy; then
+ service_port=$CINDER_SERVICE_PORT_INT
+ service_protocol="http"
+ fi
if is_service_enabled c-vol; then
# Delete any old stack.conf
sudo rm -f /etc/tgt/conf.d/stack.conf
@@ -425,7 +448,7 @@ function start_cinder {
run_process c-api "$CINDER_BIN_DIR/cinder-api --config-file $CINDER_CONF"
echo "Waiting for Cinder API to start..."
- if ! wait_for_service $SERVICE_TIMEOUT $CINDER_SERVICE_PROTOCOL://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT; then
+ if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$CINDER_SERVICE_HOST:$service_port; then
die $LINENO "c-api did not start"
fi
diff --git a/lib/glance b/lib/glance
index 6ca2fb5ca6..4194842407 100644
--- a/lib/glance
+++ b/lib/glance
@@ -51,8 +51,18 @@ else
GLANCE_BIN_DIR=$(get_python_exec_prefix)
fi
+if is_ssl_enabled_service "glance" || is_service_enabled tls-proxy; then
+ GLANCE_SERVICE_PROTOCOL="https"
+fi
+
# Glance connection info. Note the port must be specified.
-GLANCE_HOSTPORT=${GLANCE_HOSTPORT:-$SERVICE_HOST:9292}
+GLANCE_SERVICE_HOST=${GLANCE_SERVICE_HOST:-$SERVICE_HOST}
+GLANCE_SERVICE_PORT=${GLANCE_SERVICE_PORT:-9292}
+GLANCE_SERVICE_PORT_INT=${GLANCE_SERVICE_PORT_INT:-19292}
+GLANCE_HOSTPORT=${GLANCE_HOSTPORT:-$GLANCE_SERVICE_HOST:$GLANCE_SERVICE_PORT}
+GLANCE_SERVICE_PROTOCOL=${GLANCE_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
+GLANCE_REGISTRY_PORT=${GLANCE_REGISTRY_PORT:-9191}
+GLANCE_REGISTRY_PORT_INT=${GLANCE_REGISTRY_PORT_INT:-19191}
# Tell Tempest this project is present
TEMPEST_SERVICES+=,glance
@@ -148,6 +158,26 @@ function configure_glance {
iniset $GLANCE_API_CONF glance_store stores "file, http, swift"
fi
+ if is_service_enabled tls-proxy; then
+ iniset $GLANCE_API_CONF DEFAULT bind_port $GLANCE_SERVICE_PORT_INT
+ iniset $GLANCE_REGISTRY_CONF DEFAULT bind_port $GLANCE_REGISTRY_PORT_INT
+ fi
+
+ # Register SSL certificates if provided
+ if is_ssl_enabled_service glance; then
+ ensure_certificates GLANCE
+
+ iniset $GLANCE_API_CONF DEFAULT cert_file "$GLANCE_SSL_CERT"
+ iniset $GLANCE_API_CONF DEFAULT key_file "$GLANCE_SSL_KEY"
+
+ iniset $GLANCE_REGISTRY_CONF DEFAULT cert_file "$GLANCE_SSL_CERT"
+ iniset $GLANCE_REGISTRY_CONF DEFAULT key_file "$GLANCE_SSL_KEY"
+ fi
+
+ if is_ssl_enabled_service glance || is_service_enabled tls-proxy; then
+ iniset $GLANCE_API_CONF DEFAULT registry_client_protocol https
+ fi
+
cp -p $GLANCE_DIR/etc/glance-registry-paste.ini $GLANCE_REGISTRY_PASTE_INI
cp -p $GLANCE_DIR/etc/glance-api-paste.ini $GLANCE_API_PASTE_INI
@@ -176,6 +206,14 @@ function configure_glance {
cp -p $GLANCE_DIR/etc/schema-image.json $GLANCE_SCHEMA_JSON
cp -p $GLANCE_DIR/etc/metadefs/*.json $GLANCE_METADEF_DIR
+
+ if is_ssl_enabled_service "cinder" || is_service_enabled tls-proxy; then
+ CINDER_SERVICE_HOST=${CINDER_SERVICE_HOST:-$SERVICE_HOST}
+ CINDER_SERVICE_PORT=${CINDER_SERVICE_PORT:-8776}
+
+ iniset $GLANCE_API_CONF DEFAULT cinder_endpoint_template "https://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT/v1/%(project_id)s"
+ iniset $GLANCE_CACHE_CONF DEFAULT cinder_endpoint_template "https://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT/v1/%(project_id)s"
+ fi
}
# create_glance_accounts() - Set up common required glance accounts
@@ -206,9 +244,9 @@ function create_glance_accounts {
"image" "Glance Image Service")
get_or_create_endpoint $glance_service \
"$REGION_NAME" \
- "http://$GLANCE_HOSTPORT" \
- "http://$GLANCE_HOSTPORT" \
- "http://$GLANCE_HOSTPORT"
+ "$GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT" \
+ "$GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT" \
+ "$GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT"
fi
fi
}
@@ -265,10 +303,17 @@ function install_glance {
# start_glance() - Start running processes, including screen
function start_glance {
+ local service_protocol=$GLANCE_SERVICE_PROTOCOL
+ if is_service_enabled tls-proxy; then
+ start_tls_proxy '*' $GLANCE_SERVICE_PORT $GLANCE_SERVICE_HOST $GLANCE_SERVICE_PORT_INT &
+ start_tls_proxy '*' $GLANCE_REGISTRY_PORT $GLANCE_SERVICE_HOST $GLANCE_REGISTRY_PORT_INT &
+ fi
+
run_process g-reg "$GLANCE_BIN_DIR/glance-registry --config-file=$GLANCE_CONF_DIR/glance-registry.conf"
run_process g-api "$GLANCE_BIN_DIR/glance-api --config-file=$GLANCE_CONF_DIR/glance-api.conf"
+
echo "Waiting for g-api ($GLANCE_HOSTPORT) to start..."
- if ! timeout $SERVICE_TIMEOUT sh -c "while ! wget --no-proxy -q -O- http://$GLANCE_HOSTPORT; do sleep 1; done"; then
+ if ! wait_for_service $SERVICE_TIMEOUT $GLANCE_SERVICE_PROTOCOL://$GLANCE_HOSTPORT; then
die $LINENO "g-api did not start"
fi
}
diff --git a/lib/heat b/lib/heat
index f64cc9041c..ff3b307e5b 100644
--- a/lib/heat
+++ b/lib/heat
@@ -113,7 +113,7 @@ function configure_heat {
configure_auth_token_middleware $HEAT_CONF heat $HEAT_AUTH_CACHE_DIR
if is_ssl_enabled_service "key"; then
- iniset $HEAT_CONF clients_keystone ca_file $KEYSTONE_SSL_CA
+ iniset $HEAT_CONF clients_keystone ca_file $SSL_BUNDLE_FILE
fi
# ec2authtoken
@@ -131,6 +131,18 @@ function configure_heat {
# Cloudwatch API
iniset $HEAT_CONF heat_api_cloudwatch bind_port $HEAT_API_CW_PORT
+ if is_ssl_enabled_service "key" || is_service_enabled tls-proxy; then
+ iniset $HEAT_CONF clients_keystone ca_file $SSL_BUNDLE_FILE
+ fi
+
+ if is_ssl_enabled_service "nova" || is_service_enabled tls-proxy; then
+ iniset $HEAT_CONF clients_nova ca_file $SSL_BUNDLE_FILE
+ fi
+
+ if is_ssl_enabled_service "cinder" || is_service_enabled tls-proxy; then
+ iniset $HEAT_CONF clients_cinder ca_file $SSL_BUNDLE_FILE
+ fi
+
# heat environment
sudo mkdir -p $HEAT_ENV_DIR
sudo chown $STACK_USER $HEAT_ENV_DIR
diff --git a/lib/keystone b/lib/keystone
index 9eca80a3dd..a7742a9f2c 100644
--- a/lib/keystone
+++ b/lib/keystone
@@ -95,7 +95,7 @@ KEYSTONE_VALID_IDENTITY_BACKENDS=kvs,ldap,pam,sql
KEYSTONE_VALID_ASSIGNMENT_BACKENDS=kvs,ldap,sql
# if we are running with SSL use https protocols
-if is_ssl_enabled_service "key"; then
+if is_ssl_enabled_service "key" || is_service_enabled tls-proxy; then
KEYSTONE_AUTH_PROTOCOL="https"
KEYSTONE_SERVICE_PROTOCOL="https"
fi
@@ -123,7 +123,21 @@ function _config_keystone_apache_wsgi {
sudo mkdir -p $KEYSTONE_WSGI_DIR
local keystone_apache_conf=$(apache_site_config_for keystone)
- local apache_version=$(get_apache_version)
+ local keystone_ssl=""
+ local keystone_certfile=""
+ local keystone_keyfile=""
+ local keystone_service_port=$KEYSTONE_SERVICE_PORT
+ local keystone_auth_port=$KEYSTONE_AUTH_PORT
+
+ if is_ssl_enabled_service key; then
+ keystone_ssl="SSLEngine On"
+ keystone_certfile="SSLCertificateFile $KEYSTONE_SSL_CERT"
+ keystone_keyfile="SSLCertificateKeyFile $KEYSTONE_SSL_KEY"
+ fi
+ if is_service_enabled tls-proxy; then
+ keystone_service_port=$KEYSTONE_SERVICE_PORT_INT
+ keystone_auth_port=$KEYSTONE_AUTH_PORT_INT
+ fi
# copy proxy vhost and wsgi file
sudo cp $KEYSTONE_DIR/httpd/keystone.py $KEYSTONE_WSGI_DIR/main
@@ -131,11 +145,14 @@ function _config_keystone_apache_wsgi {
sudo cp $FILES/apache-keystone.template $keystone_apache_conf
sudo sed -e "
- s|%PUBLICPORT%|$KEYSTONE_SERVICE_PORT|g;
- s|%ADMINPORT%|$KEYSTONE_AUTH_PORT|g;
+ s|%PUBLICPORT%|$keystone_service_port|g;
+ s|%ADMINPORT%|$keystone_auth_port|g;
s|%APACHE_NAME%|$APACHE_NAME|g;
s|%PUBLICWSGI%|$KEYSTONE_WSGI_DIR/main|g;
s|%ADMINWSGI%|$KEYSTONE_WSGI_DIR/admin|g;
+ s|%SSLENGINE%|$keystone_ssl|g;
+ s|%SSLCERTFILE%|$keystone_certfile|g;
+ s|%SSLKEYFILE%|$keystone_keyfile|g;
s|%USER%|$STACK_USER|g
" -i $keystone_apache_conf
}
@@ -200,8 +217,13 @@ function configure_keystone {
fi
# Set the URL advertised in the ``versions`` structure returned by the '/' route
- iniset $KEYSTONE_CONF DEFAULT public_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:%(public_port)s/"
- iniset $KEYSTONE_CONF DEFAULT admin_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:%(admin_port)s/"
+ if is_service_enabled tls-proxy; then
+ iniset $KEYSTONE_CONF DEFAULT public_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/"
+ iniset $KEYSTONE_CONF DEFAULT admin_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_AUTH_PORT/"
+ else
+ iniset $KEYSTONE_CONF DEFAULT public_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:%(public_port)s/"
+ iniset $KEYSTONE_CONF DEFAULT admin_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:%(admin_port)s/"
+ fi
iniset $KEYSTONE_CONF DEFAULT admin_bind_host "$KEYSTONE_ADMIN_BIND_HOST"
# Register SSL certificates if provided
@@ -412,7 +434,7 @@ function configure_auth_token_middleware {
iniset $conf_file $section auth_port $KEYSTONE_AUTH_PORT
iniset $conf_file $section auth_protocol $KEYSTONE_AUTH_PROTOCOL
iniset $conf_file $section identity_uri $KEYSTONE_AUTH_URI
- iniset $conf_file $section cafile $KEYSTONE_SSL_CA
+ iniset $conf_file $section cafile $SSL_BUNDLE_FILE
configure_API_version $conf_file $IDENTITY_API_VERSION $section
iniset $conf_file $section admin_tenant_name $SERVICE_TENANT_NAME
iniset $conf_file $section admin_user $admin_user
@@ -489,6 +511,9 @@ function install_keystone {
setup_develop $KEYSTONE_DIR
if [ "$KEYSTONE_USE_MOD_WSGI" == "True" ]; then
install_apache_wsgi
+ if is_ssl_enabled_service "key"; then
+ enable_mod_ssl
+ fi
fi
}
@@ -496,8 +521,10 @@ function install_keystone {
function start_keystone {
# Get right service port for testing
local service_port=$KEYSTONE_SERVICE_PORT
+ local auth_protocol=$KEYSTONE_AUTH_PROTOCOL
if is_service_enabled tls-proxy; then
service_port=$KEYSTONE_SERVICE_PORT_INT
+ auth_protocol="http"
fi
if [ "$KEYSTONE_USE_MOD_WSGI" == "True" ]; then
@@ -514,7 +541,7 @@ function start_keystone {
# Check that the keystone service is running. Even if the tls tunnel
# should be enabled, make sure the internal port is checked using
# unencryted traffic at this point.
- if ! timeout $SERVICE_TIMEOUT sh -c "while ! curl --noproxy '*' -k -s http://$KEYSTONE_SERVICE_HOST:$service_port/v$IDENTITY_API_VERSION/ >/dev/null; do sleep 1; done"; then
+ if ! timeout $SERVICE_TIMEOUT sh -c "while ! curl --noproxy '*' -k -s $auth_protocol://$KEYSTONE_SERVICE_HOST:$service_port/v$IDENTITY_API_VERSION/ >/dev/null; do sleep 1; done"; then
die $LINENO "keystone did not start"
fi
diff --git a/lib/neutron b/lib/neutron
index 96cd47bdb6..81f2697abb 100644
--- a/lib/neutron
+++ b/lib/neutron
@@ -69,6 +69,11 @@ PUBLIC_NETWORK_GATEWAY=${PUBLIC_NETWORK_GATEWAY:-172.24.4.1}
PRIVATE_SUBNET_NAME=${PRIVATE_SUBNET_NAME:-"private-subnet"}
PUBLIC_SUBNET_NAME=${PUBLIC_SUBNET_NAME:-"public-subnet"}
+if is_ssl_enabled_service "neutron" || is_service_enabled tls-proxy; then
+ Q_PROTOCOL="https"
+fi
+
+
# Set up default directories
NEUTRON_DIR=$DEST/neutron
NEUTRONCLIENT_DIR=$DEST/python-neutronclient
@@ -105,8 +110,12 @@ Q_DB_NAME=${Q_DB_NAME:-neutron}
Q_PLUGIN=${Q_PLUGIN:-ml2}
# Default Neutron Port
Q_PORT=${Q_PORT:-9696}
+# Default Neutron Internal Port when using TLS proxy
+Q_PORT_INT=${Q_PORT_INT:-19696}
# Default Neutron Host
Q_HOST=${Q_HOST:-$SERVICE_HOST}
+# Default protocol
+Q_PROTOCOL=${Q_PROTOCOL:-$SERVICE_PROTOCOL}
# Default admin username
Q_ADMIN_USERNAME=${Q_ADMIN_USERNAME:-neutron}
# Default auth strategy
@@ -409,7 +418,7 @@ function create_nova_conf_neutron {
iniset $NOVA_CONF neutron auth_strategy "$Q_AUTH_STRATEGY"
iniset $NOVA_CONF neutron admin_tenant_name "$SERVICE_TENANT_NAME"
iniset $NOVA_CONF neutron region_name "$REGION_NAME"
- iniset $NOVA_CONF neutron url "http://$Q_HOST:$Q_PORT"
+ iniset $NOVA_CONF neutron url "${Q_PROTOCOL}://$Q_HOST:$Q_PORT"
if [[ "$Q_USE_SECGROUP" == "True" ]]; then
LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver
@@ -462,9 +471,9 @@ function create_neutron_accounts {
"network" "Neutron Service")
get_or_create_endpoint $neutron_service \
"$REGION_NAME" \
- "http://$SERVICE_HOST:$Q_PORT/" \
- "http://$SERVICE_HOST:$Q_PORT/" \
- "http://$SERVICE_HOST:$Q_PORT/"
+ "$Q_PROTOCOL://$SERVICE_HOST:$Q_PORT/" \
+ "$Q_PROTOCOL://$SERVICE_HOST:$Q_PORT/" \
+ "$Q_PROTOCOL://$SERVICE_HOST:$Q_PORT/"
fi
fi
}
@@ -590,12 +599,25 @@ function install_neutron_agent_packages {
# Start running processes, including screen
function start_neutron_service_and_check {
local cfg_file_options="$(determine_config_files neutron-server)"
+ local service_port=$Q_PORT
+ local service_protocol=$Q_PROTOCOL
+ if is_service_enabled tls-proxy; then
+ service_port=$Q_PORT_INT
+ service_protocol="http"
+ fi
# Start the Neutron service
run_process q-svc "python $NEUTRON_BIN_DIR/neutron-server $cfg_file_options"
echo "Waiting for Neutron to start..."
- if ! timeout $SERVICE_TIMEOUT sh -c "while ! wget --no-proxy -q -O- http://$Q_HOST:$Q_PORT; do sleep 1; done"; then
+ if is_ssl_enabled_service "neutron"; then
+ ssl_ca="--ca-certificate=${SSL_BUNDLE_FILE}"
+ fi
+ if ! timeout $SERVICE_TIMEOUT sh -c "while ! wget ${ssl_ca} --no-proxy -q -O- $service_protocol://$Q_HOST:$service_port; do sleep 1; done"; then
die $LINENO "Neutron did not start"
fi
+ # Start proxy if enabled
+ if is_service_enabled tls-proxy; then
+ start_tls_proxy '*' $Q_PORT $Q_HOST $Q_PORT_INT &
+ fi
}
# Start running processes, including screen
@@ -730,6 +752,23 @@ function _configure_neutron_common {
setup_colorized_logging $NEUTRON_CONF DEFAULT project_id
fi
+ if is_service_enabled tls-proxy; then
+ # Set the service port for a proxy to take the original
+ iniset $NEUTRON_CONF DEFAULT bind_port "$Q_PORT_INT"
+ fi
+
+ if is_ssl_enabled_service "nova"; then
+ iniset $NEUTRON_CONF DEFAULT nova_ca_certificates_file "$SSL_BUNDLE_FILE"
+ fi
+
+ if is_ssl_enabled_service "neutron"; then
+ ensure_certificates NEUTRON
+
+ iniset $NEUTRON_CONF DEFAULT use_ssl True
+ iniset $NEUTRON_CONF DEFAULT ssl_cert_file "$NEUTRON_SSL_CERT"
+ iniset $NEUTRON_CONF DEFAULT ssl_key_file "$NEUTRON_SSL_KEY"
+ fi
+
_neutron_setup_rootwrap
}
diff --git a/lib/nova b/lib/nova
index 2a3aae1835..cfa6f7a8ec 100644
--- a/lib/nova
+++ b/lib/nova
@@ -44,11 +44,20 @@ NOVA_CELLS_DB=${NOVA_CELLS_DB:-nova_cell}
NOVA_API_PASTE_INI=${NOVA_API_PASTE_INI:-$NOVA_CONF_DIR/api-paste.ini}
+if is_ssl_enabled_service "nova" || is_service_enabled tls-proxy; then
+ NOVA_SERVICE_PROTOCOL="https"
+ EC2_SERVICE_PROTOCOL="https"
+else
+ EC2_SERVICE_PROTOCOL="http"
+fi
+
# Public facing bits
NOVA_SERVICE_HOST=${NOVA_SERVICE_HOST:-$SERVICE_HOST}
NOVA_SERVICE_PORT=${NOVA_SERVICE_PORT:-8774}
NOVA_SERVICE_PORT_INT=${NOVA_SERVICE_PORT_INT:-18774}
NOVA_SERVICE_PROTOCOL=${NOVA_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
+EC2_SERVICE_PORT=${EC2_SERVICE_PORT:-8773}
+EC2_SERVICE_PORT_INT=${EC2_SERVICE_PORT_INT:-18773}
# Support entry points installation of console scripts
if [[ -d $NOVA_DIR/bin ]]; then
@@ -375,9 +384,9 @@ create_nova_accounts() {
"ec2" "EC2 Compatibility Layer")
get_or_create_endpoint $ec2_service \
"$REGION_NAME" \
- "http://$SERVICE_HOST:8773/services/Cloud" \
- "http://$SERVICE_HOST:8773/services/Admin" \
- "http://$SERVICE_HOST:8773/services/Cloud"
+ "$EC2_SERVICE_PROTOCOL://$SERVICE_HOST:8773/services/Cloud" \
+ "$EC2_SERVICE_PROTOCOL://$SERVICE_HOST:8773/services/Admin" \
+ "$EC2_SERVICE_PROTOCOL://$SERVICE_HOST:8773/services/Cloud"
fi
fi
@@ -441,6 +450,16 @@ function create_nova_conf {
configure_auth_token_middleware $NOVA_CONF nova $NOVA_AUTH_CACHE_DIR
fi
+ if is_service_enabled cinder; then
+ iniset $NOVA_CONF DEFAULT volume_api_class "nova.volume.cinder.API"
+ if is_ssl_enabled_service "cinder" || is_service_enabled tls-proxy; then
+ CINDER_SERVICE_HOST=${CINDER_SERVICE_HOST:-$SERVICE_HOST}
+ CINDER_SERVICE_PORT=${CINDER_SERVICE_PORT:-8776}
+ iniset $NOVA_CONF DEFAULT cinder_endpoint_template "https://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT/v1/%(project_id)s"
+ iniset $NOVA_CONF DEFAULT cinder_ca_certificates_file $SSL_BUNDLE_FILE
+ fi
+ fi
+
if [ -n "$NOVA_STATE_PATH" ]; then
iniset $NOVA_CONF DEFAULT state_path "$NOVA_STATE_PATH"
iniset $NOVA_CONF DEFAULT lock_path "$NOVA_STATE_PATH"
@@ -508,12 +527,31 @@ function create_nova_conf {
fi
iniset $NOVA_CONF DEFAULT ec2_dmz_host "$EC2_DMZ_HOST"
+ iniset $NOVA_CONF DEFAULT keystone_ec2_url $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/ec2tokens
iniset_rpc_backend nova $NOVA_CONF DEFAULT
- iniset $NOVA_CONF glance api_servers "$GLANCE_HOSTPORT"
+ iniset $NOVA_CONF glance api_servers "${GLANCE_SERVICE_PROTOCOL}://${GLANCE_HOSTPORT}"
iniset $NOVA_CONF DEFAULT osci_compute_workers "$API_WORKERS"
iniset $NOVA_CONF DEFAULT ec2_workers "$API_WORKERS"
iniset $NOVA_CONF DEFAULT metadata_workers "$API_WORKERS"
+
+ if is_ssl_enabled_service glance || is_service_enabled tls-proxy; then
+ iniset $NOVA_CONF DEFAULT glance_protocol https
+ fi
+
+ # Register SSL certificates if provided
+ if is_ssl_enabled_service nova; then
+ ensure_certificates NOVA
+
+ iniset $NOVA_CONF DEFAULT ssl_cert_file "$NOVA_SSL_CERT"
+ iniset $NOVA_CONF DEFAULT ssl_key_file "$NOVA_SSL_KEY"
+
+ iniset $NOVA_CONF DEFAULT enabled_ssl_apis "$NOVA_ENABLED_APIS"
+ fi
+
+ if is_service_enabled tls-proxy; then
+ iniset $NOVA_CONF DEFAULT ec2_listen_port $EC2_SERVICE_PORT_INT
+ fi
}
function init_nova_cells {
@@ -642,19 +680,22 @@ function install_nova {
function start_nova_api {
# Get right service port for testing
local service_port=$NOVA_SERVICE_PORT
+ local service_protocol=$NOVA_SERVICE_PROTOCOL
if is_service_enabled tls-proxy; then
service_port=$NOVA_SERVICE_PORT_INT
+ service_protocol="http"
fi
run_process n-api "$NOVA_BIN_DIR/nova-api"
echo "Waiting for nova-api to start..."
- if ! wait_for_service $SERVICE_TIMEOUT http://$SERVICE_HOST:$service_port; then
+ if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$SERVICE_HOST:$service_port; then
die $LINENO "nova-api did not start"
fi
# Start proxies if enabled
if is_service_enabled tls-proxy; then
start_tls_proxy '*' $NOVA_SERVICE_PORT $NOVA_SERVICE_HOST $NOVA_SERVICE_PORT_INT &
+ start_tls_proxy '*' $EC2_SERVICE_PORT $NOVA_SERVICE_HOST $EC2_SERVICE_PORT_INT &
fi
}
diff --git a/lib/swift b/lib/swift
index 3c31dd293a..813955226e 100644
--- a/lib/swift
+++ b/lib/swift
@@ -29,6 +29,10 @@ set +o xtrace
# Defaults
# --------
+if is_ssl_enabled_service "s-proxy" || is_service_enabled tls-proxy; then
+ SWIFT_SERVICE_PROTOCOL="https"
+fi
+
# Set up default directories
SWIFT_DIR=$DEST/swift
SWIFTCLIENT_DIR=$DEST/python-swiftclient
@@ -36,6 +40,9 @@ 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
+SWIFT_SERVICE_PROTOCOL=${SWIFT_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
+SWIFT_DEFAULT_BIND_PORT_INT=${SWIFT_DEFAULT_BIND_PORT_INT:-8081}
+
# TODO: add logging to different location.
# Set ``SWIFT_DATA_DIR`` to the location of swift drives and objects.
@@ -334,7 +341,18 @@ function configure_swift {
iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT log_level DEBUG
iniuncomment ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT bind_port
- iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT bind_port ${SWIFT_DEFAULT_BIND_PORT:-8080}
+ if is_service_enabled tls-proxy; then
+ iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT bind_port ${SWIFT_DEFAULT_BIND_PORT_INT}
+ else
+ iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT bind_port ${SWIFT_DEFAULT_BIND_PORT:-8080}
+ fi
+
+ if is_ssl_enabled_service s-proxy; then
+ ensure_certificates SWIFT
+
+ iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT cert_file "$SWIFT_SSL_CERT"
+ iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT key_file "$SWIFT_SSL_KEY"
+ fi
# Devstack is commonly run in a small slow environment, so bump the
# timeouts up.
@@ -401,7 +419,7 @@ paste.filter_factory = keystoneclient.middleware.s3_token:filter_factory
auth_port = ${KEYSTONE_AUTH_PORT}
auth_host = ${KEYSTONE_AUTH_HOST}
auth_protocol = ${KEYSTONE_AUTH_PROTOCOL}
-cafile = ${KEYSTONE_SSL_CA}
+cafile = ${SSL_BUNDLE_FILE}
auth_token = ${SERVICE_TOKEN}
admin_token = ${SERVICE_TOKEN}
@@ -560,9 +578,9 @@ function create_swift_accounts {
"object-store" "Swift Service")
get_or_create_endpoint $swift_service \
"$REGION_NAME" \
- "http://$SERVICE_HOST:8080/v1/AUTH_\$(tenant_id)s" \
- "http://$SERVICE_HOST:8080" \
- "http://$SERVICE_HOST:8080/v1/AUTH_\$(tenant_id)s"
+ "$SWIFT_SERVICE_PROTOCOL://$SERVICE_HOST:8080/v1/AUTH_\$(tenant_id)s" \
+ "$SWIFT_SERVICE_PROTOCOL://$SERVICE_HOST:8080" \
+ "$SWIFT_SERVICE_PROTOCOL://$SERVICE_HOST:8080/v1/AUTH_\$(tenant_id)s"
fi
local swift_tenant_test1=$(get_or_create_project swifttenanttest1)
@@ -675,6 +693,10 @@ function start_swift {
for type in proxy ${todo}; do
swift-init --run-dir=${SWIFT_DATA_DIR}/run ${type} stop || true
done
+ if is_service_enabled tls-proxy; then
+ local proxy_port=${SWIFT_DEFAULT_BIND_PORT:-8080}
+ start_tls_proxy '*' $proxy_port $SERVICE_HOST $SWIFT_DEFAULT_BIND_PORT_INT &
+ fi
run_process s-proxy "$SWIFT_DIR/bin/swift-proxy-server ${SWIFT_CONF_DIR}/proxy-server.conf -v"
if [[ ${SWIFT_REPLICAS} == 1 ]]; then
for type in object container account; do
diff --git a/lib/tempest b/lib/tempest
index 906cb00f95..0e5f9c9496 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -317,7 +317,7 @@ function configure_tempest {
iniset $TEMPEST_CONFIG network-feature-disabled api_extensions ${DISABLE_NETWORK_API_EXTENSIONS}
# boto
- iniset $TEMPEST_CONFIG boto ec2_url "http://$SERVICE_HOST:8773/services/Cloud"
+ 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
diff --git a/lib/tls b/lib/tls
index 061c1cabbf..15e8692556 100644
--- a/lib/tls
+++ b/lib/tls
@@ -14,6 +14,7 @@
#
# - configure_CA
# - init_CA
+# - cleanup_CA
# - configure_proxy
# - start_tls_proxy
@@ -27,6 +28,7 @@
# - start_tls_proxy HOST_IP 5000 localhost 5000
# - ensure_certificates
# - is_ssl_enabled_service
+# - enable_mod_ssl
# Defaults
# --------
@@ -34,14 +36,9 @@
if is_service_enabled tls-proxy; then
# TODO(dtroyer): revisit this below after the search for HOST_IP has been done
TLS_IP=${TLS_IP:-$SERVICE_IP}
-
- # Set the default ``SERVICE_PROTOCOL`` for TLS
- SERVICE_PROTOCOL=https
fi
-# Make up a hostname for cert purposes
-# will be added to /etc/hosts?
-DEVSTACK_HOSTNAME=secure.devstack.org
+DEVSTACK_HOSTNAME=$(hostname -f)
DEVSTACK_CERT_NAME=devstack-cert
DEVSTACK_CERT=$DATA_DIR/$DEVSTACK_CERT_NAME.pem
@@ -209,6 +206,29 @@ function init_CA {
# Create the CA bundle
cat $ROOT_CA_DIR/cacert.pem $INT_CA_DIR/cacert.pem >>$INT_CA_DIR/ca-chain.pem
+ cat $INT_CA_DIR/ca-chain.pem >> $SSL_BUNDLE_FILE
+
+ if is_fedora; then
+ sudo cp $INT_CA_DIR/ca-chain.pem /usr/share/pki/ca-trust-source/anchors/devstack-chain.pem
+ sudo update-ca-trust
+ elif is_ubuntu; then
+ sudo cp $INT_CA_DIR/ca-chain.pem /usr/local/share/ca-certificates/devstack-int.crt
+ sudo cp $ROOT_CA_DIR/cacert.pem /usr/local/share/ca-certificates/devstack-root.crt
+ sudo update-ca-certificates
+ fi
+}
+
+# Clean up the CA files
+# cleanup_CA
+function cleanup_CA {
+ if is_fedora; then
+ sudo rm -f /usr/share/pki/ca-trust-source/anchors/devstack-chain.pem
+ sudo update-ca-trust
+ elif is_ubuntu; then
+ sudo rm -f /usr/local/share/ca-certificates/devstack-int.crt
+ sudo rm -f /usr/local/share/ca-certificates/devstack-root.crt
+ sudo update-ca-certificates
+ fi
}
# Create an initial server cert
@@ -331,6 +351,9 @@ function make_root_CA {
function is_ssl_enabled_service {
local services=$@
local service=""
+ if [ "$USE_SSL" == "False" ]; then
+ return 1
+ fi
for service in ${services}; do
[[ ,${SSL_ENABLED_SERVICES}, =~ ,${service}, ]] && return 0
done
@@ -345,8 +368,12 @@ function is_ssl_enabled_service {
# The function expects to find a certificate, key and CA certificate in the
# variables {service}_SSL_CERT, {service}_SSL_KEY and {service}_SSL_CA. For
# example for keystone this would be KEYSTONE_SSL_CERT, KEYSTONE_SSL_KEY and
-# KEYSTONE_SSL_CA. If it does not find these certificates the program will
-# quit.
+# KEYSTONE_SSL_CA.
+#
+# If it does not find these certificates then the devstack-issued server
+# certificate, key and CA certificate will be associated with the service.
+#
+# If only some of the variables are provided then the function will quit.
function ensure_certificates {
local service=$1
@@ -358,7 +385,15 @@ function ensure_certificates {
local key=${!key_var}
local ca=${!ca_var}
- if [[ -z "$cert" || -z "$key" || -z "$ca" ]]; then
+ if [[ -z "$cert" && -z "$key" && -z "$ca" ]]; then
+ local cert="$INT_CA_DIR/$DEVSTACK_CERT_NAME.crt"
+ local key="$INT_CA_DIR/private/$DEVSTACK_CERT_NAME.key"
+ local ca="$INT_CA_DIR/ca-chain.pem"
+ eval ${service}_SSL_CERT=\$cert
+ eval ${service}_SSL_KEY=\$key
+ eval ${service}_SSL_CA=\$ca
+ return # the CA certificate is already in the bundle
+ elif [[ -z "$cert" || -z "$key" || -z "$ca" ]]; then
die $LINENO "Missing either the ${cert_var} ${key_var} or ${ca_var}" \
"variable to enable SSL for ${service}"
fi
@@ -366,6 +401,21 @@ function ensure_certificates {
cat $ca >> $SSL_BUNDLE_FILE
}
+# Enable the mod_ssl plugin in Apache
+function enable_mod_ssl {
+ echo "Enabling mod_ssl"
+
+ if is_ubuntu; then
+ sudo a2enmod ssl
+ elif is_fedora; then
+ # Fedora enables mod_ssl by default
+ :
+ fi
+ if ! sudo `which httpd || which apache2ctl` -M | grep -w -q ssl_module; then
+ die $LINENO "mod_ssl is not enabled in apache2/httpd, please check for it manually and run stack.sh again"
+ fi
+}
+
# Proxy Functions
# ===============
diff --git a/stack.sh b/stack.sh
index c20e61031d..12f18e20ec 100755
--- a/stack.sh
+++ b/stack.sh
@@ -340,6 +340,15 @@ 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"
+
+if is_service_enabled tls-proxy && [ "$USE_SSL" == "True" ]; then
+ die $LINENO "tls-proxy and SSL are mutually exclusive"
+fi
# Configure Projects
# ==================
@@ -822,7 +831,7 @@ if is_service_enabled heat; then
configure_heat
fi
-if is_service_enabled tls-proxy; then
+if is_service_enabled tls-proxy || [ "$USE_SSL" == "True" ]; then
configure_CA
init_CA
init_cert
From fa4ece89f7928bc86b194b62f02304e805ae573b Mon Sep 17 00:00:00 2001
From: Ken'ichi Ohmichi
Date: Thu, 25 Sep 2014 00:40:17 +0000
Subject: [PATCH 0014/3421] Remove Nova v3 API endpoint
Nova v3 API has disappeared in Juno cycle, and we don't test the API
now on the gate since If63dcdb2d05aa0fab0b6848a1248b6678f1ee9ad .
This patch removes the endpoint of Nova v3 API.
Change-Id: I85f87b37558a15d1eaaa781b02fec5b02bd2ab44
---
files/default_catalog.templates | 6 ------
lib/nova | 8 --------
lib/tempest | 3 ---
3 files changed, 17 deletions(-)
diff --git a/files/default_catalog.templates b/files/default_catalog.templates
index ff00e38e09..901635570b 100644
--- a/files/default_catalog.templates
+++ b/files/default_catalog.templates
@@ -12,12 +12,6 @@ catalog.RegionOne.compute.internalURL = http://%SERVICE_HOST%:8774/v2/$(tenant_i
catalog.RegionOne.compute.name = Compute Service
-catalog.RegionOne.computev3.publicURL = http://%SERVICE_HOST%:8774/v3
-catalog.RegionOne.computev3.adminURL = http://%SERVICE_HOST%:8774/v3
-catalog.RegionOne.computev3.internalURL = http://%SERVICE_HOST%:8774/v3
-catalog.RegionOne.computev3.name = Compute Service V3
-
-
catalog.RegionOne.volume.publicURL = http://%SERVICE_HOST%:8776/v1/$(tenant_id)s
catalog.RegionOne.volume.adminURL = http://%SERVICE_HOST%:8776/v1/$(tenant_id)s
catalog.RegionOne.volume.internalURL = http://%SERVICE_HOST%:8776/v1/$(tenant_id)s
diff --git a/lib/nova b/lib/nova
index 2a3aae1835..88c1e29cea 100644
--- a/lib/nova
+++ b/lib/nova
@@ -349,14 +349,6 @@ create_nova_accounts() {
"$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2/\$(tenant_id)s" \
"$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2/\$(tenant_id)s" \
"$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2/\$(tenant_id)s"
-
- local nova_v3_service=$(get_or_create_service "novav3" \
- "computev3" "Nova Compute Service V3")
- get_or_create_endpoint $nova_v3_service \
- "$REGION_NAME" \
- "$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v3" \
- "$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v3" \
- "$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v3"
fi
fi
diff --git a/lib/tempest b/lib/tempest
index 906cb00f95..0dfeb868df 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -290,15 +290,12 @@ function configure_tempest {
iniset $TEMPEST_CONFIG compute ssh_connect_method $ssh_connect_method
# Compute Features
- iniset $TEMPEST_CONFIG compute-feature-enabled api_v3 ${TEMPEST_NOVA_API_V3:-False}
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}
- iniset $TEMPEST_CONFIG compute-feature-enabled api_v3_extensions ${COMPUTE_API_V3_EXTENSIONS:-"all"}
- iniset $TEMPEST_CONFIG compute-feature-disabled api_v3_extensions ${DISABLE_COMPUTE_API_V3_EXTENSIONS}
# Compute admin
iniset $TEMPEST_CONFIG "compute-admin" username $ADMIN_USERNAME
From 3feaa383ce07c1cf0f5c8760e326aab96b55ddbf Mon Sep 17 00:00:00 2001
From: Ken'ichi Ohmichi
Date: Thu, 25 Sep 2014 00:49:57 +0000
Subject: [PATCH 0015/3421] Add Nova v2.1 API endpoint
In Juno cycle, we started to implement Nova v2.1 API and most part
has been implemented now.
For using/testing the API, this patch adds the endpoint setting to
devstack.
Change-Id: I25557cb2b0a1384ee11d3e1ae7d424828e766e50
---
files/default_catalog.templates | 6 ++++++
lib/nova | 8 ++++++++
2 files changed, 14 insertions(+)
diff --git a/files/default_catalog.templates b/files/default_catalog.templates
index 901635570b..a18d38f606 100644
--- a/files/default_catalog.templates
+++ b/files/default_catalog.templates
@@ -12,6 +12,12 @@ catalog.RegionOne.compute.internalURL = http://%SERVICE_HOST%:8774/v2/$(tenant_i
catalog.RegionOne.compute.name = Compute Service
+catalog.RegionOne.computev21.publicURL = http://%SERVICE_HOST%:8774/v2.1/$(tenant_id)s
+catalog.RegionOne.computev21.adminURL = http://%SERVICE_HOST%:8774/v2.1/$(tenant_id)s
+catalog.RegionOne.computev21.internalURL = http://%SERVICE_HOST%:8774/v2.1/$(tenant_id)s
+catalog.RegionOne.computev21.name = Compute Service V2.1
+
+
catalog.RegionOne.volume.publicURL = http://%SERVICE_HOST%:8776/v1/$(tenant_id)s
catalog.RegionOne.volume.adminURL = http://%SERVICE_HOST%:8776/v1/$(tenant_id)s
catalog.RegionOne.volume.internalURL = http://%SERVICE_HOST%:8776/v1/$(tenant_id)s
diff --git a/lib/nova b/lib/nova
index 88c1e29cea..00050905bf 100644
--- a/lib/nova
+++ b/lib/nova
@@ -349,6 +349,14 @@ create_nova_accounts() {
"$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2/\$(tenant_id)s" \
"$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2/\$(tenant_id)s" \
"$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2/\$(tenant_id)s"
+
+ local nova_v21_service=$(get_or_create_service "novav21" \
+ "computev21" "Nova Compute Service V2.1")
+ get_or_create_endpoint $nova_v21_service \
+ "$REGION_NAME" \
+ "$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2.1/\$(tenant_id)s" \
+ "$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2.1/\$(tenant_id)s" \
+ "$NOVA_SERVICE_PROTOCOL://$NOVA_SERVICE_HOST:$NOVA_SERVICE_PORT/v2.1/\$(tenant_id)s"
fi
fi
From 293869fbacea6939a63a8a83311063af8376cf9c Mon Sep 17 00:00:00 2001
From: Thomas Bechtold
Date: Thu, 25 Sep 2014 07:55:15 +0200
Subject: [PATCH 0016/3421] Fix pkg name for mysql-connector-python on SUSE
The correct package name on SUSE distros is python-mysql-connector-python.
Change-Id: I5250356f782f149f87f3d0ffba3380911fa437be
---
files/rpms-suse/keystone | 2 +-
files/rpms-suse/neutron | 2 +-
files/rpms-suse/nova | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/files/rpms-suse/keystone b/files/rpms-suse/keystone
index a734cb9d09..4c37adef9b 100644
--- a/files/rpms-suse/keystone
+++ b/files/rpms-suse/keystone
@@ -10,6 +10,6 @@ python-devel
python-greenlet
python-lxml
python-mysql
-python-mysql.connector
+python-mysql-connector-python
python-pysqlite
sqlite3
diff --git a/files/rpms-suse/neutron b/files/rpms-suse/neutron
index 8ad69b022f..41eae0576e 100644
--- a/files/rpms-suse/neutron
+++ b/files/rpms-suse/neutron
@@ -9,7 +9,7 @@ python-greenlet
python-iso8601
python-kombu
python-mysql
-python-mysql.connector
+python-mysql-connector-python
python-Paste
python-PasteDeploy
python-pyudev
diff --git a/files/rpms-suse/nova b/files/rpms-suse/nova
index 73c0604aaa..bea0451289 100644
--- a/files/rpms-suse/nova
+++ b/files/rpms-suse/nova
@@ -34,7 +34,7 @@ python-lockfile
python-lxml # needed for glance which is needed for nova --- this shouldn't be here
python-mox
python-mysql
-python-mysql.connector
+python-mysql-connector-python
python-numpy # needed by websockify for spice console
python-paramiko
python-sqlalchemy-migrate
From a7bde1fdf7df38490b80871dd652401fb1721232 Mon Sep 17 00:00:00 2001
From: Joe Gordon
Date: Fri, 26 Sep 2014 09:52:13 -0700
Subject: [PATCH 0017/3421] Cleanup nova-cinder nova.conf section
Stop using deprecated conf names, don't override default values with
default values.
Change-Id: I2c7e0833a61926b9fc9b5de4e38fdd626501d78d
---
lib/nova | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/lib/nova b/lib/nova
index cfa6f7a8ec..319d9302f7 100644
--- a/lib/nova
+++ b/lib/nova
@@ -451,12 +451,11 @@ function create_nova_conf {
fi
if is_service_enabled cinder; then
- iniset $NOVA_CONF DEFAULT volume_api_class "nova.volume.cinder.API"
if is_ssl_enabled_service "cinder" || is_service_enabled tls-proxy; then
CINDER_SERVICE_HOST=${CINDER_SERVICE_HOST:-$SERVICE_HOST}
CINDER_SERVICE_PORT=${CINDER_SERVICE_PORT:-8776}
- iniset $NOVA_CONF DEFAULT cinder_endpoint_template "https://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT/v1/%(project_id)s"
- iniset $NOVA_CONF DEFAULT cinder_ca_certificates_file $SSL_BUNDLE_FILE
+ iniset $NOVA_CONF cinder endpoint_template "https://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT/v1/%(project_id)s"
+ iniset $NOVA_CONF cinder ca_certificates_file $SSL_BUNDLE_FILE
fi
fi
From 1f79bad7ecc28d472b1e2c185fdba7a9dd61a524 Mon Sep 17 00:00:00 2001
From: Joe Gordon
Date: Fri, 26 Sep 2014 09:59:47 -0700
Subject: [PATCH 0018/3421] Stop setting nova.conf settings that mean nothing
* DEFAULT.fixed_range isn't a valid option in nova anymore
* DEFAULT.osci_compute_workers was never a thing, it should be
DEFAULT.osapi_compute_workers
Change-Id: Ib08f3e20e4685b331385431276f890205fa76da6
---
lib/nova | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lib/nova b/lib/nova
index cfa6f7a8ec..4d4aeae97d 100644
--- a/lib/nova
+++ b/lib/nova
@@ -421,7 +421,6 @@ function create_nova_conf {
iniset $NOVA_CONF DEFAULT scheduler_driver "$SCHEDULER"
iniset $NOVA_CONF DEFAULT dhcpbridge_flagfile "$NOVA_CONF"
iniset $NOVA_CONF DEFAULT force_dhcp_release "True"
- iniset $NOVA_CONF DEFAULT fixed_range ""
iniset $NOVA_CONF DEFAULT default_floating_pool "$PUBLIC_NETWORK_NAME"
iniset $NOVA_CONF DEFAULT s3_host "$SERVICE_HOST"
iniset $NOVA_CONF DEFAULT s3_port "$S3_SERVICE_PORT"
@@ -531,7 +530,7 @@ function create_nova_conf {
iniset_rpc_backend nova $NOVA_CONF DEFAULT
iniset $NOVA_CONF glance api_servers "${GLANCE_SERVICE_PROTOCOL}://${GLANCE_HOSTPORT}"
- iniset $NOVA_CONF DEFAULT osci_compute_workers "$API_WORKERS"
+ iniset $NOVA_CONF DEFAULT osapi_compute_workers "$API_WORKERS"
iniset $NOVA_CONF DEFAULT ec2_workers "$API_WORKERS"
iniset $NOVA_CONF DEFAULT metadata_workers "$API_WORKERS"
From 3fcd2baf95332e814e56a7cddc1b85dd15ae6391 Mon Sep 17 00:00:00 2001
From: Gary Kotton
Date: Mon, 22 Sep 2014 00:55:02 -0700
Subject: [PATCH 0019/3421] Ensure that keystone uses global debug setting
When setting ENABLE_DEBUG_LOG_LEVEL the keystone screen would ignore
this setting and always use the debug mode.
Change-Id: I934443c2976e936198fc93da4cca717e6cb84e6f
---
lib/keystone | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/lib/keystone b/lib/keystone
index b6a4e1097a..68e8f9fe79 100644
--- a/lib/keystone
+++ b/lib/keystone
@@ -283,7 +283,7 @@ function configure_keystone {
fi
if [ "$KEYSTONE_USE_MOD_WSGI" == "True" ]; then
- iniset $KEYSTONE_CONF DEFAULT debug "True"
+ iniset $KEYSTONE_CONF DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL
# Eliminate the %(asctime)s.%(msecs)03d from the log format strings
iniset $KEYSTONE_CONF DEFAULT logging_context_format_string "%(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s"
iniset $KEYSTONE_CONF DEFAULT logging_default_format_string "%(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s"
@@ -476,8 +476,12 @@ function start_keystone {
tail_log key /var/log/$APACHE_NAME/keystone.log
tail_log key-access /var/log/$APACHE_NAME/keystone_access.log
else
+ local EXTRA_PARAMS=""
+ if [ "$ENABLE_DEBUG_LOG_LEVEL" == "True" ]; then
+ EXTRA_PARAMS="--debug"
+ fi
# Start Keystone in a screen window
- run_process key "$KEYSTONE_DIR/bin/keystone-all --config-file $KEYSTONE_CONF --debug"
+ run_process key "$KEYSTONE_DIR/bin/keystone-all --config-file $KEYSTONE_CONF $EXTRA_PARAMS"
fi
echo "Waiting for keystone to start..."
From 68e9f05f7c19b1bd9d4c7e8e7f88fbf93d18b9f9 Mon Sep 17 00:00:00 2001
From: Sean Dague
Date: Thu, 28 Aug 2014 07:26:31 -0400
Subject: [PATCH 0020/3421] remove kombu from package lists
This is a pure python library that we should probably let pip
handle so that we don't accidentally only test whatever patched
version is in trusty instead of the upstream versions.
Change-Id: I93d2f9344b9f83d2397466b4bc29c97210919ed9
---
files/apts/horizon | 2 --
files/apts/neutron | 1 -
files/apts/nova | 1 -
files/rpms-suse/horizon | 1 -
files/rpms-suse/neutron | 1 -
files/rpms-suse/nova | 1 -
files/rpms/horizon | 1 -
files/rpms/neutron | 1 -
files/rpms/nova | 1 -
9 files changed, 10 deletions(-)
diff --git a/files/apts/horizon b/files/apts/horizon
index 8969046355..03df3cba97 100644
--- a/files/apts/horizon
+++ b/files/apts/horizon
@@ -9,13 +9,11 @@ python-routes
python-xattr
python-sqlalchemy
python-webob
-python-kombu
pylint
python-eventlet
python-nose
python-sphinx
python-mox
-python-kombu
python-coverage
python-cherrypy3 # why?
python-migrate
diff --git a/files/apts/neutron b/files/apts/neutron
index 381c75836d..a48a800527 100644
--- a/files/apts/neutron
+++ b/files/apts/neutron
@@ -11,7 +11,6 @@ python-routes
python-suds
python-pastedeploy
python-greenlet
-python-kombu
python-eventlet
python-sqlalchemy
python-mysqldb
diff --git a/files/apts/nova b/files/apts/nova
index b1b969aab7..a3b0cb1521 100644
--- a/files/apts/nova
+++ b/files/apts/nova
@@ -42,7 +42,6 @@ python-sqlalchemy
python-suds
python-lockfile
python-m2crypto
-python-kombu
python-feedparser
python-iso8601
python-qpid # NOPRIME
diff --git a/files/rpms-suse/horizon b/files/rpms-suse/horizon
index d3bde2690c..fa7e43964a 100644
--- a/files/rpms-suse/horizon
+++ b/files/rpms-suse/horizon
@@ -12,7 +12,6 @@ python-beautifulsoup
python-coverage
python-dateutil
python-eventlet
-python-kombu
python-mox
python-nose
python-pylint
diff --git a/files/rpms-suse/neutron b/files/rpms-suse/neutron
index 41eae0576e..8431bd1bd0 100644
--- a/files/rpms-suse/neutron
+++ b/files/rpms-suse/neutron
@@ -7,7 +7,6 @@ mariadb # NOPRIME
python-eventlet
python-greenlet
python-iso8601
-python-kombu
python-mysql
python-mysql-connector-python
python-Paste
diff --git a/files/rpms-suse/nova b/files/rpms-suse/nova
index bea0451289..b1c4f6a8d0 100644
--- a/files/rpms-suse/nova
+++ b/files/rpms-suse/nova
@@ -28,7 +28,6 @@ python-eventlet
python-feedparser
python-greenlet
python-iso8601
-python-kombu
python-libxml2
python-lockfile
python-lxml # needed for glance which is needed for nova --- this shouldn't be here
diff --git a/files/rpms/horizon b/files/rpms/horizon
index 8ecb030194..fe3a2f40c0 100644
--- a/files/rpms/horizon
+++ b/files/rpms/horizon
@@ -9,7 +9,6 @@ python-dateutil
python-eventlet
python-greenlet
python-httplib2
-python-kombu
python-migrate
python-mox
python-nose
diff --git a/files/rpms/neutron b/files/rpms/neutron
index 7020d33719..2c9dd3d5e8 100644
--- a/files/rpms/neutron
+++ b/files/rpms/neutron
@@ -11,7 +11,6 @@ openvswitch # NOPRIME
python-eventlet
python-greenlet
python-iso8601
-python-kombu
#rhel6 gets via pip
python-paste # dist:f19,f20,rhel7
python-paste-deploy # dist:f19,f20,rhel7
diff --git a/files/rpms/nova b/files/rpms/nova
index 695d814f7d..dc1944b1de 100644
--- a/files/rpms/nova
+++ b/files/rpms/nova
@@ -25,7 +25,6 @@ python-eventlet
python-feedparser
python-greenlet
python-iso8601
-python-kombu
python-lockfile
python-migrate
python-mox
From ae6fb18ff2ee82b42b0c604fec4a02b756e54ed4 Mon Sep 17 00:00:00 2001
From: Chris Dent
Date: Tue, 16 Sep 2014 15:17:13 +0100
Subject: [PATCH 0021/3421] Allow ceilometer-api to run under mod_wsgi
If CEILOMETER_USE_MOD_WSGI is True then the API app will
run under mod wsgi. The default is false (for now).
The changes are modeled on keystone's use of apache.
Note that these changes are dependent on
https://review.openstack.org/#/c/121823/ in ceilometer.
Using mod_wsgi allows the ceilometer api to handle "concurrent"
requests. This is extremely useful when trying to benchmark
various aspects of the service.
Change-Id: I4c220c3b52804cd8d9123b47780a98e0346ca81e
---
files/apache-ceilometer.template | 15 ++++++++++
lib/ceilometer | 49 +++++++++++++++++++++++++++++++-
2 files changed, 63 insertions(+), 1 deletion(-)
create mode 100644 files/apache-ceilometer.template
diff --git a/files/apache-ceilometer.template b/files/apache-ceilometer.template
new file mode 100644
index 0000000000..1c57b328b8
--- /dev/null
+++ b/files/apache-ceilometer.template
@@ -0,0 +1,15 @@
+Listen %PORT%
+
+
+ WSGIDaemonProcess ceilometer-api processes=2 threads=10 user=%USER% display-name=%{GROUP}
+ WSGIProcessGroup ceilometer-api
+ WSGIScriptAlias / %WSGIAPP%
+ WSGIApplicationGroup %{GLOBAL}
+ = 2.4>
+ ErrorLogFormat "%{cu}t %M"
+
+ ErrorLog /var/log/%APACHE_NAME%/ceilometer.log
+ CustomLog /var/log/%APACHE_NAME%/ceilometer_access.log combined
+
+
+WSGISocketPrefix /var/run/%APACHE_NAME%
diff --git a/lib/ceilometer b/lib/ceilometer
index 00fc0d3f68..9bb31218a0 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -41,6 +41,7 @@ CEILOMETER_CONF_DIR=/etc/ceilometer
CEILOMETER_CONF=$CEILOMETER_CONF_DIR/ceilometer.conf
CEILOMETER_API_LOG_DIR=/var/log/ceilometer-api
CEILOMETER_AUTH_CACHE_DIR=${CEILOMETER_AUTH_CACHE_DIR:-/var/cache/ceilometer}
+CEILOMETER_WSGI_DIR=${CEILOMETER_WSGI_DIR:-/var/www/ceilometer}
# Support potential entry-points console scripts
CEILOMETER_BIN_DIR=$(get_python_exec_prefix)
@@ -52,6 +53,7 @@ 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)
# To enable OSprofiler change value of this variable to "notifications,profiler"
CEILOMETER_NOTIFICATION_TOPICS=${CEILOMETER_NOTIFICATION_TOPICS:-notifications}
@@ -105,12 +107,39 @@ create_ceilometer_accounts() {
}
+# _cleanup_keystone_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
+function _cleanup_ceilometer_apache_wsgi {
+ sudo rm -f $CEILOMETER_WSGI_DIR/*
+ sudo rm -f $(apache_site_config_for ceilometer)
+}
+
# cleanup_ceilometer() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_ceilometer {
if [ "$CEILOMETER_BACKEND" != 'mysql' ] && [ "$CEILOMETER_BACKEND" != 'postgresql' ] ; then
mongo ceilometer --eval "db.dropDatabase();"
fi
+ if [ "$CEILOMETER_USE_MOD_WSGI" == "True" ]; then
+ _cleanup_ceilometer_apache_wsgi
+ fi
+}
+
+function _config_ceilometer_apache_wsgi {
+ sudo mkdir -p $CEILOMETER_WSGI_DIR
+
+ local ceilometer_apache_conf=$(apache_site_config_for ceilometer)
+ local apache_version=$(get_apache_version)
+
+ # copy proxy vhost and wsgi file
+ sudo cp $CEILOMETER_DIR/ceilometer/api/app.wsgi $CEILOMETER_WSGI_DIR/app
+
+ sudo cp $FILES/apache-ceilometer.template $ceilometer_apache_conf
+ sudo sed -e "
+ s|%PORT%|$CEILOMETER_SERVICE_PORT|g;
+ s|%APACHE_NAME%|$APACHE_NAME|g;
+ s|%WSGIAPP%|$CEILOMETER_WSGI_DIR/app|g;
+ s|%USER%|$STACK_USER|g
+ " -i $ceilometer_apache_conf
}
# configure_ceilometer() - Set config files, create data dirs, etc
@@ -163,6 +192,11 @@ function configure_ceilometer {
iniset $CEILOMETER_CONF vmware host_username "$VMWAREAPI_USER"
iniset $CEILOMETER_CONF vmware host_password "$VMWAREAPI_PASSWORD"
fi
+
+ if [ "$CEILOMETER_USE_MOD_WSGI" == "True" ]; then
+ iniset $CEILOMETER_CONF api pecan_debug "False"
+ _config_ceilometer_apache_wsgi
+ fi
}
function configure_mongodb {
@@ -223,7 +257,16 @@ function start_ceilometer {
run_process ceilometer-acentral "ceilometer-agent-central --config-file $CEILOMETER_CONF"
run_process ceilometer-anotification "ceilometer-agent-notification --config-file $CEILOMETER_CONF"
run_process ceilometer-collector "ceilometer-collector --config-file $CEILOMETER_CONF"
- run_process ceilometer-api "ceilometer-api -d -v --log-dir=$CEILOMETER_API_LOG_DIR --config-file $CEILOMETER_CONF"
+
+ if [[ "$CEILOMETER_USE_MOD_WSGI" == "False" ]]; then
+ run_process ceilometer-api "ceilometer-api -d -v --log-dir=$CEILOMETER_API_LOG_DIR --config-file $CEILOMETER_CONF"
+ else
+ enable_apache_site ceilometer
+ restart_apache_server
+ tail_log ceilometer /var/log/$APACHE_NAME/ceilometer.log
+ tail_log ceilometer-api /var/log/$APACHE_NAME/ceilometer_access.log
+ fi
+
# Start the compute agent last to allow time for the collector to
# fully wake up and connect to the message bus. See bug #1355809
@@ -248,6 +291,10 @@ function start_ceilometer {
# stop_ceilometer() - Stop running processes
function stop_ceilometer {
+ if [ "$CEILOMETER_USE_MOD_WSGI" == "True" ]; then
+ disable_apache_site ceilometer
+ restart_apache_server
+ fi
# Kill the ceilometer screen windows
for serv in ceilometer-acompute ceilometer-acentral ceilometer-anotification ceilometer-collector ceilometer-api ceilometer-alarm-notifier ceilometer-alarm-evaluator; do
stop_process $serv
From ac937bc06eb68cb1c94804995325b9fa8b850959 Mon Sep 17 00:00:00 2001
From: Julie Pichon
Date: Mon, 29 Sep 2014 04:55:21 +0100
Subject: [PATCH 0022/3421] Install ldappool when LDAP is enabled
Keystone expects ldappool to be installed when using the LDAP backend.
Change-Id: I35e6585ec8416153ed6d0c6fa8c10c992bf0de6d
Closes-Bug: #1373750
---
lib/ldap | 2 ++
1 file changed, 2 insertions(+)
diff --git a/lib/ldap b/lib/ldap
index 2bb8a4cc9c..a6fb82f6f2 100644
--- a/lib/ldap
+++ b/lib/ldap
@@ -139,6 +139,8 @@ function install_ldap {
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
fi
+ pip_install ldappool
+
rm -rf $tmp_ldap_dir
}
From 3cd1771408f5025177ff0ac7578527c5a9a64bfa Mon Sep 17 00:00:00 2001
From: Bob Ball
Date: Mon, 29 Sep 2014 12:53:02 +0100
Subject: [PATCH 0023/3421] XenAPI: Upgrade built-VM to Trusty
If you're not using an XVA then the built-VM was previously Saucy, which is
not supported by openstack any more.
Change-Id: I1040d9e43d517582e76f2e1df787986b5ffbc42c
---
tools/xen/devstackubuntupreseed.cfg | 8 ++++----
tools/xen/xenrc | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/tools/xen/devstackubuntupreseed.cfg b/tools/xen/devstackubuntupreseed.cfg
index 6a1ae89fd9..94e6e96625 100644
--- a/tools/xen/devstackubuntupreseed.cfg
+++ b/tools/xen/devstackubuntupreseed.cfg
@@ -297,9 +297,9 @@ d-i user-setup/encrypt-home boolean false
### Apt setup
# You can choose to install restricted and universe software, or to install
# software from the backports repository.
-#d-i apt-setup/restricted boolean true
-#d-i apt-setup/universe boolean true
-#d-i apt-setup/backports boolean true
+d-i apt-setup/restricted boolean true
+d-i apt-setup/universe boolean true
+d-i apt-setup/backports boolean true
# Uncomment this if you don't want to use a network mirror.
#d-i apt-setup/use_mirror boolean false
# Select which update services to use; define the mirrors to be used.
@@ -366,7 +366,7 @@ d-i pkgsel/updatedb boolean false
# With a few exceptions for unusual partitioning setups, GRUB 2 is now the
# default. If you need GRUB Legacy for some particular reason, then
# uncomment this:
-#d-i grub-installer/grub2_instead_of_grub_legacy boolean false
+d-i grub-installer/grub2_instead_of_grub_legacy boolean false
# This is fairly safe to set, it makes grub install automatically to the MBR
# if no other operating system is detected on the machine.
diff --git a/tools/xen/xenrc b/tools/xen/xenrc
index 278bb9b909..510c5f9c46 100644
--- a/tools/xen/xenrc
+++ b/tools/xen/xenrc
@@ -63,15 +63,15 @@ PUB_IP=${PUB_IP:-172.24.4.10}
PUB_NETMASK=${PUB_NETMASK:-255.255.255.0}
# Ubuntu install settings
-UBUNTU_INST_RELEASE="saucy"
-UBUNTU_INST_TEMPLATE_NAME="Ubuntu 13.10 (64-bit) for DevStack"
+UBUNTU_INST_RELEASE="trusty"
+UBUNTU_INST_TEMPLATE_NAME="Ubuntu 14.04 (64-bit) for DevStack"
# For 12.04 use "precise" and update template name
# However, for 12.04, you should be using
# XenServer 6.1 and later or XCP 1.6 or later
# 11.10 is only really supported with XenServer 6.0.2 and later
UBUNTU_INST_ARCH="amd64"
-UBUNTU_INST_HTTP_HOSTNAME="archive.ubuntu.net"
-UBUNTU_INST_HTTP_DIRECTORY="/ubuntu"
+UBUNTU_INST_HTTP_HOSTNAME="mirror.anl.gov"
+UBUNTU_INST_HTTP_DIRECTORY="/pub/ubuntu"
UBUNTU_INST_HTTP_PROXY=""
UBUNTU_INST_LOCALE="en_US"
UBUNTU_INST_KEYBOARD="us"
From 44e16e01da9d3b7d647d379f8c9cab763fc7912a Mon Sep 17 00:00:00 2001
From: John Griffith
Date: Fri, 19 Sep 2014 10:26:51 -0600
Subject: [PATCH 0024/3421] Relocate SERVICE_TIMEOUT to stackrc
cinder_driver_cert.sh restarts volume services
and needs the SERVICE_TIMEOUT variable set, but
that was being declared in stack.sh.
Rather than create another duplicate variable in
the cert script, just move the SERVICE_TIMEOUT
variable to stackrc so it can be shared like other
common variables.
Change-Id: I650697df015fed8f400101a13b6165ac39626877
Closes-Bug: 1350221
---
stack.sh | 3 ---
stackrc | 5 +++++
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/stack.sh b/stack.sh
index c20e61031d..e795f375b8 100755
--- a/stack.sh
+++ b/stack.sh
@@ -325,9 +325,6 @@ SYSLOG_PORT=${SYSLOG_PORT:-516}
# Use color for logging output (only available if syslog is not used)
LOG_COLOR=`trueorfalse True $LOG_COLOR`
-# Service startup timeout
-SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
-
# Reset the bundle of CA certificates
SSL_BUNDLE_FILE="$DATA_DIR/ca-bundle.pem"
rm -f $SSL_BUNDLE_FILE
diff --git a/stackrc b/stackrc
index 936eb9c293..ac6efdd2cf 100644
--- a/stackrc
+++ b/stackrc
@@ -516,6 +516,11 @@ SERVICE_PROTOCOL=${SERVICE_PROTOCOL:-http}
# (the default number of workers for many services is the number of CPUs)
# API_WORKERS=4
+# Service startup timeout
+SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
+
+# Following entries need to be last items in file
+
# Local variables:
# mode: shell-script
# End:
From 08a5fcc7faae8cab558617b46b684009df595fdd Mon Sep 17 00:00:00 2001
From: Kevin Benton
Date: Fri, 18 Jul 2014 16:06:12 -0700
Subject: [PATCH 0025/3421] Use service role for neutron instead of admin
When creating the account for neutron to use in keystone,
give it a service role instead of an admin role so it isn't
overprivileged with the ability to create and delete tenants.
Also set the Neutron policy.json file to allow the Neutron
account to administer Neutron.
Closes-Bug: #1344463
Change-Id: I86b15cfcffe549654c28f425c2bcf99403ac10bc
---
lib/neutron | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/lib/neutron b/lib/neutron
index 81f2697abb..a48f519884 100644
--- a/lib/neutron
+++ b/lib/neutron
@@ -457,13 +457,13 @@ function create_neutron_cache_dir {
function create_neutron_accounts {
local service_tenant=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }")
- local admin_role=$(openstack role list | awk "/ admin / { print \$2 }")
+ local service_role=$(openstack role list | awk "/ service / { print \$2 }")
if [[ "$ENABLED_SERVICES" =~ "q-svc" ]]; then
local neutron_user=$(get_or_create_user "neutron" \
"$SERVICE_PASSWORD" $service_tenant)
- get_or_add_user_role $admin_role $neutron_user $service_tenant
+ get_or_add_user_role $service_role $neutron_user $service_tenant
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
@@ -889,6 +889,9 @@ function _configure_neutron_service {
cp $NEUTRON_DIR/etc/api-paste.ini $Q_API_PASTE_FILE
cp $NEUTRON_DIR/etc/policy.json $Q_POLICY_FILE
+ # allow neutron user to administer neutron to match neutron account
+ sed -i 's/"context_is_admin": "role:admin"/"context_is_admin": "role:admin or user_name:neutron"/g' $Q_POLICY_FILE
+
# Update either configuration file with plugin
iniset $NEUTRON_CONF DEFAULT core_plugin $Q_PLUGIN_CLASS
From 50495b0163e731f2fd5fe2d43aed10c8c2fe8e1e Mon Sep 17 00:00:00 2001
From: Monty Taylor
Date: Tue, 30 Sep 2014 09:53:34 -0700
Subject: [PATCH 0026/3421] Install dib from pip
diskimage-builder makes releases to PyPI and is not part of the
integrated release. Since it's not, we don't need to consume its
master branch - rather, we can consume its releases.
Change-Id: If9297a28604612140c39dfe44e77107d1372f0bb
---
lib/dib | 5 +----
stackrc | 4 ----
2 files changed, 1 insertion(+), 8 deletions(-)
diff --git a/lib/dib b/lib/dib
index 3a1167f833..d39d8016c5 100644
--- a/lib/dib
+++ b/lib/dib
@@ -32,10 +32,7 @@ OAC_DIR=$DEST/os-apply-config
# install_dib() - Collect source and prepare
function install_dib {
- git_clone $DIB_REPO $DIB_DIR $DIB_BRANCH
- pushd $DIB_DIR
- pip_install ./
- popd
+ pip_install diskimage-builder
git_clone $TIE_REPO $TIE_DIR $TIE_BRANCH
git_clone $OCC_REPO $OCC_DIR $OCC_BRANCH
diff --git a/stackrc b/stackrc
index 580fabf9f7..10feabe4ba 100644
--- a/stackrc
+++ b/stackrc
@@ -136,10 +136,6 @@ CINDER_BRANCH=${CINDER_BRANCH:-master}
CINDERCLIENT_REPO=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git}
CINDERCLIENT_BRANCH=${CINDERCLIENT_BRANCH:-master}
-# diskimage-builder
-DIB_REPO=${DIB_REPO:-${GIT_BASE}/openstack/diskimage-builder.git}
-DIB_BRANCH=${DIB_BRANCH:-master}
-
# image catalog service
GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git}
GLANCE_BRANCH=${GLANCE_BRANCH:-master}
From c53e83601a4ffc572ae99b3a4f330a940066cc1d Mon Sep 17 00:00:00 2001
From: Sean Dague
Date: Tue, 30 Sep 2014 22:37:52 -0400
Subject: [PATCH 0027/3421] remove deprecated pip option
--build is a deprecated option in pip, remove it
Change-Id: I8cb5f570431dcbd3389cd3b8d54d9ef40aa66dee
---
functions-common | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/functions-common b/functions-common
index 6b1f473004..4c61d6a8d2 100644
--- a/functions-common
+++ b/functions-common
@@ -1523,9 +1523,8 @@ function pip_install {
http_proxy=$http_proxy \
https_proxy=$https_proxy \
no_proxy=$no_proxy \
- $cmd_pip install --build=${pip_build_tmp} \
- $pip_mirror_opt $@ \
- && $sudo_pip rm -rf ${pip_build_tmp}
+ $cmd_pip install \
+ $pip_mirror_opt $@
if [[ "$INSTALL_TESTONLY_PACKAGES" == "True" ]]; then
local test_req="$@/test-requirements.txt"
@@ -1534,9 +1533,8 @@ function pip_install {
http_proxy=$http_proxy \
https_proxy=$https_proxy \
no_proxy=$no_proxy \
- $cmd_pip install --build=${pip_build_tmp} \
- $pip_mirror_opt -r $test_req \
- && $sudo_pip rm -rf ${pip_build_tmp}
+ $cmd_pip install \
+ $pip_mirror_opt -r $test_req
fi
fi
}
From 82d6e537522083749a664b99e1bdca2d8a33c6b9 Mon Sep 17 00:00:00 2001
From: Joe Gordon
Date: Fri, 26 Sep 2014 10:17:57 -0700
Subject: [PATCH 0028/3421] don't set nova.conf auth_strategy
keystone is the default value, so no need to override it.
Change-Id: I8e00071612d79959531feffc7e7993fa8c536359
---
lib/nova | 1 -
1 file changed, 1 deletion(-)
diff --git a/lib/nova b/lib/nova
index c24bc2fd8a..096d380e03 100644
--- a/lib/nova
+++ b/lib/nova
@@ -405,7 +405,6 @@ function create_nova_conf {
rm -f $NOVA_CONF
iniset $NOVA_CONF DEFAULT verbose "True"
iniset $NOVA_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
- iniset $NOVA_CONF DEFAULT auth_strategy "keystone"
iniset $NOVA_CONF DEFAULT allow_resize_to_same_host "True"
iniset $NOVA_CONF DEFAULT allow_migrate_to_same_host "True"
iniset $NOVA_CONF DEFAULT api_paste_config "$NOVA_API_PASTE_INI"
From 062a3c3e707e69778d2bb95e3e861e7bd65114b7 Mon Sep 17 00:00:00 2001
From: Kenneth Giusti
Date: Tue, 30 Sep 2014 10:14:08 -0400
Subject: [PATCH 0029/3421] Configure an authorized user for the QPID broker
If QPID_USERNAME is set, add the user to the QPID broker's
authentication database. Use the value of QPID_PASSWORD as the
password for the user, prompting for a password if QPID_PASSWORD is
not set. This requires that all clients provide this username and
password when connecting to the QPID broker, or the connection will be
rejected.
If QPID_USERNAME is not set (the default), disable QPID broker
authentication. This allows any client to connect to the QPID broker
without needing authentication.
Change-Id: Ibd79873379740930ce5f598018c1ca1fffda7c31
Closes-Bug: 1272399
---
files/apts/qpid | 1 +
files/rpms/qpid | 1 +
lib/rpc_backend | 109 +++++++++++++++++++++++++++++++++++-------------
3 files changed, 82 insertions(+), 29 deletions(-)
create mode 100644 files/apts/qpid
diff --git a/files/apts/qpid b/files/apts/qpid
new file mode 100644
index 0000000000..e3bbf0961c
--- /dev/null
+++ b/files/apts/qpid
@@ -0,0 +1 @@
+sasl2-bin # NOPRIME
diff --git a/files/rpms/qpid b/files/rpms/qpid
index 62148ba231..9e3f10af13 100644
--- a/files/rpms/qpid
+++ b/files/rpms/qpid
@@ -1,3 +1,4 @@
qpid-proton-c-devel # NOPRIME
python-qpid-proton # NOPRIME
+cyrus-sasl-lib # NOPRIME
diff --git a/lib/rpc_backend b/lib/rpc_backend
index de82fe115e..14c78fbf7b 100644
--- a/lib/rpc_backend
+++ b/lib/rpc_backend
@@ -132,39 +132,14 @@ function install_rpc_backend {
# Install rabbitmq-server
install_package rabbitmq-server
elif is_service_enabled qpid; then
- local qpid_conf_file=/etc/qpid/qpidd.conf
if is_fedora; then
install_package qpid-cpp-server
- if [[ $DISTRO =~ (rhel6) ]]; then
- qpid_conf_file=/etc/qpidd.conf
- # RHEL6 leaves "auth=yes" in /etc/qpidd.conf, it needs to
- # be no or you get GSS authentication errors as it
- # attempts to default to this.
- sudo sed -i.bak 's/^auth=yes$/auth=no/' $qpid_conf_file
- fi
elif is_ubuntu; then
install_package qpidd
- sudo sed -i '/PLAIN/!s/mech_list: /mech_list: PLAIN /' /etc/sasl2/qpidd.conf
- sudo chmod o+r /etc/qpid/qpidd.sasldb
else
exit_distro_not_supported "qpid installation"
fi
- # If AMQP 1.0 is specified, ensure that the version of the
- # broker can support AMQP 1.0 and configure the queue and
- # topic address patterns used by oslo.messaging.
- if [ "$RPC_MESSAGING_PROTOCOL" == "AMQP1" ]; then
- QPIDD=$(type -p qpidd)
- if ! $QPIDD --help | grep -q "queue-patterns"; then
- exit_distro_not_supported "qpidd with AMQP 1.0 support"
- fi
- if ! grep -q "queue-patterns=exclusive" $qpid_conf_file; then
- cat <
Date: Wed, 1 Oct 2014 09:06:43 -0400
Subject: [PATCH 0030/3421] use released library versions by default
This patch provides a new path for installing libraries in devstack so
that it's possible to either test with upstream released libraries, or
with git versions of individual libraries.
Libraries are added by name to 3 associative arrays GITREPO,
GITBRANCH, GITDIR. When we get to the library install phase we inspect
LIBS_FROM_GIT and look for libraries by name (i.e. "oslo.config") and
if they exist we'll clone and install those libraries from
git. Otherwise we won't, and just let pip pull them as dependencies
when it needs them.
This patch provides the conversion of the oslo libraries, including
pbr.
Devstack-gate jobs for these libraries will need to change to support
actually forward testing their content.
Change-Id: I6161fa3194dbe8fbc25b6ee0e2fe3cc722a1cea4
---
functions-common | 37 ++++++++++++++++++
lib/infra | 10 +++--
lib/oslo | 97 +++++++++++++++++++-----------------------------
stackrc | 64 ++++++++++++++++----------------
4 files changed, 114 insertions(+), 94 deletions(-)
diff --git a/functions-common b/functions-common
index 6b1f473004..c5c2ec7d42 100644
--- a/functions-common
+++ b/functions-common
@@ -36,6 +36,11 @@
XTRACE=$(set +o | grep xtrace)
set +o xtrace
+# Global Config Variables
+declare -A GITREPO
+declare -A GITBRANCH
+declare -A GITDIR
+
# Config Functions
# ================
@@ -598,6 +603,18 @@ function git_clone {
cd $orig_dir
}
+# A variation on git clone that lets us specify a project by it's
+# actual name, like oslo.config. This is exceptionally useful in the
+# library installation case
+function git_clone_by_name {
+ local name=$1
+ local repo=${GITREPO[$name]}
+ local dir=${GITDIR[$name]}
+ local branch=${GITBRANCH[$name]}
+ git_clone $repo $dir $branch
+}
+
+
# git can sometimes get itself infinitely stuck with transient network
# errors or other issues with the remote end. This wraps git in a
# timeout/retry loop and is intended to watch over non-local git
@@ -1541,6 +1558,26 @@ function pip_install {
fi
}
+# 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 {
+ local name=$1
+ local enabled=1
+ [[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] && enabled=0
+ return $enabled
+}
+
+# setup a library by name. 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.
+function setup_lib {
+ local name=$1
+ local dir=${GITDIR[$name]}
+ setup_install $dir
+}
+
+
# this should be used if you want to install globally, all libraries should
# use this, especially *oslo* ones
function setup_install {
diff --git a/lib/infra b/lib/infra
index e18c66ed48..cd439e723a 100644
--- a/lib/infra
+++ b/lib/infra
@@ -19,7 +19,7 @@ set +o xtrace
# Defaults
# --------
-PBR_DIR=$DEST/pbr
+GITDIR["pbr"]=$DEST/pbr
REQUIREMENTS_DIR=$DEST/requirements
# Entry Points
@@ -31,8 +31,12 @@ function install_infra {
git_clone $REQUIREMENTS_REPO $REQUIREMENTS_DIR $REQUIREMENTS_BRANCH
# Install pbr
- git_clone $PBR_REPO $PBR_DIR $PBR_BRANCH
- setup_install $PBR_DIR
+ if use_library_from_git "pbr"; then
+ git_clone_by_name "pbr"
+ setup_lib "pbr"
+ else
+ pip_install "pbr"
+ fi
}
# Restore xtrace
diff --git a/lib/oslo b/lib/oslo
index e5fa37e17f..c95a3a805f 100644
--- a/lib/oslo
+++ b/lib/oslo
@@ -20,21 +20,21 @@ set +o xtrace
# Defaults
# --------
-CLIFF_DIR=$DEST/cliff
-OSLOCFG_DIR=$DEST/oslo.config
-OSLOCON_DIR=$DEST/oslo.concurrency
-OSLODB_DIR=$DEST/oslo.db
-OSLOI18N_DIR=$DEST/oslo.i18n
-OSLOLOG_DIR=$DEST/oslo.log
-OSLOMID_DIR=$DEST/oslo.middleware
-OSLOMSG_DIR=$DEST/oslo.messaging
-OSLORWRAP_DIR=$DEST/oslo.rootwrap
-OSLOSERIALIZATION_DIR=$DEST/oslo.serialization
-OSLOUTILS_DIR=$DEST/oslo.utils
-OSLOVMWARE_DIR=$DEST/oslo.vmware
-PYCADF_DIR=$DEST/pycadf
-STEVEDORE_DIR=$DEST/stevedore
-TASKFLOW_DIR=$DEST/taskflow
+GITDIR["cliff"]=$DEST/cliff
+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
+GITDIR["oslo.serialization"]=$DEST/oslo.serialization
+GITDIR["oslo.utils"]=$DEST/oslo.utils
+GITDIR["oslo.vmware"]=$DEST/oslo.vmware
+GITDIR["pycadf"]=$DEST/pycadf
+GITDIR["stevedore"]=$DEST/stevedore
+GITDIR["taskflow"]=$DEST/taskflow
# Support entry points installation of console scripts
OSLO_BIN_DIR=$(get_python_exec_prefix)
@@ -42,52 +42,31 @@ OSLO_BIN_DIR=$(get_python_exec_prefix)
# Entry Points
# ------------
+function _do_install_oslo_lib {
+ local name=$1
+ if use_library_from_git "$name"; then
+ git_clone_by_name "$name"
+ setup_lib "$name"
+ fi
+}
+
# install_oslo() - Collect source and prepare
function install_oslo {
- git_clone $CLIFF_REPO $CLIFF_DIR $CLIFF_BRANCH
- setup_install $CLIFF_DIR
-
- git_clone $OSLOI18N_REPO $OSLOI18N_DIR $OSLOI18N_BRANCH
- setup_install $OSLOI18N_DIR
-
- git_clone $OSLOUTILS_REPO $OSLOUTILS_DIR $OSLOUTILS_BRANCH
- setup_install $OSLOUTILS_DIR
-
- git_clone $OSLOSERIALIZATION_REPO $OSLOSERIALIZATION_DIR $OSLOSERIALIZATION_BRANCH
- setup_install $OSLOSERIALIZATION_DIR
-
- git_clone $OSLOCFG_REPO $OSLOCFG_DIR $OSLOCFG_BRANCH
- setup_install $OSLOCFG_DIR
-
- git_clone $OSLOCON_REPO $OSLOCON_DIR $OSLOCON_BRANCH
- setup_install $OSLOCON_DIR
-
- git_clone $OSLOLOG_REPO $OSLOLOG_DIR $OSLOLOG_BRANCH
- setup_install $OSLOLOG_DIR
-
- git_clone $OSLOMID_REPO $OSLOMID_DIR $OSLOMID_BRANCH
- setup_install $OSLOMID_DIR
-
- git_clone $OSLOMSG_REPO $OSLOMSG_DIR $OSLOMSG_BRANCH
- setup_install $OSLOMSG_DIR
-
- git_clone $OSLORWRAP_REPO $OSLORWRAP_DIR $OSLORWRAP_BRANCH
- setup_install $OSLORWRAP_DIR
-
- git_clone $OSLODB_REPO $OSLODB_DIR $OSLODB_BRANCH
- setup_install $OSLODB_DIR
-
- git_clone $OSLOVMWARE_REPO $OSLOVMWARE_DIR $OSLOVMWARE_BRANCH
- setup_install $OSLOVMWARE_DIR
-
- git_clone $PYCADF_REPO $PYCADF_DIR $PYCADF_BRANCH
- setup_install $PYCADF_DIR
-
- git_clone $STEVEDORE_REPO $STEVEDORE_DIR $STEVEDORE_BRANCH
- setup_install $STEVEDORE_DIR
-
- git_clone $TASKFLOW_REPO $TASKFLOW_DIR $TASKFLOW_BRANCH
- setup_install $TASKFLOW_DIR
+ _do_install_oslo_lib "cliff"
+ _do_install_oslo_lib "oslo.i18n"
+ _do_install_oslo_lib "oslo.utils"
+ _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"
+ _do_install_oslo_lib "oslo.db"
+ _do_install_oslo_lib "olso.vmware"
+ _do_install_oslo_lib "pycadf"
+ _do_install_oslo_lib "stevedore"
+ _do_install_oslo_lib "taskflow"
}
# Restore xtrace
diff --git a/stackrc b/stackrc
index 580fabf9f7..96924732a5 100644
--- a/stackrc
+++ b/stackrc
@@ -222,68 +222,68 @@ ORC_REPO=${ORC_REPO:-${GIT_BASE}/openstack/os-refresh-config.git}
ORC_BRANCH=${ORC_BRANCH:-master}
# cliff command line framework
-CLIFF_REPO=${CLIFF_REPO:-${GIT_BASE}/openstack/cliff.git}
-CLIFF_BRANCH=${CLIFF_BRANCH:-master}
+GITREPO["cliff"]=${CLIFF_REPO:-${GIT_BASE}/openstack/cliff.git}
+GITBRANCH["cliff"]=${CLIFF_BRANCH:-master}
# oslo.concurrency
-OSLOCON_REPO=${OSLOCON_REPO:-${GIT_BASE}/openstack/oslo.concurrency.git}
-OSLOCON_BRANCH=${OSLOCON_BRANCH:-master}
+GITREPO["oslo.concurrency"]=${OSLOCON_REPO:-${GIT_BASE}/openstack/oslo.concurrency.git}
+GITBRANCH["olso.concurrency"]=${OSLOCON_BRANCH:-master}
# oslo.config
-OSLOCFG_REPO=${OSLOCFG_REPO:-${GIT_BASE}/openstack/oslo.config.git}
-OSLOCFG_BRANCH=${OSLOCFG_BRANCH:-master}
+GITREPO["oslo.config"]=${OSLOCFG_REPO:-${GIT_BASE}/openstack/oslo.config.git}
+GITBRANCH["oslo.config"]=${OSLOCFG_BRANCH:-master}
# oslo.db
-OSLODB_REPO=${OSLODB_REPO:-${GIT_BASE}/openstack/oslo.db.git}
-OSLODB_BRANCH=${OSLODB_BRANCH:-master}
+GITREPO["olso.db"]=${OSLODB_REPO:-${GIT_BASE}/openstack/oslo.db.git}
+GITBRANCH["olso.db"]=${OSLODB_BRANCH:-master}
# oslo.i18n
-OSLOI18N_REPO=${OSLOI18N_REPO:-${GIT_BASE}/openstack/oslo.i18n.git}
-OSLOI18N_BRANCH=${OSLOI18N_BRANCH:-master}
+GITREPO["olso.i18n"]=${OSLOI18N_REPO:-${GIT_BASE}/openstack/oslo.i18n.git}
+GITBRANCH["olso.i18n"]=${OSLOI18N_BRANCH:-master}
# oslo.log
-OSLOLOG_REPO=${OSLOLOG_REPO:-${GIT_BASE}/openstack/oslo.log.git}
-OSLOLOG_BRANCH=${OSLOLOG_BRANCH:-master}
+GITREPO["olso.log"]=${OSLOLOG_REPO:-${GIT_BASE}/openstack/oslo.log.git}
+GITBRANCH["olso.log"]=${OSLOLOG_BRANCH:-master}
# oslo.messaging
-OSLOMSG_REPO=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
-OSLOMSG_BRANCH=${OSLOMSG_BRANCH:-master}
+GITREPO["olso.messaging"]=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
+GITBRANCH["olso.messaging"]=${OSLOMSG_BRANCH:-master}
# oslo.middleware
-OSLOMID_REPO=${OSLOMID_REPO:-${GIT_BASE}/openstack/oslo.middleware.git}
-OSLOMID_BRANCH=${OSLOMID_BRANCH:-master}
+GITREPO["oslo.middleware"]=${OSLOMID_REPO:-${GIT_BASE}/openstack/oslo.middleware.git}
+GITBRANCH["oslo.middleware"]=${OSLOMID_BRANCH:-master}
# oslo.rootwrap
-OSLORWRAP_REPO=${OSLORWRAP_REPO:-${GIT_BASE}/openstack/oslo.rootwrap.git}
-OSLORWRAP_BRANCH=${OSLORWRAP_BRANCH:-master}
+GITREPO["olso.rootwrap"]=${OSLORWRAP_REPO:-${GIT_BASE}/openstack/oslo.rootwrap.git}
+GITBRANCH["olso.rootwrap"]=${OSLORWRAP_BRANCH:-master}
# oslo.serialization
-OSLOSERIALIZATION_REPO=${OSLOSERIALIZATION_REPO:-${GIT_BASE}/openstack/oslo.serialization.git}
-OSLOSERIALIZATION_BRANCH=${OSLOSERIALIZATION_BRANCH:-master}
+GITREPO["olso.serialization"]=${OSLOSERIALIZATION_REPO:-${GIT_BASE}/openstack/oslo.serialization.git}
+GITBRANCH["olso.serialization"]=${OSLOSERIALIZATION_BRANCH:-master}
# oslo.utils
-OSLOUTILS_REPO=${OSLOUTILS_REPO:-${GIT_BASE}/openstack/oslo.utils.git}
-OSLOUTILS_BRANCH=${OSLOUTILS_BRANCH:-master}
+GITREPO["olso.utils"]=${OSLOUTILS_REPO:-${GIT_BASE}/openstack/oslo.utils.git}
+GITBRANCH["olso.utils"]=${OSLOUTILS_BRANCH:-master}
# oslo.vmware
-OSLOVMWARE_REPO=${OSLOVMWARE_REPO:-${GIT_BASE}/openstack/oslo.vmware.git}
-OSLOVMWARE_BRANCH=${OSLOVMWARE_BRANCH:-master}
+GITREPO["olso.vmware"]=${OSLOVMWARE_REPO:-${GIT_BASE}/openstack/oslo.vmware.git}
+GITBRANCH["olso.vmware"]=${OSLOVMWARE_BRANCH:-master}
# pycadf auditing library
-PYCADF_REPO=${PYCADF_REPO:-${GIT_BASE}/openstack/pycadf.git}
-PYCADF_BRANCH=${PYCADF_BRANCH:-master}
+GITREPO["pycadf"]=${PYCADF_REPO:-${GIT_BASE}/openstack/pycadf.git}
+GITBRANCH["pycadf"]=${PYCADF_BRANCH:-master}
# stevedore plugin manager
-STEVEDORE_REPO=${STEVEDORE_REPO:-${GIT_BASE}/openstack/stevedore.git}
-STEVEDORE_BRANCH=${STEVEDORE_BRANCH:-master}
+GITREPO["stevedore"]=${STEVEDORE_REPO:-${GIT_BASE}/openstack/stevedore.git}
+GITBRANCH["stevedore"]=${STEVEDORE_BRANCH:-master}
# taskflow plugin manager
-TASKFLOW_REPO=${TASKFLOW_REPO:-${GIT_BASE}/openstack/taskflow.git}
-TASKFLOW_BRANCH=${TASKFLOW_BRANCH:-master}
+GITREPO["taskflow"]=${TASKFLOW_REPO:-${GIT_BASE}/openstack/taskflow.git}
+GITBRANCH["taskflow"]=${TASKFLOW_BRANCH:-master}
# pbr drives the setuptools configs
-PBR_REPO=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git}
-PBR_BRANCH=${PBR_BRANCH:-master}
+GITREPO["pbr"]=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git}
+GITBRANCH["pbr"]=${PBR_BRANCH:-master}
# neutron service
NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
From 944b28280b86bba7592b1c7a2032dbd0eaa39014 Mon Sep 17 00:00:00 2001
From: Joe Gordon
Date: Wed, 1 Oct 2014 18:21:08 -0700
Subject: [PATCH 0031/3421] Drop workaround for pip < 1.4
Now that we are on pip 1.5.6 lets drop the workaround to make pip 1.4
work. As this is a development/testing tool requiring a newer pip
shouldn't be an issue. Also stack.sh installs pip by default.
Work around introduced in https://github.com/pypa/pip/issues/709
Change-Id: I0e7aad1d21f4fce4c020ce36685bb56893c66bdc
---
functions | 11 -----------
functions-common | 9 ---------
unstack.sh | 2 --
3 files changed, 22 deletions(-)
diff --git a/functions b/functions
index 376aff05e3..bbde27d9f6 100644
--- a/functions
+++ b/functions
@@ -21,17 +21,6 @@ function function_exists {
declare -f -F $1 > /dev/null
}
-
-# Cleanup anything from /tmp on unstack
-# clean_tmp
-function cleanup_tmp {
- local tmp_dir=${TMPDIR:-/tmp}
-
- # see comments in pip_install
- sudo rm -rf ${tmp_dir}/pip-build.*
-}
-
-
# Retrieve an image from a URL and upload into Glance.
# Uses the following variables:
#
diff --git a/functions-common b/functions-common
index 4c61d6a8d2..6d1c6958dc 100644
--- a/functions-common
+++ b/functions-common
@@ -1509,15 +1509,6 @@ function pip_install {
pip_mirror_opt="--use-mirrors"
fi
- # pip < 1.4 has a bug where it will use an already existing build
- # directory unconditionally. Say an earlier component installs
- # foo v1.1; pip will have built foo's source in
- # /tmp/$USER-pip-build. Even if a later component specifies foo <
- # 1.1, the existing extracted build will be used and cause
- # confusing errors. By creating unique build directories we avoid
- # this problem. See https://github.com/pypa/pip/issues/709
- local pip_build_tmp=$(mktemp --tmpdir -d pip-build.XXXXX)
-
$xtrace
$sudo_pip PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-/var/cache/pip} \
http_proxy=$http_proxy \
diff --git a/unstack.sh b/unstack.sh
index adb6dc17ca..fee608e17b 100755
--- a/unstack.sh
+++ b/unstack.sh
@@ -173,5 +173,3 @@ if [[ -n "$SCREEN" ]]; then
screen -X -S $SESSION quit
fi
fi
-
-cleanup_tmp
From dec13c336dd24150d57be35b54a8d40618a5e29e Mon Sep 17 00:00:00 2001
From: Flavio Percoco
Date: Mon, 8 Sep 2014 09:48:27 +0200
Subject: [PATCH 0032/3421] Specialize Zaqar's cleanup function
Instead of having mongodb specific cleanup logic in `cleanup_zaqar`,
specialize it to perform clean ups based on the driver that has been
enabled.
Change-Id: I5807a83443b87b2c8d184e0cd2d5563a649c6273
---
lib/zaqar | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/lib/zaqar b/lib/zaqar
index 93b727e63b..fe25e1f7d4 100644
--- a/lib/zaqar
+++ b/lib/zaqar
@@ -20,6 +20,7 @@
# start_zaqar
# stop_zaqar
# cleanup_zaqar
+# cleanup_zaqar_mongodb
# Save trace setting
XTRACE=$(set +o | grep xtrace)
@@ -72,9 +73,17 @@ function is_zaqar_enabled {
return 1
}
-# cleanup_zaqar() - Remove residual data files, anything left over from previous
-# runs that a clean run would need to clean up
+# cleanup_zaqar() - Cleans up general things from previous
+# runs and storage specific left overs.
function cleanup_zaqar {
+ if [ "$ZAQAR_BACKEND" = 'mongodb' ] ; then
+ cleanup_zaqar_mongodb
+ fi
+}
+
+# cleanup_zaqar_mongodb() - Remove residual data files, anything left over from previous
+# runs that a clean run would need to clean up
+function cleanup_zaqar_mongodb {
if ! timeout $SERVICE_TIMEOUT sh -c "while ! mongo zaqar --eval 'db.dropDatabase();'; do sleep 1; done"; then
die $LINENO "Mongo DB did not start"
else
@@ -116,8 +125,9 @@ function configure_zaqar {
iniset $ZAQAR_CONF drivers storage mongodb
iniset $ZAQAR_CONF 'drivers:storage:mongodb' uri mongodb://localhost:27017/zaqar
configure_mongodb
- cleanup_zaqar
fi
+
+ cleanup_zaqar
}
function configure_mongodb {
From e29a55ade1af386fda16217f4c07b90e6e95f47a Mon Sep 17 00:00:00 2001
From: Flavio Percoco
Date: Fri, 5 Sep 2014 16:03:01 +0200
Subject: [PATCH 0033/3421] Add support for redis to Zaqar's lib
A new redis driver has landed in Zaqar. This patch adds support for that
driver to Zaqar's lib.
Change-Id: I97629a303c55ee098e3bfbc534bfb05ccab94649
---
files/apts/zaqar-server | 2 ++
files/rpms/zaqar-server | 2 ++
lib/zaqar | 16 ++++++++++++++++
3 files changed, 20 insertions(+)
diff --git a/files/apts/zaqar-server b/files/apts/zaqar-server
index bc7ef22445..32b10179b0 100644
--- a/files/apts/zaqar-server
+++ b/files/apts/zaqar-server
@@ -1,3 +1,5 @@
python-pymongo
mongodb-server
pkg-config
+redis-server # NOPRIME
+python-redis # NOPRIME
\ No newline at end of file
diff --git a/files/rpms/zaqar-server b/files/rpms/zaqar-server
index d7b7ea89c1..69e8bfa80b 100644
--- a/files/rpms/zaqar-server
+++ b/files/rpms/zaqar-server
@@ -1,3 +1,5 @@
selinux-policy-targeted
mongodb-server
pymongo
+redis # NOPRIME
+python-redis # NOPRIME
diff --git a/lib/zaqar b/lib/zaqar
index fe25e1f7d4..b8570eb282 100644
--- a/lib/zaqar
+++ b/lib/zaqar
@@ -125,11 +125,27 @@ function configure_zaqar {
iniset $ZAQAR_CONF drivers storage mongodb
iniset $ZAQAR_CONF 'drivers:storage:mongodb' uri mongodb://localhost:27017/zaqar
configure_mongodb
+ elif [ "$ZAQAR_BACKEND" = 'redis' ] ; then
+ iniset $ZAQAR_CONF drivers storage redis
+ iniset $ZAQAR_CONF 'drivers:storage:redis' uri redis://localhost:6379
+ configure_redis
fi
cleanup_zaqar
}
+function configure_redis {
+ if is_ubuntu; then
+ install_package redis-server
+ elif is_fedora; then
+ install_package redis
+ else
+ exit_distro_not_supported "redis installation"
+ fi
+
+ install_package python-redis
+}
+
function configure_mongodb {
# Set nssize to 2GB. This increases the number of namespaces supported
# # per database.
From 6566f21ddfb038c2eee402cdcb097f43f3480006 Mon Sep 17 00:00:00 2001
From: Adam Gandelman
Date: Thu, 2 Oct 2014 11:25:03 -0700
Subject: [PATCH 0034/3421] Adds qemu packages to ironic's apts
Nodepool images have recently migrated to being built with DIB, resulting
in strange changes in how the package dependency chain works out. This
explicitly adds required qemu packages to Ironic's apts to avoid some
not being pulled in by package dependencies alone.
Change-Id: I60373ee5ad7445cd54c8c013085b28d82bb0d085
Closes-bug: #1376863
---
files/apts/ironic | 3 +++
1 file changed, 3 insertions(+)
diff --git a/files/apts/ironic b/files/apts/ironic
index 283d1b27f5..45fdeccbb4 100644
--- a/files/apts/ironic
+++ b/files/apts/ironic
@@ -9,6 +9,9 @@ openvswitch-switch
openvswitch-datapath-dkms
python-libguestfs
python-libvirt
+qemu
+qemu-kvm
+qemu-utils
syslinux
tftpd-hpa
xinetd
From 3324f19f5aeb3c8933447752dbc2c1b8c7f9b2de Mon Sep 17 00:00:00 2001
From: Dean Troyer
Date: Thu, 18 Sep 2014 09:26:39 -0500
Subject: [PATCH 0035/3421] Fix docs build errors
Fix shocco errors during docs generation
Closes-Bug: 1362691
Change-Id: I2b7fb008c89f0b4e7280b2d0a054320765e83e47
---
functions | 8 ++++----
functions-common | 4 +++-
lib/cinder_backends/xiv | 3 ++-
lib/neutron | 7 ++++---
lib/neutron_plugins/oneconvergence | 3 ++-
lib/nova | 2 +-
lib/nova_plugins/functions-libvirt | 2 +-
lib/opendaylight | 11 +++++------
lib/tls | 2 +-
stackrc | 2 +-
tools/create_userrc.sh | 5 ++---
11 files changed, 26 insertions(+), 23 deletions(-)
diff --git a/functions b/functions
index 76f704792e..d343c570c9 100644
--- a/functions
+++ b/functions
@@ -71,10 +71,10 @@ function upload_image {
fi
image="$FILES/${image_fname}"
else
- # File based URL (RFC 1738): file://host/path
+ # File based URL (RFC 1738): ``file://host/path``
# Remote files are not considered here.
- # *nix: file:///home/user/path/file
- # windows: file:///C:/Documents%20and%20Settings/user/path/file
+ # unix: ``file:///home/user/path/file``
+ # windows: ``file:///C:/Documents%20and%20Settings/user/path/file``
image=$(echo $image_url | sed "s/^file:\/\///g")
if [[ ! -f $image || "$(stat -c "%s" $image)" == "0" ]]; then
echo "Not found: $image_url"
@@ -123,7 +123,7 @@ function upload_image {
if [[ "$vmdk_create_type" = "monolithicSparse" ]]; then
vmdk_disktype="sparse"
elif [[ "$vmdk_create_type" = "monolithicFlat" || "$vmdk_create_type" = "vmfs" ]]; then
- # Attempt to retrieve the *-flat.vmdk
+ # Attempt to retrieve the ``*-flat.vmdk``
local flat_fname="$(head -25 $image | { grep -G 'RW\|RDONLY [0-9]+ FLAT\|VMFS' $image || true; })"
flat_fname="${flat_fname#*\"}"
flat_fname="${flat_fname%?}"
diff --git a/functions-common b/functions-common
index 6b1f473004..0ada622e89 100644
--- a/functions-common
+++ b/functions-common
@@ -31,6 +31,7 @@
# - ``TRACK_DEPENDS``
# - ``UNDO_REQUIREMENTS``
# - ``http_proxy``, ``https_proxy``, ``no_proxy``
+#
# Save trace setting
XTRACE=$(set +o | grep xtrace)
@@ -1253,7 +1254,8 @@ function screen_service {
# - the pid of the background process is saved in the usual place
# - the server process is brought back to the foreground
# - if the server process exits prematurely the fg command errors
- # and a message is written to stdout and the service failure file
+ # and a message is written to stdout and the service failure file
+ #
# The pid saved can be used in stop_process() as a process group
# id to kill off all child processes
if [[ -n "$group" ]]; then
diff --git a/lib/cinder_backends/xiv b/lib/cinder_backends/xiv
index dbdb96c5a1..ee5da2d487 100644
--- a/lib/cinder_backends/xiv
+++ b/lib/cinder_backends/xiv
@@ -16,6 +16,7 @@
#
# Authors:
# Alon Marx
+#
# lib/cinder_plugins/xiv
# Configure the xiv_ds8k driver for xiv testing
@@ -61,7 +62,7 @@ function configure_cinder_backend_xiv {
fi
# For reference:
- # XIV_DS8K_BACKEND='IBM-XIV_'${SAN_IP}'_'${SAN_CLUSTERNAME}'_'${CONNECTION_TYPE}
+ # ``XIV_DS8K_BACKEND='IBM-XIV_'${SAN_IP}'_'${SAN_CLUSTERNAME}'_'${CONNECTION_TYPE}``
iniset $CINDER_CONF DEFAULT xiv_ds8k_driver_version $XIV_DRIVER_VERSION
iniset $CINDER_CONF $be_name san_ip $SAN_IP
diff --git a/lib/neutron b/lib/neutron
index ec42677f0f..bd3b6d6988 100644
--- a/lib/neutron
+++ b/lib/neutron
@@ -177,9 +177,10 @@ fi
# Distributed Virtual Router (DVR) configuration
# Can be:
-# legacy - No DVR functionality
-# dvr_snat - Controller or single node DVR
-# dvr - Compute node in multi-node DVR
+# - ``legacy`` - No DVR functionality
+# - ``dvr_snat`` - Controller or single node DVR
+# - ``dvr`` - Compute node in multi-node DVR
+#
Q_DVR_MODE=${Q_DVR_MODE:-legacy}
if [[ "$Q_DVR_MODE" != "legacy" ]]; then
Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch,linuxbridge,l2population
diff --git a/lib/neutron_plugins/oneconvergence b/lib/neutron_plugins/oneconvergence
index e5f0d71200..4fd8c7c48f 100644
--- a/lib/neutron_plugins/oneconvergence
+++ b/lib/neutron_plugins/oneconvergence
@@ -1,5 +1,6 @@
# Neutron One Convergence plugin
-# ---------------------------
+# ------------------------------
+
# Save trace setting
OC_XTRACE=$(set +o | grep xtrace)
set +o xtrace
diff --git a/lib/nova b/lib/nova
index 14d07b05bd..853b69730a 100644
--- a/lib/nova
+++ b/lib/nova
@@ -677,7 +677,7 @@ function start_nova_compute {
if [[ "$VIRT_DRIVER" = 'libvirt' ]]; then
# The group **$LIBVIRT_GROUP** is added to the current user in this script.
- # sg' will be used in run_process to execute nova-compute as a member of the
+ # ``sg`` is used in run_process to execute nova-compute as a member of the
# **$LIBVIRT_GROUP** group.
run_process n-cpu "$NOVA_BIN_DIR/nova-compute --config-file $compute_cell_conf" $LIBVIRT_GROUP
elif [[ "$VIRT_DRIVER" = 'fake' ]]; then
diff --git a/lib/nova_plugins/functions-libvirt b/lib/nova_plugins/functions-libvirt
index f722836693..3a367c2e63 100644
--- a/lib/nova_plugins/functions-libvirt
+++ b/lib/nova_plugins/functions-libvirt
@@ -10,7 +10,7 @@ LV_XTRACE=$(set +o | grep xtrace)
set +o xtrace
# Defaults
-# -------
+# --------
# if we should turn on massive libvirt debugging
DEBUG_LIBVIRT=$(trueorfalse False $DEBUG_LIBVIRT)
diff --git a/lib/opendaylight b/lib/opendaylight
index 1541ac1f09..cc29debd05 100644
--- a/lib/opendaylight
+++ b/lib/opendaylight
@@ -3,9 +3,9 @@
# Dependencies:
#
-# - ``functions`` file
-# # ``DEST`` must be defined
-# # ``STACK_USER`` must be defined
+# ``functions`` file
+# ``DEST`` must be defined
+# ``STACK_USER`` must be defined
# ``stack.sh`` calls the entry points in this order:
#
@@ -55,7 +55,7 @@ ODL_URL=${ODL_URL:-https://nexus.opendaylight.org/content/repositories/opendayli
# Default arguments for OpenDaylight. This is typically used to set
# Java memory options.
-# ODL_ARGS=Xmx1024m -XX:MaxPermSize=512m
+# ``ODL_ARGS=Xmx1024m -XX:MaxPermSize=512m``
ODL_ARGS=${ODL_ARGS:-"-XX:MaxPermSize=384m"}
# How long to pause after ODL starts to let it complete booting
@@ -64,8 +64,6 @@ ODL_BOOT_WAIT=${ODL_BOOT_WAIT:-60}
# The physical provider network to device mapping
ODL_PROVIDER_MAPPINGS=${ODL_PROVIDER_MAPPINGS:-physnet1:eth1}
-# Set up default directories
-
# Entry Points
# ------------
@@ -139,6 +137,7 @@ function start_opendaylight {
# The flags to ODL have the following meaning:
# -of13: runs ODL using OpenFlow 1.3 protocol support.
# -virt ovsdb: Runs ODL in "virtualization" mode with OVSDB support
+
# NOTE(chdent): Leaving this as screen_it instead of run_process until
# the right thing for this service is determined.
screen_it odl-server "cd $ODL_DIR/opendaylight && JAVA_HOME=$JHOME ./run.sh $ODL_ARGS -of13 -virt ovsdb"
diff --git a/lib/tls b/lib/tls
index 061c1cabbf..418313a17a 100644
--- a/lib/tls
+++ b/lib/tls
@@ -383,7 +383,7 @@ function start_tls_proxy {
# Cleanup Functions
-# ===============
+# =================
# Stops all stud processes. This should be done only after all services
diff --git a/stackrc b/stackrc
index 53c857935a..9a530d8d98 100644
--- a/stackrc
+++ b/stackrc
@@ -117,7 +117,7 @@ GIT_TIMEOUT=${GIT_TIMEOUT:-0}
# ------------
# Base GIT Repo URL
-# Another option is http://review.openstack.org/p
+# Another option is https://git.openstack.org
GIT_BASE=${GIT_BASE:-git://git.openstack.org}
# metering service
diff --git a/tools/create_userrc.sh b/tools/create_userrc.sh
index 5b1111ae54..fa0f3009a5 100755
--- a/tools/create_userrc.sh
+++ b/tools/create_userrc.sh
@@ -238,7 +238,7 @@ function get_user_id {
}
if [ $MODE != "create" ]; then
-# looks like I can't ask for all tenant related to a specified user
+ # looks like I can't ask for all tenant related to a specified user
openstack project list --long --quote none -f csv | grep ',True' | grep -v "${SKIP_TENANT}" | while IFS=, read tenant_id tenant_name desc enabled; do
openstack user list --project $tenant_id --long --quote none -f csv | grep ',True' | while IFS=, read user_id user_name project email enabled; do
if [ $MODE = one -a "$user_name" != "$USER_NAME" ]; then
@@ -246,8 +246,7 @@ if [ $MODE != "create" ]; then
fi
# Checks for a specific password defined for an user.
- # Example for an username johndoe:
- # JOHNDOE_PASSWORD=1234
+ # Example for an username johndoe: JOHNDOE_PASSWORD=1234
eval SPECIFIC_UPASSWORD="\$${USER_NAME^^}_PASSWORD"
if [ -n "$SPECIFIC_UPASSWORD" ]; then
USER_PASS=$SPECIFIC_UPASSWORD
From a08ba1c5e362fe294759339ffe3fdf3408149788 Mon Sep 17 00:00:00 2001
From: Dean Troyer
Date: Thu, 12 Jun 2014 18:45:42 -0500
Subject: [PATCH 0036/3421] Add NetApp Cinder backend support
Supports both iSCSI and NFS, and now both 7mode and cluster mode
Change-Id: If590a7a255268fcce4770c94956607251c36fdf5
---
lib/cinder_backends/netapp_iscsi | 64 +++++++++++++++++++++++++++
lib/cinder_backends/netapp_nfs | 75 ++++++++++++++++++++++++++++++++
2 files changed, 139 insertions(+)
create mode 100644 lib/cinder_backends/netapp_iscsi
create mode 100644 lib/cinder_backends/netapp_nfs
diff --git a/lib/cinder_backends/netapp_iscsi b/lib/cinder_backends/netapp_iscsi
new file mode 100644
index 0000000000..7a67da7a26
--- /dev/null
+++ b/lib/cinder_backends/netapp_iscsi
@@ -0,0 +1,64 @@
+# lib/cinder_backends/netapp_iscsi
+# Configure the NetApp iSCSI driver
+
+# Enable with:
+#
+# iSCSI:
+# CINDER_ENABLED_BACKENDS+=,netapp_iscsi:
+
+# Dependencies:
+#
+# - ``functions`` file
+# - ``cinder`` configurations
+
+# ``CINDER_CONF``
+# ``CINDER_CONF_DIR``
+# ``CINDER_ENABLED_BACKENDS``
+
+# configure_cinder_backend_netapp_iscsi - configure iSCSI
+
+# Save trace setting
+MY_XTRACE=$(set +o | grep xtrace)
+set +o xtrace
+
+
+# Entry Points
+# ------------
+
+# configure_cinder_backend_netapp_iscsi - Set config files, create data dirs, etc
+function configure_cinder_backend_netapp_iscsi {
+ # To use NetApp, set the following in local.conf:
+ # CINDER_ENABLED_BACKENDS+=,netapp_iscsi:
+ # NETAPP_MODE=ontap_7mode|ontap_cluster
+ # NETAPP_IP=
+ # NETAPP_LOGIN=
+ # NETAPP_PASSWORD=
+ # NETAPP_ISCSI_VOLUME_LIST=
+
+ # In ontap_cluster mode, the following also needs to be defined:
+ # NETAPP_ISCSI_VSERVER=
+
+ local be_name=$1
+ iniset $CINDER_CONF $be_name volume_backend_name $be_name
+ iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.netapp.common.NetAppDriver"
+ iniset $CINDER_CONF $be_name netapp_storage_family ${NETAPP_MODE:-ontap_7mode}
+ iniset $CINDER_CONF $be_name netapp_server_hostname $NETAPP_IP
+ iniset $CINDER_CONF $be_name netapp_login $NETAPP_LOGIN
+ iniset $CINDER_CONF $be_name netapp_password $NETAPP_PASSWORD
+ iniset $CINDER_CONF $be_name netapp_volume_list $NETAPP_ISCSI_VOLUME_LIST
+
+ iniset $CINDER_CONF $be_name netapp_storage_protocol iscsi
+ iniset $CINDER_CONF $be_name netapp_transport_type https
+
+ if [[ "$NETAPP_MODE" == "ontap_cluster" ]]; then
+ iniset $CINDER_CONF $be_name netapp_vserver $NETAPP_ISCSI_VSERVER
+ fi
+}
+
+
+# Restore xtrace
+$MY_XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/cinder_backends/netapp_nfs b/lib/cinder_backends/netapp_nfs
new file mode 100644
index 0000000000..d90b7f7d19
--- /dev/null
+++ b/lib/cinder_backends/netapp_nfs
@@ -0,0 +1,75 @@
+# lib/cinder_backends/netapp_nfs
+# Configure the NetApp NFS driver
+
+# Enable with:
+#
+# NFS:
+# CINDER_ENABLED_BACKENDS+=,netapp_nfs:
+
+# Dependencies:
+#
+# - ``functions`` file
+# - ``cinder`` configurations
+
+# ``CINDER_CONF``
+# ``CINDER_CONF_DIR``
+# ``CINDER_ENABLED_BACKENDS``
+
+# configure_cinder_backend_netapp_nfs - configure NFS
+
+# Save trace setting
+MY_XTRACE=$(set +o | grep xtrace)
+set +o xtrace
+
+
+# Entry Points
+# ------------
+
+# configure_cinder_backend_netapp_nfs - Set config files, create data dirs, etc
+function configure_cinder_backend_netapp_nfs {
+ # To use NetApp, set the following in local.conf:
+ # CINDER_ENABLED_BACKENDS+=,netapp_nfs:
+ # NETAPP_MODE=ontap_7mode|ontap_cluster
+ # NETAPP_IP=
+ # NETAPP_LOGIN=
+ # NETAPP_PASSWORD=
+ # NETAPP_NFS_VOLUME_LIST=
+
+ # In ontap_cluster mode, the following also needs to be defined:
+ # NETAPP_NFS_VSERVER=
+
+ local be_name=$1
+ iniset $CINDER_CONF $be_name volume_backend_name $be_name
+ iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.netapp.common.NetAppDriver"
+ iniset $CINDER_CONF $be_name netapp_storage_family ${NETAPP_MODE:-ontap_7mode}
+ iniset $CINDER_CONF $be_name netapp_server_hostname $NETAPP_IP
+ iniset $CINDER_CONF $be_name netapp_login $NETAPP_LOGIN
+ iniset $CINDER_CONF $be_name netapp_password $NETAPP_PASSWORD
+
+ iniset $CINDER_CONF $be_name netapp_storage_protocol nfs
+ iniset $CINDER_CONF $be_name netapp_transport_type https
+ iniset $CINDER_CONF $be_name nfs_shares_config $CINDER_CONF_DIR/netapp_shares.conf
+
+ echo "$NETAPP_NFS_VOLUME_LIST" | tee "$CINDER_CONF_DIR/netapp_shares.conf"
+
+ if [[ "$NETAPP_MODE" == "ontap_cluster" ]]; then
+ iniset $CINDER_CONF $be_name netapp_vserver $NETAPP_NFS_VSERVER
+ fi
+}
+
+function cleanup_cinder_backend_netapp_nfs {
+ # Clean up remaining NFS mounts
+ # Be blunt and do them all
+ local m
+ for m in $CINDER_STATE_PATH/mnt/*; do
+ sudo umount $m
+ done
+}
+
+
+# Restore xtrace
+$MY_XTRACE
+
+# Local variables:
+# mode: shell-script
+# End:
From 3edd4540b936d1f03e990660312f2377354140a8 Mon Sep 17 00:00:00 2001
From: Mike Spreitzer
Date: Fri, 29 Aug 2014 06:52:54 +0000
Subject: [PATCH 0037/3421] Added libvirt-dev[el] as a required system package
Added libvirt-dev as a system package to install with apt-get and
libvirt-devel as a system package to install with rpm.
Early drafts qualified with "testonly" (meaning to install only if
INSTALL_TESTONLY_PACKAGES is true). This is needed because installing
libvirt-python version 1.2.5 on Ubuntu 14.04 was observed to fail in
the building step if libvirt-dev is missing. Later drafts removed
that qualification, because Sean Dague said he thinks libvirt-dev[el]
is always required.
Change-Id: Ie6a272f60059a1f363630f307416b32c450a1ebb
Closes-Bug: 1362948
---
files/apts/nova | 1 +
files/rpms/nova | 1 +
2 files changed, 2 insertions(+)
diff --git a/files/apts/nova b/files/apts/nova
index a3b0cb1521..66f29c4baf 100644
--- a/files/apts/nova
+++ b/files/apts/nova
@@ -18,6 +18,7 @@ sudo
qemu-kvm # NOPRIME
qemu # dist:wheezy,jessie NOPRIME
libvirt-bin # NOPRIME
+libvirt-dev # NOPRIME
pm-utils
libjs-jquery-tablesorter # Needed for coverage html reports
vlan
diff --git a/files/rpms/nova b/files/rpms/nova
index dc1944b1de..f3261c6ae0 100644
--- a/files/rpms/nova
+++ b/files/rpms/nova
@@ -11,6 +11,7 @@ iputils
kpartx
kvm # NOPRIME
libvirt-bin # NOPRIME
+libvirt-devel # NOPRIME
libvirt-python # NOPRIME
libxml2-python
numpy # needed by websockify for spice console
From b7cda389376ed6996f84122fb7b021cf8c6b5007 Mon Sep 17 00:00:00 2001
From: Sean Dague
Date: Fri, 3 Oct 2014 08:00:52 -0400
Subject: [PATCH 0038/3421] fix olso != oslo typos
Apparently oslo is the hardest word in the world for me to understand
that I didn't spell correctly.
Change-Id: Id1b52529001319eaf41321118ab560711c752003
---
lib/oslo | 2 +-
stackrc | 34 +++++++++++++++++-----------------
2 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/lib/oslo b/lib/oslo
index c95a3a805f..a20aa1450f 100644
--- a/lib/oslo
+++ b/lib/oslo
@@ -63,7 +63,7 @@ function install_oslo {
_do_install_oslo_lib "oslo.messaging"
_do_install_oslo_lib "oslo.rootwrap"
_do_install_oslo_lib "oslo.db"
- _do_install_oslo_lib "olso.vmware"
+ _do_install_oslo_lib "oslo.vmware"
_do_install_oslo_lib "pycadf"
_do_install_oslo_lib "stevedore"
_do_install_oslo_lib "taskflow"
diff --git a/stackrc b/stackrc
index eab8c9d7e9..15f7f82511 100644
--- a/stackrc
+++ b/stackrc
@@ -223,47 +223,47 @@ GITBRANCH["cliff"]=${CLIFF_BRANCH:-master}
# oslo.concurrency
GITREPO["oslo.concurrency"]=${OSLOCON_REPO:-${GIT_BASE}/openstack/oslo.concurrency.git}
-GITBRANCH["olso.concurrency"]=${OSLOCON_BRANCH:-master}
+GITBRANCH["oslo.concurrency"]=${OSLOCON_BRANCH:-master}
# oslo.config
GITREPO["oslo.config"]=${OSLOCFG_REPO:-${GIT_BASE}/openstack/oslo.config.git}
GITBRANCH["oslo.config"]=${OSLOCFG_BRANCH:-master}
# oslo.db
-GITREPO["olso.db"]=${OSLODB_REPO:-${GIT_BASE}/openstack/oslo.db.git}
-GITBRANCH["olso.db"]=${OSLODB_BRANCH:-master}
+GITREPO["oslo.db"]=${OSLODB_REPO:-${GIT_BASE}/openstack/oslo.db.git}
+GITBRANCH["oslo.db"]=${OSLODB_BRANCH:-master}
# oslo.i18n
-GITREPO["olso.i18n"]=${OSLOI18N_REPO:-${GIT_BASE}/openstack/oslo.i18n.git}
-GITBRANCH["olso.i18n"]=${OSLOI18N_BRANCH:-master}
+GITREPO["oslo.i18n"]=${OSLOI18N_REPO:-${GIT_BASE}/openstack/oslo.i18n.git}
+GITBRANCH["oslo.i18n"]=${OSLOI18N_BRANCH:-master}
# oslo.log
-GITREPO["olso.log"]=${OSLOLOG_REPO:-${GIT_BASE}/openstack/oslo.log.git}
-GITBRANCH["olso.log"]=${OSLOLOG_BRANCH:-master}
+GITREPO["oslo.log"]=${OSLOLOG_REPO:-${GIT_BASE}/openstack/oslo.log.git}
+GITBRANCH["oslo.log"]=${OSLOLOG_BRANCH:-master}
# oslo.messaging
-GITREPO["olso.messaging"]=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
-GITBRANCH["olso.messaging"]=${OSLOMSG_BRANCH:-master}
+GITREPO["oslo.messaging"]=${OSLOMSG_REPO:-${GIT_BASE}/openstack/oslo.messaging.git}
+GITBRANCH["oslo.messaging"]=${OSLOMSG_BRANCH:-master}
# oslo.middleware
GITREPO["oslo.middleware"]=${OSLOMID_REPO:-${GIT_BASE}/openstack/oslo.middleware.git}
GITBRANCH["oslo.middleware"]=${OSLOMID_BRANCH:-master}
# oslo.rootwrap
-GITREPO["olso.rootwrap"]=${OSLORWRAP_REPO:-${GIT_BASE}/openstack/oslo.rootwrap.git}
-GITBRANCH["olso.rootwrap"]=${OSLORWRAP_BRANCH:-master}
+GITREPO["oslo.rootwrap"]=${OSLORWRAP_REPO:-${GIT_BASE}/openstack/oslo.rootwrap.git}
+GITBRANCH["oslo.rootwrap"]=${OSLORWRAP_BRANCH:-master}
# oslo.serialization
-GITREPO["olso.serialization"]=${OSLOSERIALIZATION_REPO:-${GIT_BASE}/openstack/oslo.serialization.git}
-GITBRANCH["olso.serialization"]=${OSLOSERIALIZATION_BRANCH:-master}
+GITREPO["oslo.serialization"]=${OSLOSERIALIZATION_REPO:-${GIT_BASE}/openstack/oslo.serialization.git}
+GITBRANCH["oslo.serialization"]=${OSLOSERIALIZATION_BRANCH:-master}
# oslo.utils
-GITREPO["olso.utils"]=${OSLOUTILS_REPO:-${GIT_BASE}/openstack/oslo.utils.git}
-GITBRANCH["olso.utils"]=${OSLOUTILS_BRANCH:-master}
+GITREPO["oslo.utils"]=${OSLOUTILS_REPO:-${GIT_BASE}/openstack/oslo.utils.git}
+GITBRANCH["oslo.utils"]=${OSLOUTILS_BRANCH:-master}
# oslo.vmware
-GITREPO["olso.vmware"]=${OSLOVMWARE_REPO:-${GIT_BASE}/openstack/oslo.vmware.git}
-GITBRANCH["olso.vmware"]=${OSLOVMWARE_BRANCH:-master}
+GITREPO["oslo.vmware"]=${OSLOVMWARE_REPO:-${GIT_BASE}/openstack/oslo.vmware.git}
+GITBRANCH["oslo.vmware"]=${OSLOVMWARE_BRANCH:-master}
# pycadf auditing library
GITREPO["pycadf"]=${PYCADF_REPO:-${GIT_BASE}/openstack/pycadf.git}
From 24516d04fb6d0b3a5213e9d962fdf307e6a38d55 Mon Sep 17 00:00:00 2001
From: Sean Dague
Date: Thu, 2 Oct 2014 12:29:08 -0400
Subject: [PATCH 0039/3421] restructure stackrc into groupings
in order to support installing from stable libraries we first need to
actually sort out all the categories our giant list of git repos fit
into. This will make it much easier to not lose one in the process.
Change-Id: I708c65428fdc7442e1661037f425e466048166d3
---
stackrc | 248 +++++++++++++++++++++++++++++++++++---------------------
1 file changed, 156 insertions(+), 92 deletions(-)
diff --git a/stackrc b/stackrc
index 15f7f82511..69915d6d76 100644
--- a/stackrc
+++ b/stackrc
@@ -120,102 +120,130 @@ GIT_TIMEOUT=${GIT_TIMEOUT:-0}
# Another option is http://review.openstack.org/p
GIT_BASE=${GIT_BASE:-git://git.openstack.org}
+##############
+#
+# OpenStack Server Components
+#
+##############
+
# metering service
CEILOMETER_REPO=${CEILOMETER_REPO:-${GIT_BASE}/openstack/ceilometer.git}
CEILOMETER_BRANCH=${CEILOMETER_BRANCH:-master}
-# ceilometer client library
-CEILOMETERCLIENT_REPO=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git}
-CEILOMETERCLIENT_BRANCH=${CEILOMETERCLIENT_BRANCH:-master}
-
# volume service
CINDER_REPO=${CINDER_REPO:-${GIT_BASE}/openstack/cinder.git}
CINDER_BRANCH=${CINDER_BRANCH:-master}
-# volume client
-CINDERCLIENT_REPO=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git}
-CINDERCLIENT_BRANCH=${CINDERCLIENT_BRANCH:-master}
-
# image catalog service
GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git}
GLANCE_BRANCH=${GLANCE_BRANCH:-master}
-GLANCE_STORE_REPO=${GLANCE_STORE_REPO:-${GIT_BASE}/openstack/glance_store.git}
-GLANCE_STORE_BRANCH=${GLANCE_STORE_BRANCH:-master}
-
-# python glance client library
-GLANCECLIENT_REPO=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git}
-GLANCECLIENT_BRANCH=${GLANCECLIENT_BRANCH:-master}
-
# heat service
HEAT_REPO=${HEAT_REPO:-${GIT_BASE}/openstack/heat.git}
HEAT_BRANCH=${HEAT_BRANCH:-master}
-# python heat client library
-HEATCLIENT_REPO=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git}
-HEATCLIENT_BRANCH=${HEATCLIENT_BRANCH:-master}
-
-# heat-cfntools server agent
-HEAT_CFNTOOLS_REPO=${HEAT_CFNTOOLS_REPO:-${GIT_BASE}/openstack/heat-cfntools.git}
-HEAT_CFNTOOLS_BRANCH=${HEAT_CFNTOOLS_BRANCH:-master}
-
-# heat example templates and elements
-HEAT_TEMPLATES_REPO=${HEAT_TEMPLATES_REPO:-${GIT_BASE}/openstack/heat-templates.git}
-HEAT_TEMPLATES_BRANCH=${HEAT_TEMPLATES_BRANCH:-master}
-
# django powered web control panel for openstack
HORIZON_REPO=${HORIZON_REPO:-${GIT_BASE}/openstack/horizon.git}
HORIZON_BRANCH=${HORIZON_BRANCH:-master}
-# django openstack_auth library
-HORIZONAUTH_REPO=${HORIZONAUTH_REPO:-${GIT_BASE}/openstack/django_openstack_auth.git}
-HORIZONAUTH_BRANCH=${HORIZONAUTH_BRANCH:-master}
-
# baremetal provisioning service
IRONIC_REPO=${IRONIC_REPO:-${GIT_BASE}/openstack/ironic.git}
IRONIC_BRANCH=${IRONIC_BRANCH:-master}
-IRONIC_PYTHON_AGENT_REPO=${IRONIC_PYTHON_AGENT_REPO:-${GIT_BASE}/openstack/ironic-python-agent.git}
-IRONIC_PYTHON_AGENT_BRANCH=${IRONIC_PYTHON_AGENT_BRANCH:-master}
-
-# ironic client
-IRONICCLIENT_REPO=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git}
-IRONICCLIENT_BRANCH=${IRONICCLIENT_BRANCH:-master}
# unified auth system (manages accounts/tokens)
KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git}
KEYSTONE_BRANCH=${KEYSTONE_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}
-
-# keystone middleware
-KEYSTONEMIDDLEWARE_REPO=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git}
-KEYSTONEMIDDLEWARE_BRANCH=${KEYSTONEMIDDLEWARE_BRANCH:-master}
+# neutron service
+NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
+NEUTRON_BRANCH=${NEUTRON_BRANCH:-master}
# compute service
NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git}
NOVA_BRANCH=${NOVA_BRANCH:-master}
+# storage service
+SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
+SWIFT_BRANCH=${SWIFT_BRANCH:-master}
+
+# trove service
+TROVE_REPO=${TROVE_REPO:-${GIT_BASE}/openstack/trove.git}
+TROVE_BRANCH=${TROVE_BRANCH:-master}
+
+##############
+#
+# Testing Components
+#
+##############
+
+# consolidated openstack requirements
+REQUIREMENTS_REPO=${REQUIREMENTS_REPO:-${GIT_BASE}/openstack/requirements.git}
+REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-master}
+
+# 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}
+
+
+##############
+#
+# OpenStack Client Library Componets
+#
+##############
+
+# ceilometer client library
+CEILOMETERCLIENT_REPO=${CEILOMETERCLIENT_REPO:-${GIT_BASE}/openstack/python-ceilometerclient.git}
+CEILOMETERCLIENT_BRANCH=${CEILOMETERCLIENT_BRANCH:-master}
+
+# volume client
+CINDERCLIENT_REPO=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git}
+CINDERCLIENT_BRANCH=${CINDERCLIENT_BRANCH:-master}
+
+# python glance client library
+GLANCECLIENT_REPO=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git}
+GLANCECLIENT_BRANCH=${GLANCECLIENT_BRANCH:-master}
+
+# python heat client library
+HEATCLIENT_REPO=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git}
+HEATCLIENT_BRANCH=${HEATCLIENT_BRANCH:-master}
+
+# ironic client
+IRONICCLIENT_REPO=${IRONICCLIENT_REPO:-${GIT_BASE}/openstack/python-ironicclient.git}
+IRONICCLIENT_BRANCH=${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}
+
+# neutron client
+NEUTRONCLIENT_REPO=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git}
+NEUTRONCLIENT_BRANCH=${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}
-# os-apply-config configuration template tool
-OAC_REPO=${OAC_REPO:-${GIT_BASE}/openstack/os-apply-config.git}
-OAC_BRANCH=${OAC_BRANCH:-master}
+# python swift client library
+SWIFTCLIENT_REPO=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git}
+SWIFTCLIENT_BRANCH=${SWIFTCLIENT_BRANCH:-master}
-# os-collect-config configuration agent
-OCC_REPO=${OCC_REPO:-${GIT_BASE}/openstack/os-collect-config.git}
-OCC_BRANCH=${OCC_BRANCH:-master}
+# trove client library test
+TROVECLIENT_REPO=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git}
+TROVECLIENT_BRANCH=${TROVECLIENT_BRANCH:-master}
# consolidated openstack python client
OPENSTACKCLIENT_REPO=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git}
OPENSTACKCLIENT_BRANCH=${OPENSTACKCLIENT_BRANCH:-master}
-# os-refresh-config configuration run-parts tool
-ORC_REPO=${ORC_REPO:-${GIT_BASE}/openstack/os-refresh-config.git}
-ORC_BRANCH=${ORC_BRANCH:-master}
+###################
+#
+# Oslo Libraries
+#
+###################
# cliff command line framework
GITREPO["cliff"]=${CLIFF_REPO:-${GIT_BASE}/openstack/cliff.git}
@@ -281,58 +309,68 @@ GITBRANCH["taskflow"]=${TASKFLOW_BRANCH:-master}
GITREPO["pbr"]=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git}
GITBRANCH["pbr"]=${PBR_BRANCH:-master}
-# neutron service
-NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
-NEUTRON_BRANCH=${NEUTRON_BRANCH:-master}
+##################
+#
+# Libraries managed by OpenStack programs (non oslo)
+#
+##################
-# neutron client
-NEUTRONCLIENT_REPO=${NEUTRONCLIENT_REPO:-${GIT_BASE}/openstack/python-neutronclient.git}
-NEUTRONCLIENT_BRANCH=${NEUTRONCLIENT_BRANCH:-master}
+# glance store library
+GLANCE_STORE_REPO=${GLANCE_STORE_REPO:-${GIT_BASE}/openstack/glance_store.git}
+GLANCE_STORE_BRANCH=${GLANCE_STORE_BRANCH:-master}
-# consolidated openstack requirements
-REQUIREMENTS_REPO=${REQUIREMENTS_REPO:-${GIT_BASE}/openstack/requirements.git}
-REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-master}
+# heat-cfntools server agent
+HEAT_CFNTOOLS_REPO=${HEAT_CFNTOOLS_REPO:-${GIT_BASE}/openstack/heat-cfntools.git}
+HEAT_CFNTOOLS_BRANCH=${HEAT_CFNTOOLS_BRANCH:-master}
-# storage service
-SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
-SWIFT_BRANCH=${SWIFT_BRANCH:-master}
+# heat example templates and elements
+HEAT_TEMPLATES_REPO=${HEAT_TEMPLATES_REPO:-${GIT_BASE}/openstack/heat-templates.git}
+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}
+
+# keystone middleware
+KEYSTONEMIDDLEWARE_REPO=${KEYSTONEMIDDLEWARE_REPO:-${GIT_BASE}/openstack/keystonemiddleware.git}
+KEYSTONEMIDDLEWARE_BRANCH=${KEYSTONEMIDDLEWARE_BRANCH:-master}
+
+# s3 support for swift
SWIFT3_REPO=${SWIFT3_REPO:-${GIT_BASE}/stackforge/swift3.git}
SWIFT3_BRANCH=${SWIFT3_BRANCH:-master}
-# python swift client library
-SWIFTCLIENT_REPO=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git}
-SWIFTCLIENT_BRANCH=${SWIFTCLIENT_BRANCH:-master}
-# Tempest test suite
-TEMPEST_REPO=${TEMPEST_REPO:-${GIT_BASE}/openstack/tempest.git}
-TEMPEST_BRANCH=${TEMPEST_BRANCH:-master}
-
-TEMPEST_LIB_REPO=${TEMPEST_LIB_REPO:-${GIT_BASE}/openstack/tempest-lib.git}
-TEMPEST_LIB_BRANCH=${TEMPEST_LIB_BRANCH:-master}
+##################
+#
+# TripleO Components
+#
+##################
-# Tripleo elements for diskimage-builder images
-TIE_REPO=${TIE_REPO:-${GIT_BASE}/openstack/tripleo-image-elements.git}
-TIE_BRANCH=${TIE_BRANCH:-master}
+# diskimage-builder
+DIB_REPO=${DIB_REPO:-${GIT_BASE}/openstack/diskimage-builder.git}
+DIB_BRANCH=${DIB_BRANCH:-master}
-# a websockets/html5 or flash powered VNC console for vm instances
-NOVNC_REPO=${NOVNC_REPO:-https://github.com/kanaka/noVNC.git}
-NOVNC_BRANCH=${NOVNC_BRANCH:-master}
+# os-apply-config configuration template tool
+OAC_REPO=${OAC_REPO:-${GIT_BASE}/openstack/os-apply-config.git}
+OAC_BRANCH=${OAC_BRANCH:-master}
-# ryu service
-RYU_REPO=${RYU_REPO:-https://github.com/osrg/ryu.git}
-RYU_BRANCH=${RYU_BRANCH:-master}
+# os-collect-config configuration agent
+OCC_REPO=${OCC_REPO:-${GIT_BASE}/openstack/os-collect-config.git}
+OCC_BRANCH=${OCC_BRANCH:-master}
-# a websockets/html5 or flash powered SPICE console for vm instances
-SPICE_REPO=${SPICE_REPO:-http://anongit.freedesktop.org/git/spice/spice-html5.git}
-SPICE_BRANCH=${SPICE_BRANCH:-master}
+# os-refresh-config configuration run-parts tool
+ORC_REPO=${ORC_REPO:-${GIT_BASE}/openstack/os-refresh-config.git}
+ORC_BRANCH=${ORC_BRANCH:-master}
-# trove service
-TROVE_REPO=${TROVE_REPO:-${GIT_BASE}/openstack/trove.git}
-TROVE_BRANCH=${TROVE_BRANCH:-master}
+# Tripleo elements for diskimage-builder images
+TIE_REPO=${TIE_REPO:-${GIT_BASE}/openstack/tripleo-image-elements.git}
+TIE_BRANCH=${TIE_BRANCH:-master}
-# trove client library test
-TROVECLIENT_REPO=${TROVECLIENT_REPO:-${GIT_BASE}/openstack/python-troveclient.git}
-TROVECLIENT_BRANCH=${TROVECLIENT_BRANCH:-master}
+#################
+#
+# Additional Libraries
+#
+#################
# stackforge libraries that are used by OpenStack core services
# wsme
@@ -348,6 +386,32 @@ SQLALCHEMY_MIGRATE_REPO=${SQLALCHEMY_MIGRATE_REPO:-${GIT_BASE}/stackforge/sqlalc
SQLALCHEMY_MIGRATE_BRANCH=${SQLALCHEMY_MIGRATE_BRANCH:-master}
+#################
+#
+# 3rd Party Components (non pip installable)
+#
+# NOTE(sdague): these should be converted to release version installs or removed
+#
+#################
+
+# ironic python agent
+IRONIC_PYTHON_AGENT_REPO=${IRONIC_PYTHON_AGENT_REPO:-${GIT_BASE}/openstack/ironic-python-agent.git}
+IRONIC_PYTHON_AGENT_BRANCH=${IRONIC_PYTHON_AGENT_BRANCH:-master}
+
+# a websockets/html5 or flash powered VNC console for vm instances
+NOVNC_REPO=${NOVNC_REPO:-https://github.com/kanaka/noVNC.git}
+NOVNC_BRANCH=${NOVNC_BRANCH:-master}
+
+# ryu service
+RYU_REPO=${RYU_REPO:-https://github.com/osrg/ryu.git}
+RYU_BRANCH=${RYU_BRANCH:-master}
+
+# a websockets/html5 or flash powered SPICE console for vm instances
+SPICE_REPO=${SPICE_REPO:-http://anongit.freedesktop.org/git/spice/spice-html5.git}
+SPICE_BRANCH=${SPICE_BRANCH:-master}
+
+
+
# Nova hypervisor configuration. We default to libvirt with **kvm** but will
# drop back to **qemu** if we are unable to load the kvm module. ``stack.sh`` can
# also install an **LXC**, **OpenVZ** or **XenAPI** based system. If xenserver-core
From 608f884edb2faff59100bb5aa84e8d59e5d3e6d8 Mon Sep 17 00:00:00 2001
From: Kirill Shileev
Date: Fri, 3 Oct 2014 22:48:58 +0400
Subject: [PATCH 0040/3421] Use ALT_INSTANCE_USER for image_alt_ssh_user
Change-Id: Ib9cfb6e989575d62c493cbe92fdefd8c90256bcd
Closes-Bug: 1377914
---
lib/tempest | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/tempest b/lib/tempest
index d677c7e33c..3e55d792ff 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -284,7 +284,7 @@ function configure_tempest {
iniset $TEMPEST_CONFIG compute image_ref $image_uuid
iniset $TEMPEST_CONFIG compute image_ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
iniset $TEMPEST_CONFIG compute image_ref_alt $image_uuid_alt
- iniset $TEMPEST_CONFIG compute image_alt_ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
+ iniset $TEMPEST_CONFIG compute image_alt_ssh_user ${ALT_INSTANCE_USER:-cirros}
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
From 0e4cd038287bcf36ff31c4e7b22266051198b44c Mon Sep 17 00:00:00 2001
From: Adam Gandelman
Date: Fri, 3 Oct 2014 13:27:17 -0700
Subject: [PATCH 0041/3421] Source functions from stackrc
stackrc now requires GITREPO, GITBRANCH, GITDIR and has been
dependent on functions for a while (is_package_installed). Ensure
we source the required functions file when stackrc is loaded. Avoids
unexpected issues in grenade where they may or may not have been loaded
depending on the configuration.
Closes-bug: #1377274
Change-Id: I5027cfad07af0de7ff39f424601d6f7ec5dcadae
---
stackrc | 3 +++
1 file changed, 3 insertions(+)
diff --git a/stackrc b/stackrc
index 15f7f82511..13b2e22675 100644
--- a/stackrc
+++ b/stackrc
@@ -3,6 +3,9 @@
# Find the other rc files
RC_DIR=$(cd $(dirname "${BASH_SOURCE:-$0}") && pwd)
+# Source required devstack functions and globals
+source $RC_DIR/functions
+
# Destination path for installation
DEST=/opt/stack
From 6c585d739d918ae563a6291a8661fd82b872a93a Mon Sep 17 00:00:00 2001
From: Chmouel Boudjnah
Date: Sat, 4 Oct 2014 08:14:30 +0200
Subject: [PATCH 0042/3421] Refactor swift config services
Make the sed the command to change the recon_cache_path into the renamed
generate_swift_config_services
Change-Id: I6092c26836320fab607eb9cd07f63189a9ba1ddd
---
lib/swift | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/lib/swift b/lib/swift
index 813955226e..21ed920149 100644
--- a/lib/swift
+++ b/lib/swift
@@ -251,7 +251,7 @@ function _config_swift_apache_wsgi {
# This function generates an object/container/account configuration
# emulating 4 nodes on different ports
-function generate_swift_config {
+function generate_swift_config_services {
local swift_node_config=$1
local node_id=$2
local bind_port=$3
@@ -286,6 +286,10 @@ function generate_swift_config {
iniuncomment ${swift_node_config} ${server_type}-replicator vm_test_mode
iniset ${swift_node_config} ${server_type}-replicator vm_test_mode yes
+
+ # Using a sed and not iniset/iniuncomment because we want to a global
+ # modification and make sure it works for new sections.
+ sed -i -e "s,#[ ]*recon_cache_path .*,recon_cache_path = ${SWIFT_DATA_DIR}/cache," ${swift_node_config}
}
@@ -436,23 +440,18 @@ EOF
for node_number in ${SWIFT_REPLICAS_SEQ}; do
local swift_node_config=${SWIFT_CONF_DIR}/object-server/${node_number}.conf
cp ${SWIFT_DIR}/etc/object-server.conf-sample ${swift_node_config}
- generate_swift_config ${swift_node_config} ${node_number} $(( OBJECT_PORT_BASE + 10 * (node_number - 1) )) object
+ generate_swift_config_services ${swift_node_config} ${node_number} $(( OBJECT_PORT_BASE + 10 * (node_number - 1) )) object
iniset ${swift_node_config} filter:recon recon_cache_path ${SWIFT_DATA_DIR}/cache
- # Using a sed and not iniset/iniuncomment because we want to a global
- # modification and make sure it works for new sections.
- sed -i -e "s,#[ ]*recon_cache_path .*,recon_cache_path = ${SWIFT_DATA_DIR}/cache," ${swift_node_config}
swift_node_config=${SWIFT_CONF_DIR}/container-server/${node_number}.conf
cp ${SWIFT_DIR}/etc/container-server.conf-sample ${swift_node_config}
- generate_swift_config ${swift_node_config} ${node_number} $(( CONTAINER_PORT_BASE + 10 * (node_number - 1) )) container
+ generate_swift_config_services ${swift_node_config} ${node_number} $(( CONTAINER_PORT_BASE + 10 * (node_number - 1) )) container
iniuncomment ${swift_node_config} app:container-server allow_versions
iniset ${swift_node_config} app:container-server allow_versions "true"
- sed -i -e "s,#[ ]*recon_cache_path .*,recon_cache_path = ${SWIFT_DATA_DIR}/cache," ${swift_node_config}
swift_node_config=${SWIFT_CONF_DIR}/account-server/${node_number}.conf
cp ${SWIFT_DIR}/etc/account-server.conf-sample ${swift_node_config}
- generate_swift_config ${swift_node_config} ${node_number} $(( ACCOUNT_PORT_BASE + 10 * (node_number - 1) )) account
- sed -i -e "s,#[ ]*recon_cache_path .*,recon_cache_path = ${SWIFT_DATA_DIR}/cache," ${swift_node_config}
+ generate_swift_config_services ${swift_node_config} ${node_number} $(( ACCOUNT_PORT_BASE + 10 * (node_number - 1) )) account
done
# Set new accounts in tempauth to match keystone tenant/user (to make testing easier)
From 690e3c25742f47fd2a42d6407ffa30bc99288dc0 Mon Sep 17 00:00:00 2001
From: Davanum Srinivas
Date: Sun, 5 Oct 2014 20:06:33 -0400
Subject: [PATCH 0043/3421] Fix Typos found with misspell
git ls-files | grep -v locale | misspellings -f -
Change-Id: I0dc56ba64ae4bdc681ccf4a1d2d23238f541650d
---
docs/source/configuration.html | 2 +-
docs/source/guides/multinode-lab.html | 8 ++++----
docs/source/guides/single-machine.html | 6 +++---
docs/source/openrc.html | 2 +-
tools/build_docs.sh | 2 +-
tools/xen/install_os_domU.sh | 2 +-
6 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/docs/source/configuration.html b/docs/source/configuration.html
index fbcead7ab4..044bafc70d 100644
--- a/docs/source/configuration.html
+++ b/docs/source/configuration.html
@@ -146,7 +146,7 @@
Common Configuration Variables
One syslog to bind them all
Default: SYSLOG=False SYSLOG_HOST=$HOST_IP SYSLOG_PORT=516
- Logging all services to a single syslog can be convenient. Enable syslogging by seting SYSLOG to True. If the destination log host is not localhost SYSLOG_HOST and SYSLOG_PORT can be used to direct the message stream to the log host.
+ Logging all services to a single syslog can be convenient. Enable syslogging by setting SYSLOG to True. If the destination log host is not localhost SYSLOG_HOST and SYSLOG_PORT can be used to direct the message stream to the log host.
OpenStack runs as a non-root user that has sudo access to root. There is nothing special
about the name, we'll use stack here. Every node must use the same name and
preferably uid. If you created a user during the OS install you can use it and give it
- sudo priviledges below. Otherwise create the stack user:
+ sudo privileges below. Otherwise create the stack user:
This user will be making many changes to your system during installation and operation
- so it needs to have sudo priviledges to root without a password:
+ so it needs to have sudo privileges to root without a password:
From here on use the stack user. Logout and login as the
stack user.
@@ -221,7 +221,7 @@
Options pimp your stack
Additional Users
-
DevStack creates two OpenStack users (admin and demo) and two tenants (also admin and demo). admin is exactly what it sounds like, a priveleged administrative account that is a member of both the admin and demo tenants. demo is a normal user account that is only a member of the demo tenant. Creating additional OpenStack users can be done through the dashboard, sometimes it is easier to do them in bulk from a script, especially since they get blown away every time
+
DevStack creates two OpenStack users (admin and demo) and two tenants (also admin and demo). admin is exactly what it sounds like, a privileged administrative account that is a member of both the admin and demo tenants. demo is a normal user account that is only a member of the demo tenant. Creating additional OpenStack users can be done through the dashboard, sometimes it is easier to do them in bulk from a script, especially since they get blown away every time
stack.sh runs. The following steps are ripe for scripting:
DevStack is capable of using rsyslog to agregate logging across the cluster.
+
DevStack is capable of using rsyslog to aggregate logging across the cluster.
It is off by default; to turn it on set SYSLOG=True in local.conf.
SYSLOG_HOST defaults to HOST_IP; on the compute nodes it
must be set to the IP of the cluster controller to send syslog output there. In the example
diff --git a/docs/source/guides/single-machine.html b/docs/source/guides/single-machine.html
index ca9cafac4e..9471972382 100644
--- a/docs/source/guides/single-machine.html
+++ b/docs/source/guides/single-machine.html
@@ -69,9 +69,9 @@
Installation shake and bake
Add your user
-
We need to add a user to install DevStack. (if you created a user during install you can skip this step and just give the user sudo priviledges below)
+
We need to add a user to install DevStack. (if you created a user during install you can skip this step and just give the user sudo privileges below)
adduser stack
-
Since this user will be making many changes to your system, it will need to have sudo priviledges:
+
Since this user will be making many changes to your system, it will need to have sudo privileges:
From here on you should use the user you created. Logout and login as that user.
@@ -113,7 +113,7 @@
Run DevStack
Using OpenStack
At this point you should be able to access the dashboard from other computers on the
local network. In this example that would be http://192.168.1.201/ for the dashboard (aka Horizon).
- Launch VMs and if you give them floating IPs and security group access those VMs will be accessable from other machines on your network.
+ Launch VMs and if you give them floating IPs and security group access those VMs will be accessible from other machines on your network.
Some examples of using the OpenStack command-line clients nova and glance
are in the shakedown scripts in devstack/exercises. exercise.sh
diff --git a/docs/source/openrc.html b/docs/source/openrc.html
index b84d26839b..da6697fb92 100644
--- a/docs/source/openrc.html
+++ b/docs/source/openrc.html
@@ -60,7 +60,7 @@
openrc User authentication settings
The introduction of Keystone to the OpenStack ecosystem has standardized the
term tenant as the entity that owns resources. In some places references
still exist to the original Nova term project for this use. Also,
- tenant_name is prefered to tenant_id.
+ tenant_name is preferred to tenant_id.
OS_TENANT_NAME=demo
OS_USERNAME
diff --git a/tools/build_docs.sh b/tools/build_docs.sh
index e999eff751..96bd8924d6 100755
--- a/tools/build_docs.sh
+++ b/tools/build_docs.sh
@@ -17,7 +17,7 @@
## prevent stray files in the workspace being added tot he docs)
## -o Write the static HTML output to
## (Note that will be deleted and re-created to ensure it is clean)
-## -g Update the old gh-pages repo (set PUSH=1 to actualy push up to RCB)
+## -g Update the old gh-pages repo (set PUSH=1 to actually push up to RCB)
# Defaults
# --------
diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh
index 9bf8f73c92..75d56a8465 100755
--- a/tools/xen/install_os_domU.sh
+++ b/tools/xen/install_os_domU.sh
@@ -394,7 +394,7 @@ if [ "$WAIT_TILL_LAUNCH" = "1" ] && [ -e ~/.ssh/id_rsa.pub ] && [ "$COPYENV" =
# Watch devstack's output (which doesn't start until stack.sh is running,
# but wait for run.sh (which starts stack.sh) to exit as that is what
- # hopefully writes the succeded cookie.
+ # hopefully writes the succeeded cookie.
pid=`ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS pgrep run.sh`
ssh_no_check -q stack@$OS_VM_MANAGEMENT_ADDRESS "tail --pid $pid -n +1 -f /tmp/devstack/log/stack.log"
From d29ca35e79fab38a48399a305074fd72663f998a Mon Sep 17 00:00:00 2001
From: Adam Gandelman
Date: Mon, 6 Oct 2014 14:33:59 -0700
Subject: [PATCH 0044/3421] Stop n-cpu by correct process name /w fake
When VIRT_DRIVER=fake, n-cpu processes are numbered (ie, n-cpu-1) in
start_nova. However, this scheme is not taken into account when
stopping nova, resulting in leftover n-cpu processes that fail
grenade's stop-base if USE_SCREEN=False. This special cases for the
fake driver in stop_nova_compute and ensures n-cpu(s) is shutdown
correctly.
Change-Id: Icebece9eadc4e10bb12fe4fdd2fa37d5f3983f66
Close-bug: #1378112
---
lib/nova | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/lib/nova b/lib/nova
index 096d380e03..10bf4726ac 100644
--- a/lib/nova
+++ b/lib/nova
@@ -755,7 +755,14 @@ function start_nova {
}
function stop_nova_compute {
- stop_process n-cpu
+ if [ "$VIRT_DRIVER" == "fake" ]; then
+ local i
+ for i in `seq 1 $NUMBER_FAKE_NOVA_COMPUTE`; do
+ stop_process n-cpu-${i}
+ done
+ else
+ stop_process n-cpu
+ fi
if is_service_enabled n-cpu && [[ -r $NOVA_PLUGINS/hypervisor-$VIRT_DRIVER ]]; then
stop_nova_hypervisor
fi
From e2c9fee8ed846aba124a2fc1bba245790ed7ba90 Mon Sep 17 00:00:00 2001
From: Ian Wienand
Date: Fri, 26 Sep 2014 09:42:11 +1000
Subject: [PATCH 0045/3421] Single quote iniset argument in merge_config_file
If we don't single quote the extracted argument to iniset we drop any
quotes from the source. Add a simple test-case for this.
Partial-bug: #1374118
Change-Id: If2f47b64b11015e727a011c7e5f6e8ad378b90eb
---
lib/config | 4 +++-
tests/test_config.sh | 15 ++++++++++++++-
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/lib/config b/lib/config
index 0baa4cc3c2..a0b9b0a6f6 100644
--- a/lib/config
+++ b/lib/config
@@ -82,6 +82,8 @@ 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 { section = "" }
@@ -95,7 +97,7 @@ function merge_config_file {
}
/^[^ \t]+/ {
split($0, d, " *= *")
- print "iniset " configfile " " section " " d[1] " \"" d[2] "\""
+ print "iniset " configfile " " section " " d[1] " \x27" d[2] "\x27 "
}
' | while read a; do eval "$a"; done
diff --git a/tests/test_config.sh b/tests/test_config.sh
index 2634ce0654..7cf75d0c4f 100755
--- a/tests/test_config.sh
+++ b/tests/test_config.sh
@@ -91,6 +91,10 @@ attribute=value
[[test4|\$TEST4_DIR/\$TEST4_FILE]]
[fff]
type=new
+
+[[test-quote|test-quote.conf]]
+[foo]
+foo="foo bar" "baz"
EOF
echo -n "get_meta_section_files: test0 doesn't exist: "
@@ -206,6 +210,15 @@ 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)
+EXPECT_VAL='
+[foo]
+foo = "foo bar" "baz"'
+check_result "$VAL" "$EXPECT_VAL"
+
echo -n "merge_config_group test4 variable filename: "
setup_test4
merge_config_group test.conf test4
@@ -225,5 +238,5 @@ EXPECT_VAL="
type = new"
check_result "$VAL" "$EXPECT_VAL"
-rm -f test.conf test1c.conf test2a.conf test-space.conf
+rm -f test.conf test1c.conf test2a.conf test-quote.conf test-space.conf
rm -rf test-etc
From e321e305f3b571b1b3ae26f169b71786537d400a Mon Sep 17 00:00:00 2001
From: Steve Martinelli
Date: Mon, 6 Oct 2014 02:23:28 -0400
Subject: [PATCH 0046/3421] Correct swift service name in docs
The docs incorrectly show an example of:
enable_service swift
This does not work, it must be enabled on a per swift service
basis, like:
enable_service s-proxy s-object s-container s-account
Change-Id: Ib4ed8b43f777d308f5464d45dc87735e843c0daf
---
docs/source/guides/multinode-lab.html | 2 +-
docs/source/stackrc.html | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/source/guides/multinode-lab.html b/docs/source/guides/multinode-lab.html
index a286954e7d..4ad29b13a0 100644
--- a/docs/source/guides/multinode-lab.html
+++ b/docs/source/guides/multinode-lab.html
@@ -247,7 +247,7 @@
Swift
The support in DevStack is geared toward a minimal installation but can be used for
testing. To implement a true multi-node test of Swift required more than DevStack provides.
Enabling it is as simple as enabling the swift service in local.conf:
-
Swift will put its data files in SWIFT_DATA_DIR (default /opt/stack/data/swift).
The size of the data 'partition' created (really a loop-mounted file) is set by
diff --git a/docs/source/stackrc.html b/docs/source/stackrc.html
index 23a48c51d7..d83fbc164c 100644
--- a/docs/source/stackrc.html
+++ b/docs/source/stackrc.html
@@ -66,8 +66,8 @@
From 67bc8e8ab9cb0a80ff82ea1c4b2bc84e2e802034 Mon Sep 17 00:00:00 2001
From: Chris Dent
Date: Wed, 8 Oct 2014 12:07:46 +0100
Subject: [PATCH 0047/3421] Cleanup create_accounts functions
lib/nova and lib/ceilometer had function calls not in the desired
form.
Change-Id: I6b848e51654a48fe2df6084efdb0f67fd5e180f0
---
lib/ceilometer | 5 ++---
lib/nova | 6 ++----
2 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/lib/ceilometer b/lib/ceilometer
index 9bb31218a0..c997de77e1 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -73,13 +73,12 @@ function is_ceilometer_enabled {
}
# create_ceilometer_accounts() - Set up common required ceilometer accounts
-
+#
# Project User Roles
# ------------------------------------------------------------------
# SERVICE_TENANT_NAME ceilometer admin
# SERVICE_TENANT_NAME ceilometer ResellerAdmin (if Swift is enabled)
-
-create_ceilometer_accounts() {
+function create_ceilometer_accounts {
local service_tenant=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }")
local admin_role=$(openstack role list | awk "/ admin / { print \$2 }")
diff --git a/lib/nova b/lib/nova
index fa57432187..cd9544ba66 100644
--- a/lib/nova
+++ b/lib/nova
@@ -330,14 +330,12 @@ function configure_nova {
}
# create_nova_accounts() - Set up common required nova accounts
-
+#
# Project User Roles
# ------------------------------------------------------------------
# SERVICE_TENANT_NAME nova admin
# SERVICE_TENANT_NAME nova ResellerAdmin (if Swift is enabled)
-
-# Migrated from keystone_data.sh
-create_nova_accounts() {
+function create_nova_accounts {
local service_tenant=$(openstack project list | awk "/ $SERVICE_TENANT_NAME / { print \$2 }")
local admin_role=$(openstack role list | awk "/ admin / { print \$2 }")
From 9a706107d6603c9a13c8ec128b6f0ca397492f02 Mon Sep 17 00:00:00 2001
From: Eric Harney
Date: Wed, 8 Oct 2014 10:39:46 -0400
Subject: [PATCH 0048/3421] Set Glance default_store to rbd in [glance_store]
Glance is moving from [DEFAULT] to [glance_store] for this option.
Since lib/glance sets both, let's also set it in both places for now.
Failing to do this causes g-api to fail to start with error:
"Store for scheme swift not found"
Change-Id: I9e33ababf7c51f5c750f90b8b366b9892bb4c8cd
---
lib/ceph | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/ceph b/lib/ceph
index 30ca903a8d..2e68ce588d 100644
--- a/lib/ceph
+++ b/lib/ceph
@@ -197,8 +197,12 @@ function configure_ceph_glance {
fi
sudo ceph -c ${CEPH_CONF_FILE} auth get-or-create client.${GLANCE_CEPH_USER} mon "allow r" osd "allow class-read object_prefix rbd_children, allow rwx pool=${GLANCE_CEPH_POOL}" | sudo tee ${CEPH_CONF_DIR}/ceph.client.${GLANCE_CEPH_USER}.keyring
sudo chown ${STACK_USER}:$(id -g -n $whoami) ${CEPH_CONF_DIR}/ceph.client.${GLANCE_CEPH_USER}.keyring
+
+ # NOTE(eharney): When Glance has fully migrated to Glance store,
+ # default_store can be removed from [DEFAULT]. (See lib/glance.)
iniset $GLANCE_API_CONF DEFAULT default_store rbd
iniset $GLANCE_API_CONF DEFAULT show_image_direct_url True
+ iniset $GLANCE_API_CONF glance_store default_store rbd
iniset $GLANCE_API_CONF glance_store stores "file, http, rbd"
iniset $GLANCE_API_CONF glance_store rbd_store_ceph_conf $CEPH_CONF_FILE
iniset $GLANCE_API_CONF glance_store rbd_store_user $GLANCE_CEPH_USER
From 0f72625fba22783bf78ffdc809da7fd42d0c4310 Mon Sep 17 00:00:00 2001
From: Adam Gandelman
Date: Wed, 1 Oct 2014 17:06:19 -0700
Subject: [PATCH 0049/3421] Enable DIB service to build with minimal net access
Adds two new options to lib/dib that will help devstack slaves
use cached content and content local to cloud provides:
* DIB_BUILD_OFFLINE: This will enable DIB to rely entirely on
cached images without making any additional calls to cloud-images.ubuntu.com
to validate hashes/freshness.
* DIB_APT_SOURCES: Used to specify alternatve sources.list for image builds.
Setting this enables the addition of the apt-sources element during image
builds and is only supported for ubuntu/debian builds.
Change-Id: I9b9ca72ec551565d454610aacb86c585f0384f13
Partial-bug: #1375488
---
lib/dib | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/lib/dib b/lib/dib
index d39d8016c5..30b31ec0ee 100644
--- a/lib/dib
+++ b/lib/dib
@@ -20,13 +20,28 @@ set +o xtrace
# set up default directories
DIB_DIR=$DEST/diskimage-builder
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_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}
+
OCC_DIR=$DEST/os-collect-config
ORC_DIR=$DEST/os-refresh-config
OAC_DIR=$DEST/os-apply-config
+# Include the apt-sources element in builds if we have an
+# alternative sources.list specified.
+if [ -n "$DIB_APT_SOURCES" ]; then
+ if [ ! -e "$DIB_APT_SOURCES" ]; then
+ die $LINENO "DIB_APT_SOURCES set but not found at $DIB_APT_SOURCES"
+ fi
+ EXTRA_ELEMENTS="apt-sources"
+fi
+
# Functions
# ---------
@@ -106,9 +121,11 @@ function disk_image_create_upload {
# The disk-image-create command to run
ELEMENTS_PATH=$elements_path \
+ DIB_APT_SOURCES=$DIB_APT_SOURCES \
+ DIB_OFFLINE=$DIB_BUILD_OFFLINE \
PYPI_MIRROR_URL=$pypi_mirror_url \
PYPI_MIRROR_URL_1=$pypi_mirror_url_1 \
- disk-image-create -a amd64 $image_elements \
+ disk-image-create -a amd64 $image_elements $EXTRA_ELEMENTS \
--image-cache $DIB_IMAGE_CACHE \
-o $image_path
From 3682b6de55ee88109147516be0a2634aeeb951ab Mon Sep 17 00:00:00 2001
From: Ian Wienand
Date: Wed, 8 Oct 2014 15:37:23 +1100
Subject: [PATCH 0050/3421] Install latest EPEL release
Use a little trick cribbed from [1] to install the latest EPEL
release, rather than hard-coding versions
[1] http://stackoverflow.com/questions/14016286/how-to-programmatically-install-the-latest-epel-release-rpm-without-knowing-its
Closes-bug: #1376321
Change-Id: Ib89d73d669efe2e2d61fc0b12b46395fce113386
---
stack.sh | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/stack.sh b/stack.sh
index 0cec623a54..3b5fb7459b 100755
--- a/stack.sh
+++ b/stack.sh
@@ -234,15 +234,35 @@ fi
if [[ is_fedora && ( $DISTRO == "rhel6" || $DISTRO == "rhel7" ) ]]; then
# RHEL requires EPEL for many Open Stack dependencies
- if [[ $DISTRO == "rhel7" ]]; then
- EPEL_RPM=${RHEL7_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-1.noarch.rpm"}
- elif [[ $DISTRO == "rhel6" ]]; then
- EPEL_RPM=${RHEL6_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"}
- fi
if ! sudo yum repolist enabled epel | grep -q 'epel'; then
echo "EPEL not detected; installing"
- yum_install ${EPEL_RPM} || \
+ # This trick installs the latest epel-release from a bootstrap
+ # repo, then removes itself (as epel-release installed the
+ # "real" repo).
+ #
+ # you would think that rather than this, you could use
+ # $releasever directly in .repo file we create below. However
+ # RHEL gives a $releasever of "6Server" which breaks the path;
+ # see https://bugzilla.redhat.com/show_bug.cgi?id=1150759
+ if [[ $DISTRO == "rhel7" ]]; then
+ epel_ver="7"
+ elif [[ $DISTRO == "rhel6" ]]; then
+ epel_ver="6"
+ fi
+
+ cat <
Date: Wed, 8 Oct 2014 06:52:21 +0000
Subject: [PATCH 0051/3421] Enable Swift's newer feature of container-sync
Newer version of container-sync feature is introduced in Swift ver. 1.12.0.
The spec:
http://docs.openstack.org/developer/swift/overview_container_sync.html
Before this commit, Devstack does not configure any realm used in
container-sync, therefore this feature does not work.
To test this feature in CI system, moreover to show the sample
configuration of realms, Devstack now edits realms configuration file.
Change-Id: I9f1e3224403e08e725a989162729470357fe90b0
Closes-Bug: 1378646
---
lib/swift | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/lib/swift b/lib/swift
index 21ed920149..d8c790a201 100644
--- a/lib/swift
+++ b/lib/swift
@@ -330,7 +330,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}
From bf1b8ed4707e6ee3588c5b5237317325fe2d57c4 Mon Sep 17 00:00:00 2001
From: Steve Martinelli
Date: Mon, 6 Oct 2014 03:36:20 -0400
Subject: [PATCH 0052/3421] Move swift CLI commands to OSC commands
Only a few instances in exercises/swift.sh
Change-Id: I0a39b11f660453a378d44e4f9f28a4a57352f4a8
---
exercises/swift.sh | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/exercises/swift.sh b/exercises/swift.sh
index 25ea6719c1..afcede81cd 100755
--- a/exercises/swift.sh
+++ b/exercises/swift.sh
@@ -45,16 +45,16 @@ CONTAINER=ex-swift
# =============
# Check if we have to swift via keystone
-swift stat || die $LINENO "Failure geting status"
+swift stat || die $LINENO "Failure getting status"
# We start by creating a test container
-swift post $CONTAINER || die $LINENO "Failure creating container $CONTAINER"
+openstack container create $CONTAINER || die $LINENO "Failure creating container $CONTAINER"
# add some files into it.
-swift upload $CONTAINER /etc/issue || die $LINENO "Failure uploading file to container $CONTAINER"
+openstack object create $CONTAINER /etc/issue || die $LINENO "Failure uploading file to container $CONTAINER"
# list them
-swift list $CONTAINER || die $LINENO "Failure listing contents of container $CONTAINER"
+openstack object list $CONTAINER || die $LINENO "Failure listing contents of container $CONTAINER"
# And we may want to delete them now that we have tested that
# everything works.
From 7c6d005eedbff90811d0ded26508f716227dc5f8 Mon Sep 17 00:00:00 2001
From: JordanP
Date: Mon, 6 Oct 2014 23:08:50 +0200
Subject: [PATCH 0053/3421] Fix account rc files creation for Swift users
Id02ebdfa5cb3f6c763293876c6bb031184ebd663 introduced a small
regression which makes the command x509-create-cert fail with
'ERROR (CommandError): Invalid OpenStack Nova credentials.' for
Swift users.
The handling of specific password for Swift users was introduced
in Ifb57a43aad439ffe041e98465719a8a8eceae544
Change-Id: I3f328b1358bad0bdf7056796eabfe846dd5bae3a
---
lib/swift | 8 +++++---
tools/create_userrc.sh | 3 ++-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/lib/swift b/lib/swift
index 21ed920149..15bd2a9471 100644
--- a/lib/swift
+++ b/lib/swift
@@ -557,9 +557,11 @@ function create_swift_disk {
function create_swift_accounts {
# Defines specific passwords used by tools/create_userrc.sh
- local swiftusertest1_password=testing
- local swiftusertest2_password=testing2
- local swiftusertest3_password=testing3
+ # As these variables are used by create_userrc.sh, they must be exported
+ # The _password suffix is expected by create_userrc.sh
+ export swiftusertest1_password=testing
+ export swiftusertest2_password=testing2
+ export swiftusertest3_password=testing3
KEYSTONE_CATALOG_BACKEND=${KEYSTONE_CATALOG_BACKEND:-sql}
diff --git a/tools/create_userrc.sh b/tools/create_userrc.sh
index 6a07be49f0..b43fd883a3 100755
--- a/tools/create_userrc.sh
+++ b/tools/create_userrc.sh
@@ -254,7 +254,8 @@ if [ $MODE != "create" ]; then
# Checks for a specific password defined for an user.
# Example for an username johndoe: JOHNDOE_PASSWORD=1234
- eval SPECIFIC_UPASSWORD="\$${USER_NAME^^}_PASSWORD"
+ # This mechanism is used by lib/swift
+ eval SPECIFIC_UPASSWORD="\$${user_name}_password"
if [ -n "$SPECIFIC_UPASSWORD" ]; then
USER_PASS=$SPECIFIC_UPASSWORD
fi
From 2f92c8d723f6e244faf410c5121de4c462c08a35 Mon Sep 17 00:00:00 2001
From: Sirushti Murugesan
Date: Thu, 9 Oct 2014 14:35:38 +0530
Subject: [PATCH 0054/3421] Replace deprecated conf option for heat
Change-Id: I0419b188ecc2bd946c1c1f565875c6a04f4afd9b
Closes-Bug: #1379234
---
lib/heat | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/heat b/lib/heat
index 737598d50d..53eca25450 100644
--- a/lib/heat
+++ b/lib/heat
@@ -276,7 +276,7 @@ function create_heat_accounts {
--os-identity-api-version=3 domain create heat \
--description "Owns users and projects created by heat" \
| grep ' id ' | get_field 2)
- iniset $HEAT_CONF DEFAULT stack_user_domain ${D_ID}
+ iniset $HEAT_CONF DEFAULT stack_user_domain_id ${D_ID}
openstack --os-token $OS_TOKEN --os-url=$ks_endpoint_v3 \
--os-identity-api-version=3 user create --password $SERVICE_PASSWORD \
From fa16ae92cd7339a830851dea17ce263205b78865 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Han?=
Date: Mon, 6 Oct 2014 00:15:33 +0200
Subject: [PATCH 0055/3421] Add the ability to activate Nova ceph without
Cinder
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Prior to this patch, if we wanted to boot a VM in Ceph using
libvirt_image_type we must had Cinder enabled. This patch allows you to
use libvirt_image_type without having Cinder enabled.
Change-Id: Ia61e6effc5a4ccba69f4fa48f6e9984f15bb8979
Signed-off-by: Sébastien Han
---
extras.d/60-ceph.sh | 5 +++--
lib/ceph | 5 +++++
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/extras.d/60-ceph.sh b/extras.d/60-ceph.sh
index 5fb34ea89b..50bdfaee3b 100644
--- a/extras.d/60-ceph.sh
+++ b/extras.d/60-ceph.sh
@@ -26,8 +26,9 @@ if is_service_enabled ceph; then
if is_service_enabled cinder; then
echo_summary "Configuring Cinder for Ceph"
configure_ceph_cinder
- # NOTE (leseb): the part below is a requirement from Cinder in order to attach volumes
- # so we should run the following within the if statement.
+ fi
+ if is_service_enabled cinder || is_service_enabled nova; then
+ # NOTE (leseb): the part below is a requirement to attach Ceph block devices
echo_summary "Configuring libvirt secret"
import_libvirt_secret_ceph
fi
diff --git a/lib/ceph b/lib/ceph
index 30ca903a8d..55e110bead 100644
--- a/lib/ceph
+++ b/lib/ceph
@@ -221,6 +221,11 @@ function configure_ceph_nova {
iniset $NOVA_CONF libvirt images_type rbd
iniset $NOVA_CONF libvirt images_rbd_pool ${NOVA_CEPH_POOL}
iniset $NOVA_CONF libvirt images_rbd_ceph_conf ${CEPH_CONF_FILE}
+
+ if ! is_service_enabled cinder; then
+ sudo ceph -c ${CEPH_CONF_FILE} auth get-or-create client.${CINDER_CEPH_USER} mon "allow r" osd "allow class-read object_prefix rbd_children, allow rwx pool=${CINDER_CEPH_POOL}, allow rwx pool=${NOVA_CEPH_POOL},allow rx pool=${GLANCE_CEPH_POOL}" | sudo tee ${CEPH_CONF_DIR}/ceph.client.${CINDER_CEPH_USER}.keyring > /dev/null
+ sudo chown ${STACK_USER}:$(id -g -n $whoami) ${CEPH_CONF_DIR}/ceph.client.${CINDER_CEPH_USER}.keyring
+ fi
}
# configure_ceph_cinder() - Cinder config needs to come after Cinder is set up
From cc87c2871dc436b2134f60e9fa4663723a094ebd Mon Sep 17 00:00:00 2001
From: Fergal Mc Carthy
Date: Thu, 9 Oct 2014 16:16:42 -0400
Subject: [PATCH 0056/3421] local.conf processing doesn't handle '=' in values
When attempting to add a libvirt section with a volume_drivers entry
to $NOVA_CONF, via a post-config block in the local.conf file, I
encountered problems; the value for this attribute takes the form
driver=python.import.path.to.driver
but the value actually populated in the $NOVA_CONF was truncated at the
equals.
Taking the iscsi driver setting specified in the official nova.conf
documentation as an example, if I have the following in my local.conf
file:
[[post-config|$NOVA_CONF]]
[libvirt]
volume_drivers = iscsi=nova.virt.libvirt.volume.LibvirtISCSIVolumeDriver
I will see that the generated $NOVA_CONF has the following:
[libvirt]
volume_driver = iscsi
This occurs because the existing handling for a post-config setion, as
implemented in merge_config_file(), splits the line on the equals sign,
and then uses the first and seconds elements of the resulting array as
attribute name and value respectively.
However when an equals occurs as part of the value this results in the
value being truncated at the first equals in the value.
The fix I've implemented, based upon review feedback, extracts the
contents of $0 before the first equals as the attr name, and extracts
the remainder after the equals as the value. Then it strips the leading
and trailing whitespaces from both as appropriate.
I've also added test5 to tests/test_config.sh to test for, and verify,
correct operation when this scenario is encountered. Similarly I've
added test6 to ensure that trailing spaces in values are stripped
correctly.
Change-Id: Id0cb1e6e1cece21bc5dbf427c4d756af86fbd927
Closes-Bug: #1374482
---
lib/config | 13 +++++++++++--
tests/test_config.sh | 31 ++++++++++++++++++++++++++++++-
2 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/lib/config b/lib/config
index a0b9b0a6f6..b44e79aa3d 100644
--- a/lib/config
+++ b/lib/config
@@ -96,8 +96,17 @@ function merge_config_file {
next
}
/^[^ \t]+/ {
- split($0, d, " *= *")
- print "iniset " configfile " " section " " d[1] " \x27" d[2] "\x27 "
+ # get offset of first '=' in $0
+ eq_idx = index($0, "=")
+ # extract attr & value from $0
+ attr = substr($0, 1, eq_idx - 1)
+ value = substr($0, eq_idx + 1)
+ # only need to strip trailing whitespace from attr
+ sub(/[ \t]*$/, "", attr)
+ # need to strip leading & trailing whitespace from value
+ sub(/^[ \t]*/, "", value)
+ sub(/[ \t]*$/, "", value)
+ print "iniset " configfile " " section " " attr " \x27" value "\x27"
}
' | while read a; do eval "$a"; done
diff --git a/tests/test_config.sh b/tests/test_config.sh
index 7cf75d0c4f..6fff29c396 100755
--- a/tests/test_config.sh
+++ b/tests/test_config.sh
@@ -95,6 +95,15 @@ type=new
[[test-quote|test-quote.conf]]
[foo]
foo="foo bar" "baz"
+
+[[test5|test-equals.conf]]
+[DEFAULT]
+drivers = driver=python.import.path.Driver
+
+[[test6|test-strip.conf]]
+[DEFAULT]
+# next line has trailing space
+attr = strip_trailing_space
EOF
echo -n "get_meta_section_files: test0 doesn't exist: "
@@ -238,5 +247,25 @@ EXPECT_VAL="
type = new"
check_result "$VAL" "$EXPECT_VAL"
-rm -f test.conf test1c.conf test2a.conf test-quote.conf test-space.conf
+echo -n "merge_config_file test5 equals in value: "
+rm -f test-equals.conf
+merge_config_file test.conf test5 test-equals.conf
+VAL=$(cat test-equals.conf)
+# iniset adds a blank line if it creates the file...
+EXPECT_VAL="
+[DEFAULT]
+drivers = driver=python.import.path.Driver"
+check_result "$VAL" "$EXPECT_VAL"
+
+echo -n "merge_config_file test6 value stripped: "
+rm -f test-strip.conf
+merge_config_file test.conf test6 test-strip.conf
+VAL=$(cat test-strip.conf)
+# iniset adds a blank line if it creates the file...
+EXPECT_VAL="
+[DEFAULT]
+attr = strip_trailing_space"
+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
rm -rf test-etc
From 6ff21acf4c4d4ef08bbef419ba582cade4da8da7 Mon Sep 17 00:00:00 2001
From: Robert Li
Date: Fri, 10 Oct 2014 12:43:05 -0400
Subject: [PATCH 0057/3421] Allow multi-line config items in meta-section of
local.conf
It would behave such as the contents from each meta-section in
local.conf is copied to the destination files. One exception is the multiline
options not grouped together. In that case, the contents will be grouped
together in its destination config file.
Check tests/test_config.sh for examples.
Change-Id: I8c046b558eeb98ed221f6f1a59182d4179956ced
Partial-Bug: #1374118
---
functions-common | 27 ++++++++++++++++++++
lib/config | 48 +++++++++++++++++++++++++++++++---
tests/test_config.sh | 61 +++++++++++++++++++++++++++++++++++++++++---
3 files changed, 129 insertions(+), 7 deletions(-)
diff --git a/functions-common b/functions-common
index 5b29fd3bf4..1f90da76b0 100644
--- a/functions-common
+++ b/functions-common
@@ -119,6 +119,33 @@ function ini_has_option {
[ -n "$line" ]
}
+# Add another config line for a multi-line option.
+# It's normally called after iniset of the same option and assumes
+# that the section already exists.
+#
+# Note that iniset_multiline requires all the 'lines' to be supplied
+# in the argument list. Doing that will cause incorrect configuration
+# if spaces are used in the config values.
+#
+# iniadd_literal config-file section option value
+function iniadd_literal {
+ local xtrace=$(set +o | grep xtrace)
+ set +o xtrace
+ local file=$1
+ local section=$2
+ local option=$3
+ local value=$4
+
+ [[ -z $section || -z $option ]] && return
+
+ # Add it
+ sed -i -e "/^\[$section\]/ a\\
+$option = $value
+" "$file"
+
+ $xtrace
+}
+
# Set an option in an INI file
# iniset config-file section option value
function iniset {
diff --git a/lib/config b/lib/config
index b44e79aa3d..6e8219cbeb 100644
--- a/lib/config
+++ b/lib/config
@@ -86,7 +86,11 @@ function merge_config_file {
# having to do nasty quoting games
get_meta_section $file $matchgroup $configfile | \
$CONFIG_AWK_CMD -v configfile=$configfile '
- BEGIN { section = "" }
+ BEGIN {
+ section = ""
+ last_section = ""
+ section_count = 0
+ }
/^\[.+\]/ {
gsub("[][]", "", $1);
section=$1
@@ -106,10 +110,48 @@ function merge_config_file {
# need to strip leading & trailing whitespace from value
sub(/^[ \t]*/, "", value)
sub(/[ \t]*$/, "", value)
- print "iniset " configfile " " section " " attr " \x27" value "\x27"
+
+ # cfg_attr_count: number of config lines per [section, attr]
+ # cfg_attr: two dimensional array to keep all the config lines per [section, attr]
+ # cfg_section: keep the section names in the same order as they appear in local.conf
+ # cfg_sec_attr_name: keep the attr names in the same order as they appear in local.conf
+ if (! (section, attr) in cfg_attr_count) {
+ if (section != last_section) {
+ cfg_section[section_count++] = section
+ last_section = section
+ }
+ attr_count = cfg_sec_attr_count[section_count - 1]++
+ cfg_sec_attr_name[section_count - 1][attr_count] = attr
+
+ cfg_attr[section, attr][0] = value
+ cfg_attr_count[section, attr] = 1
+ } else {
+ lno = cfg_attr_count[section, attr]++
+ cfg_attr[section, attr][lno] = value
+ }
+ }
+ END {
+ # Process each section in order
+ for (sno = 0; sno < section_count; sno++) {
+ section = cfg_section[sno]
+ # The ini routines simply append a config item immediately
+ # after the section header. To keep the same order as defined
+ # in local.conf, invoke the ini routines in the reverse order
+ 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"
+ 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"
+ for (l = count -2; l >= 0; l--)
+ print "iniadd_literal " configfile " " section " " attr " \x27" cfg_attr[section, attr][l] "\x27"
+ }
+ }
+ }
}
' | while read a; do eval "$a"; done
-
}
diff --git a/tests/test_config.sh b/tests/test_config.sh
index 6fff29c396..696e57f909 100755
--- a/tests/test_config.sh
+++ b/tests/test_config.sh
@@ -104,6 +104,27 @@ drivers = driver=python.import.path.Driver
[DEFAULT]
# next line has trailing space
attr = strip_trailing_space
+
+[[test-multi-sections|test-multi-sections.conf]]
+[sec-1]
+cfg_item1 = abcd
+cfg_item2 = efgh
+
+[sec-2]
+cfg_item1 = abcd
+cfg_item3 = /1/2/3/4:5
+cfg_item4 = end
+
+[sec-3]
+cfg_item5 = 5555
+cfg_item6 = 6666
+cfg_item5 = 5555another
+
+[[test-multiline|test-multiline.conf]]
+[multi]
+cfg_item1 = "ab":"cd", "ef": "gh"
+cfg_item1 = abcd
+cfg_item2 = efgh
EOF
echo -n "get_meta_section_files: test0 doesn't exist: "
@@ -185,8 +206,39 @@ VAL=$(cat test2a.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[ddd]
-additional = true
-type = new"
+type = new
+additional = true"
+check_result "$VAL" "$EXPECT_VAL"
+
+echo -n "merge_config_file test-multi-sections: "
+rm -f test-multi-sections.conf
+merge_config_file test.conf test-multi-sections test-multi-sections.conf
+VAL=$(cat test-multi-sections.conf)
+EXPECT_VAL='
+[sec-1]
+cfg_item1 = abcd
+cfg_item2 = efgh
+
+[sec-2]
+cfg_item1 = abcd
+cfg_item3 = /1/2/3/4:5
+cfg_item4 = end
+
+[sec-3]
+cfg_item5 = 5555
+cfg_item5 = 5555another
+cfg_item6 = 6666'
+check_result "$VAL" "$EXPECT_VAL"
+
+echo -n "merge_config_file test-multiline: "
+rm -f test-multiline.conf
+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 = abcd
+cfg_item2 = efgh'
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_group test2: "
@@ -196,8 +248,8 @@ VAL=$(cat test2a.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[ddd]
-additional = true
-type = new"
+type = new
+additional = true"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_group test2 no conf file: "
@@ -268,4 +320,5 @@ attr = strip_trailing_space"
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
+rm -f test-multiline.conf test-multi-sections.conf
rm -rf test-etc
From a7eb07a3e22eb0362b28cec4bd289201a9adf699 Mon Sep 17 00:00:00 2001
From: Kevin Benton
Date: Tue, 14 Oct 2014 04:35:59 -0700
Subject: [PATCH 0058/3421] Revert "Allow multi-line config items in
meta-section of local.conf"
This reverts commit 6ff21acf4c4d4ef08bbef419ba582cade4da8da7.
This commit has broken config options with colons in them.
The following is a sample configuration that no longer works:
[[post-config|/etc/neutron/plugins/ml2/ml2_conf.ini]]
[restproxy]
server_ssl=False
servers=10.211.1.9:80
server_ssl=False
With the above config and the code present that this reverts,
the 'servers' option will come out blank.
Change-Id: I328852d2d941605051a1bf5eaf0f7674191f8c48
---
functions-common | 27 --------------------
lib/config | 48 +++-------------------------------
tests/test_config.sh | 61 +++-----------------------------------------
3 files changed, 7 insertions(+), 129 deletions(-)
diff --git a/functions-common b/functions-common
index 1f90da76b0..5b29fd3bf4 100644
--- a/functions-common
+++ b/functions-common
@@ -119,33 +119,6 @@ function ini_has_option {
[ -n "$line" ]
}
-# Add another config line for a multi-line option.
-# It's normally called after iniset of the same option and assumes
-# that the section already exists.
-#
-# Note that iniset_multiline requires all the 'lines' to be supplied
-# in the argument list. Doing that will cause incorrect configuration
-# if spaces are used in the config values.
-#
-# iniadd_literal config-file section option value
-function iniadd_literal {
- local xtrace=$(set +o | grep xtrace)
- set +o xtrace
- local file=$1
- local section=$2
- local option=$3
- local value=$4
-
- [[ -z $section || -z $option ]] && return
-
- # Add it
- sed -i -e "/^\[$section\]/ a\\
-$option = $value
-" "$file"
-
- $xtrace
-}
-
# Set an option in an INI file
# iniset config-file section option value
function iniset {
diff --git a/lib/config b/lib/config
index 6e8219cbeb..b44e79aa3d 100644
--- a/lib/config
+++ b/lib/config
@@ -86,11 +86,7 @@ function merge_config_file {
# having to do nasty quoting games
get_meta_section $file $matchgroup $configfile | \
$CONFIG_AWK_CMD -v configfile=$configfile '
- BEGIN {
- section = ""
- last_section = ""
- section_count = 0
- }
+ BEGIN { section = "" }
/^\[.+\]/ {
gsub("[][]", "", $1);
section=$1
@@ -110,48 +106,10 @@ function merge_config_file {
# need to strip leading & trailing whitespace from value
sub(/^[ \t]*/, "", value)
sub(/[ \t]*$/, "", value)
-
- # cfg_attr_count: number of config lines per [section, attr]
- # cfg_attr: two dimensional array to keep all the config lines per [section, attr]
- # cfg_section: keep the section names in the same order as they appear in local.conf
- # cfg_sec_attr_name: keep the attr names in the same order as they appear in local.conf
- if (! (section, attr) in cfg_attr_count) {
- if (section != last_section) {
- cfg_section[section_count++] = section
- last_section = section
- }
- attr_count = cfg_sec_attr_count[section_count - 1]++
- cfg_sec_attr_name[section_count - 1][attr_count] = attr
-
- cfg_attr[section, attr][0] = value
- cfg_attr_count[section, attr] = 1
- } else {
- lno = cfg_attr_count[section, attr]++
- cfg_attr[section, attr][lno] = value
- }
- }
- END {
- # Process each section in order
- for (sno = 0; sno < section_count; sno++) {
- section = cfg_section[sno]
- # The ini routines simply append a config item immediately
- # after the section header. To keep the same order as defined
- # in local.conf, invoke the ini routines in the reverse order
- 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"
- 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"
- for (l = count -2; l >= 0; l--)
- print "iniadd_literal " configfile " " section " " attr " \x27" cfg_attr[section, attr][l] "\x27"
- }
- }
- }
+ print "iniset " configfile " " section " " attr " \x27" value "\x27"
}
' | while read a; do eval "$a"; done
+
}
diff --git a/tests/test_config.sh b/tests/test_config.sh
index 696e57f909..6fff29c396 100755
--- a/tests/test_config.sh
+++ b/tests/test_config.sh
@@ -104,27 +104,6 @@ drivers = driver=python.import.path.Driver
[DEFAULT]
# next line has trailing space
attr = strip_trailing_space
-
-[[test-multi-sections|test-multi-sections.conf]]
-[sec-1]
-cfg_item1 = abcd
-cfg_item2 = efgh
-
-[sec-2]
-cfg_item1 = abcd
-cfg_item3 = /1/2/3/4:5
-cfg_item4 = end
-
-[sec-3]
-cfg_item5 = 5555
-cfg_item6 = 6666
-cfg_item5 = 5555another
-
-[[test-multiline|test-multiline.conf]]
-[multi]
-cfg_item1 = "ab":"cd", "ef": "gh"
-cfg_item1 = abcd
-cfg_item2 = efgh
EOF
echo -n "get_meta_section_files: test0 doesn't exist: "
@@ -206,39 +185,8 @@ VAL=$(cat test2a.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[ddd]
-type = new
-additional = true"
-check_result "$VAL" "$EXPECT_VAL"
-
-echo -n "merge_config_file test-multi-sections: "
-rm -f test-multi-sections.conf
-merge_config_file test.conf test-multi-sections test-multi-sections.conf
-VAL=$(cat test-multi-sections.conf)
-EXPECT_VAL='
-[sec-1]
-cfg_item1 = abcd
-cfg_item2 = efgh
-
-[sec-2]
-cfg_item1 = abcd
-cfg_item3 = /1/2/3/4:5
-cfg_item4 = end
-
-[sec-3]
-cfg_item5 = 5555
-cfg_item5 = 5555another
-cfg_item6 = 6666'
-check_result "$VAL" "$EXPECT_VAL"
-
-echo -n "merge_config_file test-multiline: "
-rm -f test-multiline.conf
-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 = abcd
-cfg_item2 = efgh'
+additional = true
+type = new"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_group test2: "
@@ -248,8 +196,8 @@ VAL=$(cat test2a.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[ddd]
-type = new
-additional = true"
+additional = true
+type = new"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_group test2 no conf file: "
@@ -320,5 +268,4 @@ attr = strip_trailing_space"
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
-rm -f test-multiline.conf test-multi-sections.conf
rm -rf test-etc
From e0d6a46b8afaeacc070a84f58ecf8e03ffe8275c Mon Sep 17 00:00:00 2001
From: Kevin Benton
Date: Tue, 14 Oct 2014 04:54:42 -0700
Subject: [PATCH 0059/3421] Add test case for colon in value
Adds a test case for a colon in a value
Change-Id: Ica56b8af5fa59a008cfe96424b1d3e17fd6cf7d6
---
tests/test_config.sh | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/tests/test_config.sh b/tests/test_config.sh
index 6fff29c396..50e8d7b2e6 100755
--- a/tests/test_config.sh
+++ b/tests/test_config.sh
@@ -103,7 +103,11 @@ drivers = driver=python.import.path.Driver
[[test6|test-strip.conf]]
[DEFAULT]
# next line has trailing space
-attr = strip_trailing_space
+attr = strip_trailing_space
+
+[[test7|test-colon.conf]]
+[DEFAULT]
+servers=10.11.12.13:80
EOF
echo -n "get_meta_section_files: test0 doesn't exist: "
@@ -267,5 +271,14 @@ EXPECT_VAL="
attr = strip_trailing_space"
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
+echo -n "merge_config_file test7 colon in value: "
+rm -f test-colon.conf
+merge_config_file test.conf test7 test-colon.conf
+VAL=$(cat test-colon.conf)
+EXPECT_VAL="
+[DEFAULT]
+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 -rf test-etc
From ebb983d3f218e276bbcda5875d513b8d4dae9d3c Mon Sep 17 00:00:00 2001
From: Monty Taylor
Date: Tue, 7 Oct 2014 13:13:28 -0700
Subject: [PATCH 0060/3421] Make the tox docs env build the docs
The tools/build_docs script builds the docs for devstack. Use it.
Change-Id: I530ff6c8090f2c58160cb11bee35534b79db52ed
---
tox.ini | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/tox.ini b/tox.ini
index 325adae288..3677631c5e 100644
--- a/tox.ini
+++ b/tox.ini
@@ -13,4 +13,11 @@ whitelist_externals = bash
commands = bash -c "find {toxinidir} -not -wholename \*.tox/\* -and \( -name \*.sh -or -name \*rc -or -name functions\* -or \( -wholename lib/\* -and -not -name \*.md \) \) -print0 | xargs -0 bashate -v"
[testenv:docs]
-commands = python setup.py build_sphinx
+deps =
+ Pygments
+ docutils
+whitelist_externals = bash
+setenv =
+ TOP_DIR={toxinidir}
+ INSTALL_SHOCCO=true
+commands = bash tools/build_docs.sh
From 0cbddea50d9651342647884bf9b8733354238884 Mon Sep 17 00:00:00 2001
From: Monty Taylor
Date: Tue, 7 Oct 2014 13:25:01 -0700
Subject: [PATCH 0061/3421] Move the doc paths to match other repos
In order to build in the Infra system, we'd like to be able to reuse the
existing doc build macros. To support that, move docs/source to
doc/source and docs/html to doc/build/html.
Change-Id: Ibd8e8e82e54c69b182120df67e6ec6908fed2908
---
.gitignore | 4 ++--
{docs => doc}/source/assets/css/bootstrap.css | 0
{docs => doc}/source/assets/css/local.css | 0
{docs => doc}/source/assets/images/devstack.png | Bin
{docs => doc}/source/assets/images/header_bg.png | Bin
{docs => doc}/source/assets/images/logo.png | Bin
{docs => doc}/source/assets/images/quickstart.png | Bin
{docs => doc}/source/assets/images/small_logo.png | Bin
{docs => doc}/source/assets/js/bootstrap.js | 0
{docs => doc}/source/assets/js/bootstrap.min.js | 0
{docs => doc}/source/assets/js/jquery-1.7.1.min.js | 0
{docs => doc}/source/changes.html | 0
{docs => doc}/source/configuration.html | 0
{docs => doc}/source/contributing.html | 0
{docs => doc}/source/eucarc.html | 0
{docs => doc}/source/exerciserc.html | 0
{docs => doc}/source/faq.html | 0
{docs => doc}/source/guides/multinode-lab.html | 0
{docs => doc}/source/guides/pxe-boot.html | 0
{docs => doc}/source/guides/ramdisk.html | 0
{docs => doc}/source/guides/single-machine.html | 0
{docs => doc}/source/guides/single-vm.html | 0
{docs => doc}/source/guides/usb-boot.html | 0
{docs => doc}/source/index.html | 0
{docs => doc}/source/local.conf.html | 0
{docs => doc}/source/localrc.html | 0
{docs => doc}/source/openrc.html | 0
{docs => doc}/source/overview.html | 0
{docs => doc}/source/plugins.html | 0
{docs => doc}/source/stackrc.html | 0
tools/build_docs.sh | 8 ++++----
31 files changed, 6 insertions(+), 6 deletions(-)
rename {docs => doc}/source/assets/css/bootstrap.css (100%)
rename {docs => doc}/source/assets/css/local.css (100%)
rename {docs => doc}/source/assets/images/devstack.png (100%)
rename {docs => doc}/source/assets/images/header_bg.png (100%)
rename {docs => doc}/source/assets/images/logo.png (100%)
rename {docs => doc}/source/assets/images/quickstart.png (100%)
rename {docs => doc}/source/assets/images/small_logo.png (100%)
rename {docs => doc}/source/assets/js/bootstrap.js (100%)
rename {docs => doc}/source/assets/js/bootstrap.min.js (100%)
rename {docs => doc}/source/assets/js/jquery-1.7.1.min.js (100%)
rename {docs => doc}/source/changes.html (100%)
rename {docs => doc}/source/configuration.html (100%)
rename {docs => doc}/source/contributing.html (100%)
rename {docs => doc}/source/eucarc.html (100%)
rename {docs => doc}/source/exerciserc.html (100%)
rename {docs => doc}/source/faq.html (100%)
rename {docs => doc}/source/guides/multinode-lab.html (100%)
rename {docs => doc}/source/guides/pxe-boot.html (100%)
rename {docs => doc}/source/guides/ramdisk.html (100%)
rename {docs => doc}/source/guides/single-machine.html (100%)
rename {docs => doc}/source/guides/single-vm.html (100%)
rename {docs => doc}/source/guides/usb-boot.html (100%)
rename {docs => doc}/source/index.html (100%)
rename {docs => doc}/source/local.conf.html (100%)
rename {docs => doc}/source/localrc.html (100%)
rename {docs => doc}/source/openrc.html (100%)
rename {docs => doc}/source/overview.html (100%)
rename {docs => doc}/source/plugins.html (100%)
rename {docs => doc}/source/stackrc.html (100%)
diff --git a/.gitignore b/.gitignore
index b0a65f59cd..67ab722190 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,8 +8,8 @@
.tox
.stackenv
accrc
-docs/files
-docs/html
+doc/files
+doc/build
files/*.gz
files/*.qcow2
files/images
diff --git a/docs/source/assets/css/bootstrap.css b/doc/source/assets/css/bootstrap.css
similarity index 100%
rename from docs/source/assets/css/bootstrap.css
rename to doc/source/assets/css/bootstrap.css
diff --git a/docs/source/assets/css/local.css b/doc/source/assets/css/local.css
similarity index 100%
rename from docs/source/assets/css/local.css
rename to doc/source/assets/css/local.css
diff --git a/docs/source/assets/images/devstack.png b/doc/source/assets/images/devstack.png
similarity index 100%
rename from docs/source/assets/images/devstack.png
rename to doc/source/assets/images/devstack.png
diff --git a/docs/source/assets/images/header_bg.png b/doc/source/assets/images/header_bg.png
similarity index 100%
rename from docs/source/assets/images/header_bg.png
rename to doc/source/assets/images/header_bg.png
diff --git a/docs/source/assets/images/logo.png b/doc/source/assets/images/logo.png
similarity index 100%
rename from docs/source/assets/images/logo.png
rename to doc/source/assets/images/logo.png
diff --git a/docs/source/assets/images/quickstart.png b/doc/source/assets/images/quickstart.png
similarity index 100%
rename from docs/source/assets/images/quickstart.png
rename to doc/source/assets/images/quickstart.png
diff --git a/docs/source/assets/images/small_logo.png b/doc/source/assets/images/small_logo.png
similarity index 100%
rename from docs/source/assets/images/small_logo.png
rename to doc/source/assets/images/small_logo.png
diff --git a/docs/source/assets/js/bootstrap.js b/doc/source/assets/js/bootstrap.js
similarity index 100%
rename from docs/source/assets/js/bootstrap.js
rename to doc/source/assets/js/bootstrap.js
diff --git a/docs/source/assets/js/bootstrap.min.js b/doc/source/assets/js/bootstrap.min.js
similarity index 100%
rename from docs/source/assets/js/bootstrap.min.js
rename to doc/source/assets/js/bootstrap.min.js
diff --git a/docs/source/assets/js/jquery-1.7.1.min.js b/doc/source/assets/js/jquery-1.7.1.min.js
similarity index 100%
rename from docs/source/assets/js/jquery-1.7.1.min.js
rename to doc/source/assets/js/jquery-1.7.1.min.js
diff --git a/docs/source/changes.html b/doc/source/changes.html
similarity index 100%
rename from docs/source/changes.html
rename to doc/source/changes.html
diff --git a/docs/source/configuration.html b/doc/source/configuration.html
similarity index 100%
rename from docs/source/configuration.html
rename to doc/source/configuration.html
diff --git a/docs/source/contributing.html b/doc/source/contributing.html
similarity index 100%
rename from docs/source/contributing.html
rename to doc/source/contributing.html
diff --git a/docs/source/eucarc.html b/doc/source/eucarc.html
similarity index 100%
rename from docs/source/eucarc.html
rename to doc/source/eucarc.html
diff --git a/docs/source/exerciserc.html b/doc/source/exerciserc.html
similarity index 100%
rename from docs/source/exerciserc.html
rename to doc/source/exerciserc.html
diff --git a/docs/source/faq.html b/doc/source/faq.html
similarity index 100%
rename from docs/source/faq.html
rename to doc/source/faq.html
diff --git a/docs/source/guides/multinode-lab.html b/doc/source/guides/multinode-lab.html
similarity index 100%
rename from docs/source/guides/multinode-lab.html
rename to doc/source/guides/multinode-lab.html
diff --git a/docs/source/guides/pxe-boot.html b/doc/source/guides/pxe-boot.html
similarity index 100%
rename from docs/source/guides/pxe-boot.html
rename to doc/source/guides/pxe-boot.html
diff --git a/docs/source/guides/ramdisk.html b/doc/source/guides/ramdisk.html
similarity index 100%
rename from docs/source/guides/ramdisk.html
rename to doc/source/guides/ramdisk.html
diff --git a/docs/source/guides/single-machine.html b/doc/source/guides/single-machine.html
similarity index 100%
rename from docs/source/guides/single-machine.html
rename to doc/source/guides/single-machine.html
diff --git a/docs/source/guides/single-vm.html b/doc/source/guides/single-vm.html
similarity index 100%
rename from docs/source/guides/single-vm.html
rename to doc/source/guides/single-vm.html
diff --git a/docs/source/guides/usb-boot.html b/doc/source/guides/usb-boot.html
similarity index 100%
rename from docs/source/guides/usb-boot.html
rename to doc/source/guides/usb-boot.html
diff --git a/docs/source/index.html b/doc/source/index.html
similarity index 100%
rename from docs/source/index.html
rename to doc/source/index.html
diff --git a/docs/source/local.conf.html b/doc/source/local.conf.html
similarity index 100%
rename from docs/source/local.conf.html
rename to doc/source/local.conf.html
diff --git a/docs/source/localrc.html b/doc/source/localrc.html
similarity index 100%
rename from docs/source/localrc.html
rename to doc/source/localrc.html
diff --git a/docs/source/openrc.html b/doc/source/openrc.html
similarity index 100%
rename from docs/source/openrc.html
rename to doc/source/openrc.html
diff --git a/docs/source/overview.html b/doc/source/overview.html
similarity index 100%
rename from docs/source/overview.html
rename to doc/source/overview.html
diff --git a/docs/source/plugins.html b/doc/source/plugins.html
similarity index 100%
rename from docs/source/plugins.html
rename to doc/source/plugins.html
diff --git a/docs/source/stackrc.html b/doc/source/stackrc.html
similarity index 100%
rename from docs/source/stackrc.html
rename to doc/source/stackrc.html
diff --git a/tools/build_docs.sh b/tools/build_docs.sh
index 96bd8924d6..f52b179b7e 100755
--- a/tools/build_docs.sh
+++ b/tools/build_docs.sh
@@ -4,7 +4,7 @@
#
# - Install shocco if not found on PATH and INSTALL_SHOCCO is set
# - Clone MASTER_REPO branch MASTER_BRANCH
-# - Re-creates ``docs/html`` directory from existing repo + new generated script docs
+# - Re-creates ``doc/build/html`` directory from existing repo + new generated script docs
# Usage:
## build_docs.sh [-o ] [-g] [master| []]
@@ -29,8 +29,8 @@ MASTER_BRANCH=${MASTER_BRANCH:-master}
# http://devstack.org is a GitHub gh-pages site in the https://github.com/cloudbuilders/devtack.git repo
GH_PAGES_REPO=git@github.com:cloudbuilders/devstack.git
-DOCS_SOURCE=docs/source
-HTML_BUILD=docs/html
+DOCS_SOURCE=doc/source
+HTML_BUILD=doc/build/html
# Keep track of the devstack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
@@ -136,7 +136,7 @@ for f in $(find functions functions-common lib samples -type f -name \*); do
mkdir -p $FQ_HTML_BUILD/`dirname $f`;
$SHOCCO $f > $FQ_HTML_BUILD/$f.html
done
-echo "$FILES" >docs/files
+echo "$FILES" >doc/files
if [[ -n $GH_UPDATE ]]; then
GH_ROOT=$(mktemp -d work-gh-XXXX)
From efdaafc0f973acdb3fc878434acb3b982e35ccaf Mon Sep 17 00:00:00 2001
From: Chris Dent
Date: Tue, 14 Oct 2014 21:08:32 +0100
Subject: [PATCH 0062/3421] Use $() instead of ``
There are other instances of this in other files, just tidying
ceilometer at the moment.
Change-Id: I136a20d7ac50fdf02cbd1102613e324e313b7b0a
---
lib/ceilometer | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/ceilometer b/lib/ceilometer
index 9bb31218a0..26c698cf5c 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -178,7 +178,7 @@ function configure_ceilometer {
configure_auth_token_middleware $CEILOMETER_CONF ceilometer $CEILOMETER_AUTH_CACHE_DIR
if [ "$CEILOMETER_BACKEND" = 'mysql' ] || [ "$CEILOMETER_BACKEND" = 'postgresql' ] ; then
- iniset $CEILOMETER_CONF database connection `database_connection_url ceilometer`
+ iniset $CEILOMETER_CONF database connection $(database_connection_url ceilometer)
iniset $CEILOMETER_CONF DEFAULT collector_workers $API_WORKERS
else
iniset $CEILOMETER_CONF database connection mongodb://localhost:27017/ceilometer
From 8f38572588af308d433a3bd7fbd93163348d98d3 Mon Sep 17 00:00:00 2001
From: Adam Gandelman
Date: Tue, 14 Oct 2014 15:50:18 -0700
Subject: [PATCH 0063/3421] support proposed/* branches
Provide support for named proposed branches for selection logic
This syncs the get_release_name_from_branch() function from grenade.
Change-Id: I1adabf07cdc3ea6863cd30d8b6454fb40fc20288
---
functions-common | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/functions-common b/functions-common
index 1f90da76b0..333f31da02 100644
--- a/functions-common
+++ b/functions-common
@@ -549,8 +549,7 @@ function is_ubuntu {
# ``get_release_name_from_branch branch-name``
function get_release_name_from_branch {
local branch=$1
-
- if [[ $branch =~ "stable/" ]]; then
+ if [[ $branch =~ "stable/" || $branch =~ "proposed/" ]]; then
echo ${branch#*/}
else
echo "master"
From 014564873e98f521338f8bf3ac97e1a7e96ecc9c Mon Sep 17 00:00:00 2001
From: Eric Harney
Date: Tue, 14 Oct 2014 18:53:53 -0400
Subject: [PATCH 0064/3421] Set Tempest storage protocol and vendor w/o setting
driver
Set TEMPEST_STORAGE_PROTOCOL and TEMPEST_VOLUME_VENDOR if
they are changed from their defaults, or if
TEMPEST_VOLUME_DRIVER is changed.
This maintains the current behavior of setting these options if
TEMPEST_VOLUME_DRIVER is set to something other than "default".
Change-Id: I1fb7f5db0446f97de48b97a6f451882cc51c51a4
---
lib/tempest | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/lib/tempest b/lib/tempest
index d677c7e33c..3c37918018 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -64,8 +64,10 @@ BOTO_MATERIALS_PATH="$FILES/images/s3-materials/cirros-${CIRROS_VERSION}"
# Cinder/Volume variables
TEMPEST_VOLUME_DRIVER=${TEMPEST_VOLUME_DRIVER:-default}
-TEMPEST_VOLUME_VENDOR=${TEMPEST_VOLUME_VENDOR:-"Open Source"}
-TEMPEST_STORAGE_PROTOCOL=${TEMPEST_STORAGE_PROTOCOL:-iSCSI}
+TEMPEST_DEFAULT_VOLUME_VENDOR="Open Source"
+TEMPEST_VOLUME_VENDOR=${TEMPEST_VOLUME_VENDOR:-$TEMPEST_DEFAULT_VOLUME_VENDOR}
+TEMPEST_DEFAULT_STORAGE_PROTOCOL="iSCSI"
+TEMPEST_STORAGE_PROTOCOL=${TEMPEST_STORAGE_PROTOCOL:-$TEMPEST_DEFAULT_STORAGE_PROTOCOL}
# Neutron/Network variables
IPV6_ENABLED=$(trueorfalse True $IPV6_ENABLED)
@@ -369,8 +371,12 @@ function configure_tempest {
iniset $TEMPEST_CONFIG volume backend2_name "LVM_iSCSI_2"
fi
- if [ $TEMPEST_VOLUME_DRIVER != "default" ]; then
+ if [ $TEMPEST_VOLUME_DRIVER != "default" -o \
+ $TEMPEST_VOLUME_VENDOR != $TEMPEST_DEFAULT_VOLUME_VENDOR ]; then
iniset $TEMPEST_CONFIG volume vendor_name "$TEMPEST_VOLUME_VENDOR"
+ fi
+ if [ $TEMPEST_VOLUME_DRIVER != "default" -o \
+ $TEMPEST_STORAGE_PROTOCOL != $TEMPEST_DEFAULT_STORAGE_PROTOCOL ]; then
iniset $TEMPEST_CONFIG volume storage_protocol $TEMPEST_STORAGE_PROTOCOL
fi
From 2a324dd2ec51be4485eafe10a31c75bcc238144d Mon Sep 17 00:00:00 2001
From: Mate Lakat
Date: Wed, 15 Oct 2014 17:40:41 +0200
Subject: [PATCH 0065/3421] XenAPI: Add exit point after JEOS installation
If the user only want to run the installation of Ubuntu - to export the
template as an xva, it just needs to specify a non-empty value for:
EXIT_AFTER_JEOS_INSTALLATION
And the script will exit after the jeos template has been created.
Change-Id: I558e2f2b18ee23c15c7e46e2f7e74543cf26b750
---
tools/xen/install_os_domU.sh | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh
index 75d56a8465..439db68120 100755
--- a/tools/xen/install_os_domU.sh
+++ b/tools/xen/install_os_domU.sh
@@ -244,6 +244,11 @@ else
vm_uuid=$(xe vm-install template="$TNAME" new-name-label="$GUEST_NAME")
fi
+if [ -n "${EXIT_AFTER_JEOS_INSTALLATION:-}" ]; then
+ echo "User requested to quit after JEOS instalation"
+ exit 0
+fi
+
#
# Prepare VM for DevStack
#
From a1707c7ef0a580bb8f5323ea3d060d0e82d831d7 Mon Sep 17 00:00:00 2001
From: Mate Lakat
Date: Wed, 15 Oct 2014 16:56:23 +0200
Subject: [PATCH 0066/3421] XenAPI: Fix vimrc
DevStack installs a default minimal .vimrc file for the stack user.
Unfortunately the `syntax on` config line is not recognised by the vim
installed in DomU. It results in an annoying message being displayed
whenever the user is using vi. To avoid this issue, removing the `syntax
on` line.
Change-Id: I224465cc3cdba3464ea0a9a751f250ecb6ddc9f3
---
tools/xen/prepare_guest.sh | 1 -
1 file changed, 1 deletion(-)
diff --git a/tools/xen/prepare_guest.sh b/tools/xen/prepare_guest.sh
index cd189db803..7383c91e37 100755
--- a/tools/xen/prepare_guest.sh
+++ b/tools/xen/prepare_guest.sh
@@ -114,7 +114,6 @@ function setup_vimrc {
if [ ! -e $1 ]; then
# Simple but usable vimrc
cat > $1 <
Date: Wed, 15 Oct 2014 16:42:40 +0200
Subject: [PATCH 0067/3421] XenAPI: Always update apt sources
If an appliance is used as a base OS, the user might want to use that in
a different region. With this change we always update the used mirrors
in the template.
Change-Id: I7a119664efac1124e54064311c243c63c2a7944b
---
tools/xen/prepare_guest_template.sh | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/tools/xen/prepare_guest_template.sh b/tools/xen/prepare_guest_template.sh
index e6a7e025b0..2d3b89821f 100755
--- a/tools/xen/prepare_guest_template.sh
+++ b/tools/xen/prepare_guest_template.sh
@@ -93,3 +93,28 @@ EOF
# Need to set barrier=0 to avoid a Xen bug
# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/824089
sed -i -e 's/errors=/barrier=0,errors=/' $STAGING_DIR/etc/fstab
+
+# Update ubuntu repositories
+cat > $STAGING_DIR/etc/apt/sources.list << EOF
+deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} main restricted
+deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} main restricted
+deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates main restricted
+deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates main restricted
+deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} universe
+deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} universe
+deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates universe
+deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates universe
+deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} multiverse
+deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE} multiverse
+deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates multiverse
+deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-updates multiverse
+deb http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-backports main restricted universe multiverse
+deb-src http://${UBUNTU_INST_HTTP_HOSTNAME}${UBUNTU_INST_HTTP_DIRECTORY} ${UBUNTU_INST_RELEASE}-backports main restricted universe multiverse
+
+deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security main restricted
+deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security main restricted
+deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security universe
+deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security universe
+deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse
+deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse
+EOF
From 751ad1aadf8447c2b6945b6ae4ab73bf71a244ca Mon Sep 17 00:00:00 2001
From: Robert Li
Date: Wed, 15 Oct 2014 21:40:53 -0400
Subject: [PATCH 0068/3421] Allow multi-line config items in meta-section of
local.conf
It would behave such as the contents from each meta-section in
local.conf is copied to the destination files. One exception is the multiline
options not grouped together. In that case, the contents will be grouped
together in its destination config file.
Check tests/test_config.sh for examples.
This was originally committed in https://review.openstack.org/128805.
But the original change used AWK syntax that is not supported in AWK
3.1.8, and caused syntax error on servers with that AWK version. This
patch makes the necessary change so that it's compatible with AWK
3.1.8.
Change-Id: Id1e1fe01f05bd0f19ea6e89c4f4c0f8be695dfce
Partial-Bug: #1374118
---
functions-common | 27 ++++++++++++++++++++
lib/config | 48 +++++++++++++++++++++++++++++++---
tests/test_config.sh | 61 +++++++++++++++++++++++++++++++++++++++++---
3 files changed, 129 insertions(+), 7 deletions(-)
diff --git a/functions-common b/functions-common
index 9f4acfec1e..333f31da02 100644
--- a/functions-common
+++ b/functions-common
@@ -119,6 +119,33 @@ function ini_has_option {
[ -n "$line" ]
}
+# Add another config line for a multi-line option.
+# It's normally called after iniset of the same option and assumes
+# that the section already exists.
+#
+# Note that iniset_multiline requires all the 'lines' to be supplied
+# in the argument list. Doing that will cause incorrect configuration
+# if spaces are used in the config values.
+#
+# iniadd_literal config-file section option value
+function iniadd_literal {
+ local xtrace=$(set +o | grep xtrace)
+ set +o xtrace
+ local file=$1
+ local section=$2
+ local option=$3
+ local value=$4
+
+ [[ -z $section || -z $option ]] && return
+
+ # Add it
+ sed -i -e "/^\[$section\]/ a\\
+$option = $value
+" "$file"
+
+ $xtrace
+}
+
# Set an option in an INI file
# iniset config-file section option value
function iniset {
diff --git a/lib/config b/lib/config
index b44e79aa3d..a4d59a31c9 100644
--- a/lib/config
+++ b/lib/config
@@ -86,7 +86,11 @@ function merge_config_file {
# having to do nasty quoting games
get_meta_section $file $matchgroup $configfile | \
$CONFIG_AWK_CMD -v configfile=$configfile '
- BEGIN { section = "" }
+ BEGIN {
+ section = ""
+ last_section = ""
+ section_count = 0
+ }
/^\[.+\]/ {
gsub("[][]", "", $1);
section=$1
@@ -106,10 +110,48 @@ function merge_config_file {
# need to strip leading & trailing whitespace from value
sub(/^[ \t]*/, "", value)
sub(/[ \t]*$/, "", value)
- print "iniset " configfile " " section " " attr " \x27" value "\x27"
+
+ # cfg_attr_count: number of config lines per [section, attr]
+ # cfg_attr: three dimensional array to keep all the config lines per [section, attr]
+ # cfg_section: keep the section names in the same order as they appear in local.conf
+ # cfg_sec_attr_name: keep the attr names in the same order as they appear in local.conf
+ if (! (section, attr) in cfg_attr_count) {
+ if (section != last_section) {
+ cfg_section[section_count++] = section
+ last_section = section
+ }
+ attr_count = cfg_sec_attr_count[section_count - 1]++
+ cfg_sec_attr_name[section_count - 1, attr_count] = attr
+
+ cfg_attr[section, attr, 0] = value
+ cfg_attr_count[section, attr] = 1
+ } else {
+ lno = cfg_attr_count[section, attr]++
+ cfg_attr[section, attr, lno] = value
+ }
+ }
+ END {
+ # Process each section in order
+ for (sno = 0; sno < section_count; sno++) {
+ section = cfg_section[sno]
+ # The ini routines simply append a config item immediately
+ # after the section header. To keep the same order as defined
+ # in local.conf, invoke the ini routines in the reverse order
+ 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"
+ 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"
+ for (l = count -2; l >= 0; l--)
+ print "iniadd_literal " configfile " " section " " attr " \x27" cfg_attr[section, attr, l] "\x27"
+ }
+ }
+ }
}
' | while read a; do eval "$a"; done
-
}
diff --git a/tests/test_config.sh b/tests/test_config.sh
index 50e8d7b2e6..cd74cee6f0 100755
--- a/tests/test_config.sh
+++ b/tests/test_config.sh
@@ -108,6 +108,27 @@ attr = strip_trailing_space
[[test7|test-colon.conf]]
[DEFAULT]
servers=10.11.12.13:80
+
+[[test-multi-sections|test-multi-sections.conf]]
+[sec-1]
+cfg_item1 = abcd
+cfg_item2 = efgh
+
+[sec-2]
+cfg_item1 = abcd
+cfg_item3 = /1/2/3/4:5
+cfg_item4 = end
+
+[sec-3]
+cfg_item5 = 5555
+cfg_item6 = 6666
+cfg_item5 = 5555another
+
+[[test-multiline|test-multiline.conf]]
+[multi]
+cfg_item1 = "ab":"cd", "ef": "gh"
+cfg_item1 = abcd
+cfg_item2 = efgh
EOF
echo -n "get_meta_section_files: test0 doesn't exist: "
@@ -189,8 +210,39 @@ VAL=$(cat test2a.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[ddd]
-additional = true
-type = new"
+type = new
+additional = true"
+check_result "$VAL" "$EXPECT_VAL"
+
+echo -n "merge_config_file test-multi-sections: "
+rm -f test-multi-sections.conf
+merge_config_file test.conf test-multi-sections test-multi-sections.conf
+VAL=$(cat test-multi-sections.conf)
+EXPECT_VAL='
+[sec-1]
+cfg_item1 = abcd
+cfg_item2 = efgh
+
+[sec-2]
+cfg_item1 = abcd
+cfg_item3 = /1/2/3/4:5
+cfg_item4 = end
+
+[sec-3]
+cfg_item5 = 5555
+cfg_item5 = 5555another
+cfg_item6 = 6666'
+check_result "$VAL" "$EXPECT_VAL"
+
+echo -n "merge_config_file test-multiline: "
+rm -f test-multiline.conf
+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 = abcd
+cfg_item2 = efgh'
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_group test2: "
@@ -200,8 +252,8 @@ VAL=$(cat test2a.conf)
# iniset adds a blank line if it creates the file...
EXPECT_VAL="
[ddd]
-additional = true
-type = new"
+type = new
+additional = true"
check_result "$VAL" "$EXPECT_VAL"
echo -n "merge_config_group test2 no conf file: "
@@ -281,4 +333,5 @@ 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 -rf test-etc
From 09fb7baff50cfa2d7ca4b5678d3a535842f019c5 Mon Sep 17 00:00:00 2001
From: Swapnil Kulkarni
Date: Thu, 16 Oct 2014 06:30:28 +0000
Subject: [PATCH 0069/3421] Update multiple backend configuration in tempest
script
Currently when we configure the tempest with multiple LVM
backends the backend names are created as LVM_iSCSI and
LVM_iSCSI_2 which fails since the backends created by cinder
are lvmdriver-1 and lvmdriver-2.
This patch updates the backend names. Added support for
CINDER_ENABLED_BACKENDS and added todo to remove
CINDER_MULTI_LVM_BACKEND once its formally removed
Closes-Bug:#1369946
Closes-Bug:#1369942
Change-Id: If44f5eb206616afb0fbaf333f3fa6a296d4650cd
---
lib/tempest | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/lib/tempest b/lib/tempest
index d677c7e33c..40d223bd91 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -28,6 +28,7 @@
# - ``DEFAULT_INSTANCE_TYPE``
# - ``DEFAULT_INSTANCE_USER``
# - ``CINDER_MULTI_LVM_BACKEND``
+# - ``CINDER_ENABLED_BACKENDS``
#
# ``stack.sh`` calls the entry points in this order:
#
@@ -362,11 +363,17 @@ function configure_tempest {
if ! is_service_enabled c-bak; then
iniset $TEMPEST_CONFIG volume-feature-enabled backup False
fi
- CINDER_MULTI_LVM_BACKEND=$(trueorfalse False $CINDER_MULTI_LVM_BACKEND)
- if [ $CINDER_MULTI_LVM_BACKEND == "True" ]; then
+
+ # Using CINDER_ENABLED_BACKENDS
+ if [[ -n "$CINDER_ENABLED_BACKENDS" ]] && [[ $CINDER_ENABLED_BACKENDS =~ .*,.* ]]; then
iniset $TEMPEST_CONFIG volume-feature-enabled multi_backend "True"
- iniset $TEMPEST_CONFIG volume backend1_name "LVM_iSCSI"
- iniset $TEMPEST_CONFIG volume backend2_name "LVM_iSCSI_2"
+ local i=1
+ local be
+ for be in ${CINDER_ENABLED_BACKENDS//,/ }; do
+ local be_name=${be##*:}
+ iniset $TEMPEST_CONFIG volume "backend${i}_name" "$be_name"
+ i=$(( i + 1 ))
+ done
fi
if [ $TEMPEST_VOLUME_DRIVER != "default" ]; then
From 3d6d89935f13635d3fe982ccf870c017155ea903 Mon Sep 17 00:00:00 2001
From: Kyle Mestery
Date: Wed, 15 Oct 2014 16:30:15 +0000
Subject: [PATCH 0070/3421] Update the OpenDaylight support to the Helium
release
The OpenDaylight project recently released their latest release, codenamed
Helium. This commit updates the devstack support for OpenDaylight to this
new version, which includes changes to configuration files as well as the
startup of OpenDaylight itself.
Also update my email address in MAINTAINERS.rst.
Change-Id: I124b5e7e8ef7feb6c90de907916a9530409c4ad4
---
MAINTAINERS.rst | 2 +-
lib/opendaylight | 36 ++++++++++++++++++++++++++----------
2 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/MAINTAINERS.rst b/MAINTAINERS.rst
index d754c08e74..d55135de64 100644
--- a/MAINTAINERS.rst
+++ b/MAINTAINERS.rst
@@ -48,7 +48,7 @@ Neutron
OpenDaylight
~~~~~~~~~~~~
-* Kyle Mestery
+* Kyle Mestery
OpenFlow Agent (ofagent)
~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/lib/opendaylight b/lib/opendaylight
index cc29debd05..374de953c6 100644
--- a/lib/opendaylight
+++ b/lib/opendaylight
@@ -48,10 +48,10 @@ ODL_PASSWORD=${ODL_PASSWORD:-admin}
ODL_DIR=$DEST/opendaylight
# The OpenDaylight Package, currently using 'Hydrogen' release
-ODL_PKG=${ODL_PKG:-distributions-virtualization-0.1.1-osgipackage.zip}
+ODL_PKG=${ODL_PKG:-distribution-karaf-0.2.0-Helium.zip}
# The OpenDaylight URL
-ODL_URL=${ODL_URL:-https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/distributions-virtualization/0.1.1}
+ODL_URL=${ODL_URL:-https://nexus.opendaylight.org/content/groups/public/org/opendaylight/integration/distribution-karaf/0.2.0-Helium}
# Default arguments for OpenDaylight. This is typically used to set
# Java memory options.
@@ -59,11 +59,14 @@ ODL_URL=${ODL_URL:-https://nexus.opendaylight.org/content/repositories/opendayli
ODL_ARGS=${ODL_ARGS:-"-XX:MaxPermSize=384m"}
# How long to pause after ODL starts to let it complete booting
-ODL_BOOT_WAIT=${ODL_BOOT_WAIT:-60}
+ODL_BOOT_WAIT=${ODL_BOOT_WAIT:-20}
# The physical provider network to device mapping
ODL_PROVIDER_MAPPINGS=${ODL_PROVIDER_MAPPINGS:-physnet1:eth1}
+# Enable OpenDaylight l3 forwarding
+ODL_L3=${ODL_L3:-False}
+
# Entry Points
# ------------
@@ -83,11 +86,26 @@ function cleanup_opendaylight {
# configure_opendaylight() - Set config files, create data dirs, etc
function configure_opendaylight {
- # Remove simple forwarder
- rm -f $ODL_DIR/opendaylight/plugins/org.opendaylight.controller.samples.simpleforwarding*
+ # Add odl-ovsdb-openstack if it's not already there
+ local ODLOVSDB=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/org.apache.karaf.features.cfg | grep featuresBoot= | grep odl)
+ if [ "$ODLOVSDB" == "" ]; then
+ sed -i '/^featuresBoot=/ s/$/,odl-ovsdb-openstack/' $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/org.apache.karaf.features.cfg
+ fi
- # Configure OpenFlow 1.3
- echo "ovsdb.of.version=1.3" >> $ODL_DIR/opendaylight/configuration/config.ini
+ # Configure OpenFlow 1.3 if it's not there
+ local OFLOW13=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties | grep ^of.version)
+ if [ "$OFLOW13" == "" ]; then
+ echo "ovsdb.of.version=1.3" >> $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties
+ fi
+
+ # Configure L3 if the user wants it
+ if [ "${ODL_L3}" == "True" ]; then
+ # Configure L3 FWD if it's not there
+ local L3FWD=$(cat $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties | grep ^ovsdb.l3.fwd.enabled)
+ if [ "$L3FWD" == "" ]; then
+ echo "ovsdb.l3.fwd.enabled=yes" >> $ODL_DIR/distribution-karaf-0.2.0-Helium/etc/custom.properties
+ fi
+ fi
}
function configure_ml2_odl {
@@ -138,9 +156,7 @@ function start_opendaylight {
# -of13: runs ODL using OpenFlow 1.3 protocol support.
# -virt ovsdb: Runs ODL in "virtualization" mode with OVSDB support
- # NOTE(chdent): Leaving this as screen_it instead of run_process until
- # the right thing for this service is determined.
- screen_it odl-server "cd $ODL_DIR/opendaylight && JAVA_HOME=$JHOME ./run.sh $ODL_ARGS -of13 -virt ovsdb"
+ run_process odl-server "cd $ODL_DIR/distribution-karaf-0.2.0-Helium && JAVA_HOME=$JHOME bin/karaf"
# Sleep a bit to let OpenDaylight finish starting up
sleep $ODL_BOOT_WAIT
From 0f18c23de880a38c15aa4bb5d3a8f114f48dfe20 Mon Sep 17 00:00:00 2001
From: YAMAMOTO Takashi
Date: Fri, 12 Sep 2014 23:44:58 +0900
Subject: [PATCH 0071/3421] ofagent: Support physical_interface_mappings
Also, add a knob to create a veth pair instead of a bridge
to provide host connectivity for l3-agent. (Q_USE_PUBLIC_VETH)
Related: blueprint ofagent-physical-interface-mappings
Change-Id: I4c2538f0fd3fb05bfdb69e7e4c3a8462af42ba10
---
lib/neutron | 39 ++++++++++++++++++++++++-------
lib/neutron_plugins/ofagent_agent | 4 ++++
lib/neutron_plugins/ovs_base | 19 +++++++++++----
3 files changed, 49 insertions(+), 13 deletions(-)
diff --git a/lib/neutron b/lib/neutron
index 2253eda772..ca9b16cd8c 100644
--- a/lib/neutron
+++ b/lib/neutron
@@ -148,16 +148,31 @@ PROVIDER_SUBNET_NAME=${PROVIDER_SUBNET_NAME:-"provider_net"}
# If Q_USE_PROVIDERNET_FOR_PUBLIC=True, use a flat provider network
# for external interface of neutron l3-agent. In that case,
# PUBLIC_PHYSICAL_NETWORK specifies provider:physical_network value
-# used for the network. In case of openvswitch agent, you should
-# add the corresponding entry to your OVS_BRIDGE_MAPPINGS.
+# used for the network. In case of ofagent, you should add the
+# corresponding entry to your OFAGENT_PHYSICAL_INTERFACE_MAPPINGS.
+# For openvswitch agent, you should add the corresponding entry to
+# your OVS_BRIDGE_MAPPINGS.
#
-# eg.
+# eg. (ofagent)
+# Q_USE_PROVIDERNET_FOR_PUBLIC=True
+# Q_USE_PUBLIC_VETH=True
+# PUBLIC_PHYSICAL_NETWORK=public
+# OFAGENT_PHYSICAL_INTERFACE_MAPPINGS=public:veth-pub-int
+#
+# eg. (openvswitch agent)
# Q_USE_PROVIDERNET_FOR_PUBLIC=True
# PUBLIC_PHYSICAL_NETWORK=public
# OVS_BRIDGE_MAPPINGS=public:br-ex
Q_USE_PROVIDERNET_FOR_PUBLIC=${Q_USE_PROVIDERNET_FOR_PUBLIC:-False}
PUBLIC_PHYSICAL_NETWORK=${PUBLIC_PHYSICAL_NETWORK:-public}
+# If Q_USE_PUBLIC_VETH=True, create and use a veth pair instead of
+# PUBLIC_BRIDGE. This is intended to be used with
+# Q_USE_PROVIDERNET_FOR_PUBLIC=True.
+Q_USE_PUBLIC_VETH=${Q_USE_PUBLIC_VETH:-False}
+Q_PUBLIC_VETH_EX=${Q_PUBLIC_VETH_EX:-veth-pub-ex}
+Q_PUBLIC_VETH_INT=${Q_PUBLIC_VETH_INT:-veth-pub-int}
+
# The next two variables are configured by plugin
# e.g. _configure_neutron_l3_agent or lib/neutron_plugins/*
#
@@ -543,12 +558,20 @@ function create_neutron_initial_network {
if is_service_enabled q-l3; then
# logic is specific to using the l3-agent for l3
if is_neutron_ovs_base_plugin && [[ "$Q_USE_NAMESPACE" = "True" ]]; then
- # Disable in-band as we are going to use local port
- # to communicate with VMs
- sudo ovs-vsctl set Bridge $PUBLIC_BRIDGE other_config:disable-in-band=true
+ local ext_gw_interface
+
+ if [[ "$Q_USE_PUBLIC_VETH" = "True" ]]; then
+ ext_gw_interface=$Q_PUBLIC_VETH_EX
+ else
+ # Disable in-band as we are going to use local port
+ # to communicate with VMs
+ sudo ovs-vsctl set Bridge $PUBLIC_BRIDGE \
+ other_config:disable-in-band=true
+ ext_gw_interface=$PUBLIC_BRIDGE
+ fi
CIDR_LEN=${FLOATING_RANGE#*/}
- sudo ip addr add $EXT_GW_IP/$CIDR_LEN dev $PUBLIC_BRIDGE
- sudo ip link set $PUBLIC_BRIDGE up
+ sudo ip addr add $EXT_GW_IP/$CIDR_LEN dev $ext_gw_interface
+ sudo ip link set $ext_gw_interface up
ROUTER_GW_IP=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' '{ print $8; }'`
die_if_not_set $LINENO ROUTER_GW_IP "Failure retrieving ROUTER_GW_IP"
sudo route add -net $FIXED_RANGE gw $ROUTER_GW_IP
diff --git a/lib/neutron_plugins/ofagent_agent b/lib/neutron_plugins/ofagent_agent
index a5a58f4c27..1c04f2f64e 100644
--- a/lib/neutron_plugins/ofagent_agent
+++ b/lib/neutron_plugins/ofagent_agent
@@ -77,6 +77,10 @@ function neutron_plugin_configure_plugin_agent {
if [[ "$OVS_BRIDGE_MAPPINGS" != "" ]]; then
iniset /$Q_PLUGIN_CONF_FILE ovs bridge_mappings $OVS_BRIDGE_MAPPINGS
fi
+ if [[ "$OFAGENT_PHYSICAL_INTERFACE_MAPPINGS" != "" ]]; then
+ iniset /$Q_PLUGIN_CONF_FILE agent physical_interface_mappings \
+ $OFAGENT_PHYSICAL_INTERFACE_MAPPINGS
+ fi
AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-ofagent-agent"
iniset /$Q_PLUGIN_CONF_FILE agent tunnel_types $Q_TUNNEL_TYPES
diff --git a/lib/neutron_plugins/ovs_base b/lib/neutron_plugins/ovs_base
index d913f7c3cc..f0ef194569 100644
--- a/lib/neutron_plugins/ovs_base
+++ b/lib/neutron_plugins/ovs_base
@@ -79,11 +79,20 @@ function _neutron_ovs_base_configure_l3_agent {
fi
neutron-ovs-cleanup
- # --no-wait causes a race condition if $PUBLIC_BRIDGE is not up when ip addr flush is called
- sudo ovs-vsctl -- --may-exist add-br $PUBLIC_BRIDGE
- sudo ovs-vsctl br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE
- # ensure no IP is configured on the public bridge
- sudo ip addr flush dev $PUBLIC_BRIDGE
+ if [[ "$Q_USE_PUBLIC_VETH" = "True" ]]; then
+ ip link show $Q_PUBLIC_VETH_INT > /dev/null 2>&1 ||
+ sudo ip link add $Q_PUBLIC_VETH_INT type veth \
+ peer name $Q_PUBLIC_VETH_EX
+ sudo ip link set $Q_PUBLIC_VETH_INT up
+ sudo ip link set $Q_PUBLIC_VETH_EX up
+ sudo ip addr flush dev $Q_PUBLIC_VETH_EX
+ else
+ # --no-wait causes a race condition if $PUBLIC_BRIDGE is not up when ip addr flush is called
+ sudo ovs-vsctl -- --may-exist add-br $PUBLIC_BRIDGE
+ sudo ovs-vsctl br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE
+ # ensure no IP is configured on the public bridge
+ sudo ip addr flush dev $PUBLIC_BRIDGE
+ fi
}
function _neutron_ovs_base_configure_nova_vif_driver {
From e35785d910995c05a3e43af51080c6c6c5631ec7 Mon Sep 17 00:00:00 2001
From: Mate Lakat
Date: Thu, 16 Oct 2014 15:40:03 +0200
Subject: [PATCH 0072/3421] XenAPI: Always update proxy settings
If a user wants to re-use an xva just with different proxy settings, he
can now do it, as this change will always update /etc/apt/apt.conf to
reflect the settings in the user's localrc.
Change-Id: I8a6e9c88304bc887ea8269d946e89a5ba258b126
---
tools/xen/prepare_guest_template.sh | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/tools/xen/prepare_guest_template.sh b/tools/xen/prepare_guest_template.sh
index 2d3b89821f..50f2b6a825 100755
--- a/tools/xen/prepare_guest_template.sh
+++ b/tools/xen/prepare_guest_template.sh
@@ -118,3 +118,10 @@ deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security univer
deb http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse
deb-src http://security.ubuntu.com/ubuntu ${UBUNTU_INST_RELEASE}-security multiverse
EOF
+
+rm -f $STAGING_DIR/etc/apt/apt.conf
+if [ -n "$UBUNTU_INST_HTTP_PROXY" ]; then
+ cat > $STAGING_DIR/etc/apt/apt.conf << EOF
+Acquire::http::Proxy "$UBUNTU_INST_HTTP_PROXY";
+EOF
+fi
From 6518c0b88ea52e93513fa34dd63eeb4596875212 Mon Sep 17 00:00:00 2001
From: Akihiro Motoki
Date: Wed, 15 Oct 2014 17:26:59 +0900
Subject: [PATCH 0073/3421] Compile Horizon message catalogs during stack.sh
Recently compiled message catalogs (mo files) were removed
in Horizon and django_openstack_auth repositories.
We need to compile message catalogs to make translations
available for Horizon users. It is useful for developers too.
Change-Id: I0831e8308205c116d8e3bb8b43be7f0dd6fa0c0a
---
files/apts/general | 1 +
files/rpms/general | 1 +
lib/horizon | 22 ++++++++++++++++++++++
3 files changed, 24 insertions(+)
diff --git a/files/apts/general b/files/apts/general
index c308c466e3..3fe7863de2 100644
--- a/files/apts/general
+++ b/files/apts/general
@@ -27,3 +27,4 @@ bc
libyaml-dev
libffi-dev
libssl-dev # for pyOpenSSL
+gettext # used for compiling message catalogs
diff --git a/files/rpms/general b/files/rpms/general
index 7a35961bc2..d4a9fcba55 100644
--- a/files/rpms/general
+++ b/files/rpms/general
@@ -26,6 +26,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)
diff --git a/lib/horizon b/lib/horizon
index 755be18f3c..0213948633 100644
--- a/lib/horizon
+++ b/lib/horizon
@@ -84,6 +84,14 @@ 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
+ cd -
}
# init_horizon() - Initialize databases, etc.
@@ -138,6 +146,13 @@ function init_horizon {
# install_django_openstack_auth() - Collect source and prepare
function install_django_openstack_auth {
git_clone $HORIZONAUTH_REPO $HORIZONAUTH_DIR $HORIZONAUTH_BRANCH
+
+ # Compile message catalogs before installation
+ _prepare_message_catalog_compilation
+ cd $HORIZONAUTH_DIR
+ python setup.py compile_catalog
+ cd -
+
setup_install $HORIZONAUTH_DIR
}
@@ -160,6 +175,13 @@ 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 {
+ local babel_package=$(grep ^Babel $REQUIREMENTS_DIR/global-requirements.txt)
+ pip_install "$babel_package"
+}
+
# Restore xtrace
$XTRACE
From 8abd8598b3ba7dce126db7553dfc704e5a343966 Mon Sep 17 00:00:00 2001
From: Chris Dent
Date: Wed, 8 Oct 2014 15:24:25 +0100
Subject: [PATCH 0074/3421] Allow use of ceilometer agent coordination
Juno brings tooz-based coordination of ceilometer central, compute
and alarm agents. If CEILOMETER_COORDINATION_URL is set it will be
used as the value for a tooz coordination backend. If memcached is
chosen, its package will be installed. Other backends, such as
zookeeper can be configured, but installation is left as an exercise
for the devstacker.
In the default devstack setup having coordination will do little as
there are only one of each agent, but this makes it a bit easier for
multi-node or multi-agent setups.
Change-Id: Ib85ccd435de3bc0ae56b5fe8c2fce6c2af9ff8d0
---
lib/ceilometer | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/lib/ceilometer b/lib/ceilometer
index db0c457262..9046b9d3d9 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -155,6 +155,11 @@ function configure_ceilometer {
iniset $CEILOMETER_CONF DEFAULT verbose True
iniset $CEILOMETER_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
+ if [[ -n "$CEILOMETER_COORDINATION_URL" ]]; then
+ iniset $CEILOMETER_CONF coordination backend_url $CEILOMETER_COORDINATION_URL
+ iniset $CEILOMETER_CONF compute workload_partitioning True
+ fi
+
# Install the policy file for the API server
cp $CEILOMETER_DIR/etc/ceilometer/policy.json $CEILOMETER_CONF_DIR
iniset $CEILOMETER_CONF DEFAULT policy_file $CEILOMETER_CONF_DIR/policy.json
@@ -242,6 +247,9 @@ function install_ceilometer {
git_clone $CEILOMETER_REPO $CEILOMETER_DIR $CEILOMETER_BRANCH
setup_develop $CEILOMETER_DIR
+ if echo $CEILOMETER_COORDINATION_URL | grep -q '^memcached:'; then
+ install_package memcached
+ fi
}
# install_ceilometerclient() - Collect source and prepare
From 2a6215dd11400b74b7e5d6db96b44e6a74cfe291 Mon Sep 17 00:00:00 2001
From: Rob
Date: Mon, 20 Oct 2014 13:28:47 +0100
Subject: [PATCH 0075/3421] Fix empty functions causing stack failure
This patch adds a return value to several empty functions that are causing stack.sh to fail when the
Cisco Neutron plugin is enabled.
Change-Id: I43987d9cc5edc53de41c27354c3a737643d1cd43
Closes-bug: 1383273
---
lib/neutron_plugins/cisco | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/neutron_plugins/cisco b/lib/neutron_plugins/cisco
index 1406e3790c..95e0ab3368 100644
--- a/lib/neutron_plugins/cisco
+++ b/lib/neutron_plugins/cisco
@@ -82,6 +82,7 @@ function neutron_plugin_configure_common {
}
function neutron_plugin_configure_debug_command {
+ :
}
function neutron_plugin_configure_dhcp_agent {
@@ -89,6 +90,7 @@ function neutron_plugin_configure_dhcp_agent {
}
function neutron_plugin_configure_l3_agent {
+ :
}
# Configure n1kv plugin
@@ -111,6 +113,7 @@ function _configure_n1kv_subplugin {
}
function neutron_plugin_configure_plugin_agent {
+ :
}
function neutron_plugin_configure_service {
From 22ec45e63a45bb38f63ca995446338859dacb207 Mon Sep 17 00:00:00 2001
From: Adam Gandelman
Date: Thu, 16 Oct 2014 17:41:22 -0700
Subject: [PATCH 0076/3421] Move generation of baremetal VM names to lib/ironic
The create-nodes script currently receives a total # of VMs to create
and creates them all, generating their names on the fly. This moves
that name generation to lib/ironic and makes the script create only
single VMs as directed. This centralizes the naming of things to
lib/ironic and will make it easier to reference these things elsewhere.
Change-Id: I98e61f7188e027e690303e32aff7cd2347f6d2c2
---
lib/ironic | 27 ++++++--
tools/ironic/scripts/cleanup-node | 25 ++++++++
tools/ironic/scripts/cleanup-nodes | 28 ---------
.../scripts/{create-nodes => create-node} | 63 +++++++++----------
4 files changed, 76 insertions(+), 67 deletions(-)
create mode 100755 tools/ironic/scripts/cleanup-node
delete mode 100755 tools/ironic/scripts/cleanup-nodes
rename tools/ironic/scripts/{create-nodes => create-node} (52%)
diff --git a/lib/ironic b/lib/ironic
index 5f3ebcd354..1541dcfb33 100644
--- a/lib/ironic
+++ b/lib/ironic
@@ -354,6 +354,15 @@ function init_ironic {
create_ironic_cache_dir
}
+# _ironic_bm_vm_names() - Generates list of names for baremetal VMs.
+function _ironic_bm_vm_names {
+ local idx
+ local num_vms=$(($IRONIC_VM_COUNT - 1))
+ for idx in $(seq 0 $num_vms); do
+ echo "baremetal${IRONIC_VM_NETWORK_BRIDGE}_${idx}"
+ done
+}
+
# start_ironic() - Start running processes, including screen
function start_ironic {
# Start Ironic API server, if enabled.
@@ -449,10 +458,13 @@ function create_bridge_and_vms {
else
local log_arg=""
fi
- sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/create-nodes \
- $IRONIC_VM_SPECS_CPU $IRONIC_VM_SPECS_RAM $IRONIC_VM_SPECS_DISK \
- amd64 $IRONIC_VM_COUNT $IRONIC_VM_NETWORK_BRIDGE $IRONIC_VM_EMULATOR \
- $log_arg" >> $IRONIC_VM_MACS_CSV_FILE
+ local vm_name
+ for vm_name in $(_ironic_bm_vm_names); do
+ sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/create-node $vm_name \
+ $IRONIC_VM_SPECS_CPU $IRONIC_VM_SPECS_RAM $IRONIC_VM_SPECS_DISK \
+ amd64 $IRONIC_VM_NETWORK_BRIDGE $IRONIC_VM_EMULATOR \
+ $log_arg" >> $IRONIC_VM_MACS_CSV_FILE
+ done
create_ovs_taps
}
@@ -655,7 +667,12 @@ function cleanup_baremetal_basic_ops {
chmod 0600 $IRONIC_AUTHORIZED_KEYS_FILE
fi
sudo rm -rf $IRONIC_DATA_DIR $IRONIC_STATE_PATH
- sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/cleanup-nodes $IRONIC_VM_COUNT $IRONIC_VM_NETWORK_BRIDGE"
+
+ local vm_name
+ for vm_name in $(_ironic_bm_vm_names); do
+ sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/cleanup-node $vm_name $IRONIC_VM_NETWORK_BRIDGE"
+ done
+
sudo rm -rf /etc/xinetd.d/tftp /etc/init/tftpd-hpa.override
restart_service xinetd
sudo iptables -D INPUT -d $HOST_IP -p udp --dport 69 -j ACCEPT || true
diff --git a/tools/ironic/scripts/cleanup-node b/tools/ironic/scripts/cleanup-node
new file mode 100755
index 0000000000..c4e4e706f4
--- /dev/null
+++ b/tools/ironic/scripts/cleanup-node
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+# **cleanup-nodes**
+
+# Cleans up baremetal poseur nodes and volumes created during ironic setup
+# Assumes calling user has proper libvirt group membership and access.
+
+set -exu
+
+LIBVIRT_STORAGE_POOL=${LIBVIRT_STORAGE_POOL:-"default"}
+LIBVIRT_CONNECT_URI=${LIBVIRT_CONNECT_URI:-"qemu:///system"}
+
+NAME=$1
+NETWORK_BRIDGE=$2
+
+export VIRSH_DEFAULT_CONNECT_URI=$LIBVIRT_CONNECT_URI
+
+VOL_NAME="$NAME.qcow2"
+virsh list | grep -q $NAME && virsh destroy $NAME
+virsh list --inactive | grep -q $NAME && virsh undefine $NAME
+
+if virsh pool-list | grep -q $LIBVIRT_STORAGE_POOL ; then
+ virsh vol-list $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME &&
+ virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL
+fi
diff --git a/tools/ironic/scripts/cleanup-nodes b/tools/ironic/scripts/cleanup-nodes
deleted file mode 100755
index adeca5cd9e..0000000000
--- a/tools/ironic/scripts/cleanup-nodes
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env bash
-
-# **cleanup-nodes**
-
-# Cleans up baremetal poseur nodes and volumes created during ironic setup
-# Assumes calling user has proper libvirt group membership and access.
-
-set -exu
-
-LIBVIRT_STORAGE_POOL=${LIBVIRT_STORAGE_POOL:-"default"}
-LIBVIRT_CONNECT_URI=${LIBVIRT_CONNECT_URI:-"qemu:///system"}
-
-VM_COUNT=$1
-NETWORK_BRIDGE=$2
-
-export VIRSH_DEFAULT_CONNECT_URI=$LIBVIRT_CONNECT_URI
-
-for (( idx=0; idx<$VM_COUNT; idx++ )); do
- NAME="baremetal${NETWORK_BRIDGE}_${idx}"
- VOL_NAME="baremetal${NETWORK_BRIDGE}-${idx}.qcow2"
- virsh list | grep -q $NAME && virsh destroy $NAME
- virsh list --inactive | grep -q $NAME && virsh undefine $NAME
-
- if virsh pool-list | grep -q $LIBVIRT_STORAGE_POOL ; then
- virsh vol-list $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME &&
- virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL
- fi
-done
diff --git a/tools/ironic/scripts/create-nodes b/tools/ironic/scripts/create-node
similarity index 52%
rename from tools/ironic/scripts/create-nodes
rename to tools/ironic/scripts/create-node
index 140bffe46f..25b53d47f3 100755
--- a/tools/ironic/scripts/create-nodes
+++ b/tools/ironic/scripts/create-node
@@ -9,19 +9,19 @@ set -ex
# Keep track of the devstack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
-CPU=$1
-MEM=$(( 1024 * $2 ))
+NAME=$1
+CPU=$2
+MEM=$(( 1024 * $3 ))
# extra G to allow fuzz for partition table : flavor size and registered size
# need to be different to actual size.
-DISK=$(( $3 + 1))
+DISK=$(( $4 + 1))
-case $4 in
+case $5 in
i386) ARCH='i686' ;;
amd64) ARCH='x86_64' ;;
*) echo "Unsupported arch $4!" ; exit 1 ;;
esac
-TOTAL=$(($5 - 1))
BRIDGE=$6
EMULATOR=$7
LOGDIR=$8
@@ -53,32 +53,27 @@ if [ -f /etc/debian_version ]; then
PREALLOC="--prealloc-metadata"
fi
-DOMS=""
-for idx in $(seq 0 $TOTAL) ; do
- NAME="baremetal${BRIDGE}_${idx}"
- if [ -n "$LOGDIR" ] ; then
- VM_LOGGING="--console-log $LOGDIR/${NAME}_console.log"
- else
- VM_LOGGING=""
- fi
- DOMS="$DOMS $NAME"
- VOL_NAME="baremetal${BRIDGE}-${idx}.qcow2"
- (virsh list --all | grep -q $NAME) && continue
-
- virsh vol-list --pool $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME &&
- virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL >&2
- virsh vol-create-as $LIBVIRT_STORAGE_POOL ${VOL_NAME} ${DISK}G --format qcow2 $PREALLOC >&2
- volume_path=$(virsh vol-path --pool $LIBVIRT_STORAGE_POOL $VOL_NAME)
- # Pre-touch the VM to set +C, as it can only be set on empty files.
- sudo touch "$volume_path"
- sudo chattr +C "$volume_path" || true
- $TOP_DIR/scripts/configure-vm \
- --bootdev network --name $NAME --image "$volume_path" \
- --arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \
- --emulator $EMULATOR --network $BRIDGE $VM_LOGGING >&2
-done
-
-for dom in $DOMS ; do
- # echo mac
- virsh dumpxml $dom | grep "mac address" | head -1 | cut -d\' -f2
-done
+if [ -n "$LOGDIR" ] ; then
+ VM_LOGGING="--console-log $LOGDIR/${NAME}_console.log"
+else
+ VM_LOGGING=""
+fi
+VOL_NAME="${NAME}.qcow2"
+
+if ! virsh list --all | grep -q $NAME; then
+ virsh vol-list --pool $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME &&
+ virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL >&2
+ virsh vol-create-as $LIBVIRT_STORAGE_POOL ${VOL_NAME} ${DISK}G --format qcow2 $PREALLOC >&2
+ volume_path=$(virsh vol-path --pool $LIBVIRT_STORAGE_POOL $VOL_NAME)
+ # Pre-touch the VM to set +C, as it can only be set on empty files.
+ sudo touch "$volume_path"
+ sudo chattr +C "$volume_path" || true
+ $TOP_DIR/scripts/configure-vm \
+ --bootdev network --name $NAME --image "$volume_path" \
+ --arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \
+ --emulator $EMULATOR --network $BRIDGE $VM_LOGGING >&2
+
+fi
+
+# echo mac
+virsh dumpxml $NAME | grep "mac address" | head -1 | cut -d\' -f2
From 8543a0f763c1f4fcc3ca7e13efece54a0ff7fbb6 Mon Sep 17 00:00:00 2001
From: Adam Gandelman
Date: Thu, 16 Oct 2014 17:42:33 -0700
Subject: [PATCH 0077/3421] Make screen_service() useful for more than services
screen_service() can currently only be used to launch things that
pass the 'is_service_enabled' check, even though its calling functions
will have already done this. This removes such check, renames it
to screen_process() and updates its usage elsewhere.
Change-Id: I480a4560a45b131a95c1b2d2d2379aeba542a9bc
---
functions-common | 72 +++++++++++++++++++++++-------------------------
1 file changed, 35 insertions(+), 37 deletions(-)
diff --git a/functions-common b/functions-common
index 333f31da02..e6f425f4a1 100644
--- a/functions-common
+++ b/functions-common
@@ -1251,7 +1251,7 @@ function run_process {
if is_service_enabled $service; then
if [[ "$USE_SCREEN" = "True" ]]; then
- screen_service "$service" "$command" "$group"
+ screen_process "$service" "$command" "$group"
else
# Spawn directly without screen
_run_process "$service" "$command" "$group" &
@@ -1259,14 +1259,14 @@ function run_process {
fi
}
-# Helper to launch a service in a named screen
+# Helper to launch a process in a named screen
# Uses globals ``CURRENT_LOG_TIME``, ``SCREEN_NAME``, ``SCREEN_LOGDIR``,
# ``SERVICE_DIR``, ``USE_SCREEN``
-# screen_service service "command-line" [group]
+# screen_process name "command-line" [group]
# Run a command in a shell in a screen window, if an optional group
# is provided, use sg to set the group of the command.
-function screen_service {
- local service=$1
+function screen_process {
+ local name=$1
local command="$2"
local group=$3
@@ -1274,38 +1274,36 @@ function screen_service {
SERVICE_DIR=${SERVICE_DIR:-${DEST}/status}
USE_SCREEN=$(trueorfalse True $USE_SCREEN)
- if is_service_enabled $service; then
- # Append the service to the screen rc file
- screen_rc "$service" "$command"
-
- screen -S $SCREEN_NAME -X screen -t $service
-
- if [[ -n ${SCREEN_LOGDIR} ]]; then
- screen -S $SCREEN_NAME -p $service -X logfile ${SCREEN_LOGDIR}/screen-${service}.${CURRENT_LOG_TIME}.log
- screen -S $SCREEN_NAME -p $service -X log on
- ln -sf ${SCREEN_LOGDIR}/screen-${service}.${CURRENT_LOG_TIME}.log ${SCREEN_LOGDIR}/screen-${service}.log
- fi
+ # Append the process to the screen rc file
+ screen_rc "$name" "$command"
- # 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
+ screen -S $SCREEN_NAME -X screen -t $name
- NL=`echo -ne '\015'`
- # This fun command does the following:
- # - the passed server command is backgrounded
- # - the pid of the background process is saved in the usual place
- # - the server process is brought back to the foreground
- # - if the server process exits prematurely the fg command errors
- # and a message is written to stdout and the service failure file
- #
- # The pid saved can be used in stop_process() as a process group
- # id to kill off all child processes
- if [[ -n "$group" ]]; then
- command="sg $group '$command'"
- fi
- screen -S $SCREEN_NAME -p $service -X stuff "$command & echo \$! >$SERVICE_DIR/$SCREEN_NAME/${service}.pid; fg || echo \"$service failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/${service}.failure\"$NL"
+ if [[ -n ${SCREEN_LOGDIR} ]]; then
+ screen -S $SCREEN_NAME -p $name -X logfile ${SCREEN_LOGDIR}/screen-${name}.${CURRENT_LOG_TIME}.log
+ screen -S $SCREEN_NAME -p $name -X log on
+ ln -sf ${SCREEN_LOGDIR}/screen-${name}.${CURRENT_LOG_TIME}.log ${SCREEN_LOGDIR}/screen-${name}.log
+ fi
+
+ # 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
+
+ NL=`echo -ne '\015'`
+ # This fun command does the following:
+ # - the passed server command is backgrounded
+ # - the pid of the background process is saved in the usual place
+ # - the server process is brought back to the foreground
+ # - if the server process exits prematurely the fg command errors
+ # and a message is written to stdout and the process failure file
+ #
+ # The pid saved can be used in stop_process() as a process group
+ # id to kill off all child processes
+ if [[ -n "$group" ]]; then
+ command="sg $group '$command'"
fi
+ screen -S $SCREEN_NAME -p $name -X stuff "$command & echo \$! >$SERVICE_DIR/$SCREEN_NAME/${name}.pid; fg || echo \"$name failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/${name}.failure\"$NL"
}
# Screen rc file builder
@@ -1412,12 +1410,12 @@ function service_check {
# Tail a log file in a screen if USE_SCREEN is true.
function tail_log {
- local service=$1
+ local name=$1
local logfile=$2
USE_SCREEN=$(trueorfalse True $USE_SCREEN)
if [[ "$USE_SCREEN" = "True" ]]; then
- screen_service "$service" "sudo tail -f $logfile"
+ screen_process "$name" "sudo tail -f $logfile"
fi
}
@@ -1476,7 +1474,7 @@ function screen_it {
screen_rc "$1" "$2"
if [[ "$USE_SCREEN" = "True" ]]; then
- screen_service "$1" "$2"
+ screen_process "$1" "$2"
else
# Spawn directly without screen
old_run_process "$1" "$2" >$SERVICE_DIR/$SCREEN_NAME/$1.pid
From 761c456a4e89802d2f78a8dbdc5f20d71716f7dd Mon Sep 17 00:00:00 2001
From: Ian Wienand
Date: Tue, 21 Oct 2014 11:41:37 +1100
Subject: [PATCH 0078/3421] Remove usage of $[ for arithmetic, take 2
I did a similar change in I8ba180be036836f37ebdbb6da36ff0be486c043e
but I guess somehow missed these ... maybe I forgot to add them to the
change.
As described originally, this causes TOT bashate to fail, so fix this
up before it gets released.
Change-Id: I5580cb46f1c8bd71c631549aab78428d95a6dc51
---
lib/swift | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/swift b/lib/swift
index 15bd2a9471..0b9b89369e 100644
--- a/lib/swift
+++ b/lib/swift
@@ -196,9 +196,9 @@ function _config_swift_apache_wsgi {
# copy apache vhost file and set name and port
local node_number
for node_number in ${SWIFT_REPLICAS_SEQ}; do
- local object_port=$[OBJECT_PORT_BASE + 10 * ($node_number - 1)]
- local container_port=$[CONTAINER_PORT_BASE + 10 * ($node_number - 1)]
- local account_port=$[ACCOUNT_PORT_BASE + 10 * ($node_number - 1)]
+ local object_port=$(( OBJECT_PORT_BASE + 10 * (node_number - 1) ))
+ local container_port=$(( CONTAINER_PORT_BASE + 10 * (node_number - 1) ))
+ local account_port=$(( ACCOUNT_PORT_BASE + 10 * (node_number - 1) ))
sudo cp ${SWIFT_DIR}/examples/apache2/object-server.template $(apache_site_config_for object-server-${node_number})
sudo sed -e "
@@ -257,7 +257,7 @@ function generate_swift_config_services {
local bind_port=$3
local server_type=$4
- log_facility=$[ node_id - 1 ]
+ log_facility=$(( node_id - 1 ))
local node_path=${SWIFT_DATA_DIR}/${node_number}
iniuncomment ${swift_node_config} DEFAULT user
From eaff3e1b8c7133e4a5ea8a783e23536871be409a Mon Sep 17 00:00:00 2001
From: Adrien Cunin
Date: Tue, 21 Oct 2014 13:46:54 +0200
Subject: [PATCH 0079/3421] Reference git.o.o DevStack repo rather than GitHub
In docs, use git.o.o URLs rather than GitHub URLs for the DevStack repo,
and don't mention GitHub when git.o.o is more appropriate.
Also, replaced GitHub logo with Git logo in quickstart.png.
Change-Id: Iab0006144f008963b8cb5be2d10ce0f360c0e6ca
---
HACKING.rst | 4 ++--
doc/source/assets/css/local.css | 4 ++--
doc/source/assets/images/quickstart.png | Bin 12375 -> 9491 bytes
doc/source/changes.html | 2 +-
doc/source/configuration.html | 2 +-
doc/source/contributing.html | 4 ++--
doc/source/eucarc.html | 2 +-
doc/source/exerciserc.html | 2 +-
doc/source/faq.html | 4 ++--
doc/source/guides/multinode-lab.html | 6 +++---
doc/source/guides/pxe-boot.html | 2 +-
doc/source/guides/ramdisk.html | 4 ++--
doc/source/guides/single-machine.html | 4 ++--
doc/source/guides/single-vm.html | 4 ++--
doc/source/guides/usb-boot.html | 2 +-
doc/source/index.html | 10 +++++-----
doc/source/local.conf.html | 2 +-
doc/source/localrc.html | 2 +-
doc/source/openrc.html | 2 +-
doc/source/overview.html | 2 +-
doc/source/plugins.html | 2 +-
doc/source/stackrc.html | 2 +-
22 files changed, 34 insertions(+), 34 deletions(-)
diff --git a/HACKING.rst b/HACKING.rst
index d69bb49286..3b86529ec0 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -10,8 +10,8 @@ and so is limited to Bash (version 3 and up) and compatible shells.
Shell script was chosen because it best illustrates the steps used to
set up and interact with OpenStack components.
-DevStack's official repository is located on GitHub at
-https://github.com/openstack-dev/devstack.git. Besides the master branch that
+DevStack's official repository is located on git.openstack.org at
+https://git.openstack.org/openstack-dev/devstack. Besides the master branch that
tracks the OpenStack trunk branches a separate branch is maintained for all
OpenStack releases starting with Diablo (stable/diablo).
diff --git a/doc/source/assets/css/local.css b/doc/source/assets/css/local.css
index 5c703af3e4..c8667c45ff 100644
--- a/doc/source/assets/css/local.css
+++ b/doc/source/assets/css/local.css
@@ -71,7 +71,7 @@ li#ubuntu {
margin-bottom: 14px;
}
-li#github {
+li#git {
background-position: left -70px !important;
height: 61px;
padding: ;
@@ -119,4 +119,4 @@ footer {
.wat {
margin-top: 33px;
-}
\ No newline at end of file
+}
diff --git a/doc/source/assets/images/quickstart.png b/doc/source/assets/images/quickstart.png
index 5400a6f4df111ce1f9bc92bf285cae540840fb9f..735617b8cd4845e1afa9b85524c96d9015fbc410 100644
GIT binary patch
literal 9491
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
V6fLn*CGz?bpe(O0S0iH?{y%IZ@nHY}
literal 12375
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