A) Add/move functions to 'functions' file
Add ini*() and tests
Add GetOSVersion()
Add install_package(), yum_install()
Add *_service()
Rebased
Change-Id: I570dba5ed4d2b988cdd1771cf6bed0aaf8e0fe27
diff --git a/functions b/functions
index 75c20d7..ecfda05 100644
--- a/functions
+++ b/functions
@@ -1,4 +1,7 @@
# functions - Common functions used by DevStack components
+#
+# ENABLED_SERVICES is used by is_service_enabled()
+
# Save trace setting
XTRACE=$(set +o | grep xtrace)
@@ -6,7 +9,7 @@
# apt-get wrapper to set arguments correctly
-# apt_get package [package ...]
+# apt_get operation package [package ...]
function apt_get() {
[[ "$OFFLINE" = "True" || -z "$@" ]] && return
local sudo="sudo"
@@ -70,6 +73,71 @@
}
+# Determine OS Vendor, Release and Update
+# Tested with OS/X, Ubuntu, RedHat, CentOS, Fedora
+# Returns results in global variables:
+# os_VENDOR - vendor name
+# os_RELEASE - release
+# os_UPDATE - update
+# os_PACKAGE - package type
+# os_CODENAME - vendor's codename for release
+# GetOSVersion
+GetOSVersion() {
+ # Figure out which vendor we are
+ if [[ -n "`which sw_vers 2>/dev/null`" ]]; then
+ # OS/X
+ os_VENDOR=`sw_vers -productName`
+ os_RELEASE=`sw_vers -productVersion`
+ os_UPDATE=${os_RELEASE##*.}
+ os_RELEASE=${os_RELEASE%.*}
+ os_PACKAGE=""
+ if [[ "$os_RELEASE" =~ "10.7" ]]; then
+ os_CODENAME="lion"
+ elif [[ "$os_RELEASE" =~ "10.6" ]]; then
+ os_CODENAME="snow leopard"
+ elif [[ "$os_RELEASE" =~ "10.5" ]]; then
+ os_CODENAME="leopard"
+ elif [[ "$os_RELEASE" =~ "10.4" ]]; then
+ os_CODENAME="tiger"
+ elif [[ "$os_RELEASE" =~ "10.3" ]]; then
+ os_CODENAME="panther"
+ else
+ os_CODENAME=""
+ fi
+ elif [[ -x $(which lsb_release 2>/dev/null) ]]; then
+ os_VENDOR=$(lsb_release -i -s)
+ os_RELEASE=$(lsb_release -r -s)
+ os_UPDATE=""
+ if [[ "Debian,Ubuntu" =~ $os_VENDOR ]]; then
+ os_PACKAGE="deb"
+ else
+ os_PACKAGE="rpm"
+ fi
+ os_CODENAME=$(lsb_release -c -s)
+ elif [[ -r /etc/redhat-release ]]; then
+ # Red Hat Enterprise Linux Server release 5.5 (Tikanga)
+ # CentOS release 5.5 (Final)
+ # CentOS Linux release 6.0 (Final)
+ # Fedora release 16 (Verne)
+ os_CODENAME=""
+ for r in "Red Hat" CentOS Fedora; do
+ os_VENDOR=$r
+ if [[ -n "`grep \"$r\" /etc/redhat-release`" ]]; then
+ ver=`sed -e 's/^.* \(.*\) (\(.*\)).*$/\1\|\2/' /etc/redhat-release`
+ os_CODENAME=${ver#*|}
+ os_RELEASE=${ver%|*}
+ os_UPDATE=${os_RELEASE##*.}
+ os_RELEASE=${os_RELEASE%.*}
+ break
+ fi
+ os_VENDOR=""
+ done
+ os_PACKAGE="rpm"
+ fi
+ export os_VENDOR os_RELEASE os_UPDATE os_PACKAGE os_CODENAME
+}
+
+
# git clone only if directory doesn't exist already. Since ``DEST`` might not
# be owned by the installation user, we create the directory and change the
# ownership to the proper user.
@@ -115,6 +183,42 @@
}
+# Comment an option in an INI file
+# optset config-file section option
+function inicomment() {
+ local file=$1
+ local section=$2
+ local option=$3
+ sed -i -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=.*$\)|#\1|" $file
+}
+
+
+# Get an option from an INI file
+# optget config-file section option
+function iniget() {
+ local file=$1
+ local section=$2
+ local option=$3
+ local line
+ line=$(sed -ne "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ p; }" $file)
+ echo ${line#*=}
+}
+
+
+# Set an option in an INI file
+# This is NOT a complete option setter, it assumes that the section and
+# option already exist in the INI file. If the section does not exist,
+# nothing happens.
+# optset config-file section option value
+function iniset() {
+ local file=$1
+ local section=$2
+ local option=$3
+ local value=$4
+ sed -i -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=[ \t]*\).*$|\1$value|" $file
+}
+
+
# is_service_enabled() checks if the service(s) specified as arguments are
# enabled by the user in **ENABLED_SERVICES**.
#
@@ -138,6 +242,20 @@
}
+# Distro-agnostic package installer
+# install_package package [package ...]
+function install_package() {
+ if [[ -z "$os_PACKAGE" ]]; then
+ GetOSVersion
+ fi
+ if [[ "$os_PACKAGE" = "deb" ]]; then
+ apt_get install "$@"
+ else
+ yum_install "$@"
+ fi
+}
+
+
# Test if the named environment variable is set and not zero length
# is_set env-var
function is_set() {
@@ -153,10 +271,39 @@
# pip_install package [package ...]
function pip_install {
[[ "$OFFLINE" = "True" || -z "$@" ]] && return
+ if [[ -z "$os_PACKAGE" ]]; then
+ GetOSVersion
+ fi
+ if [[ "$os_PACKAGE" = "deb" ]]; then
+ CMD_PIP=/usr/bin/pip
+ else
+ CMD_PIP=/usr/bin/pip-python
+ fi
sudo PIP_DOWNLOAD_CACHE=/var/cache/pip \
HTTP_PROXY=$http_proxy \
HTTPS_PROXY=$https_proxy \
- pip install --use-mirrors $@
+ $CMD_PIP install --use-mirrors $@
+}
+
+
+# Service wrapper to restart services
+# restart_service service-name
+function restart_service() {
+ sudo /usr/sbin/service $1 restart
+}
+
+
+# Service wrapper to start services
+# start_service service-name
+function start_service() {
+ sudo /usr/sbin/service $1 start
+}
+
+
+# Service wrapper to stop services
+# stop_service service-name
+function stop_service() {
+ sudo /usr/sbin/service $1 stop
}
@@ -172,5 +319,17 @@
echo "$default"
}
+
+# yum wrapper to set arguments correctly
+# yum_install package [package ...]
+function yum_install() {
+ [[ "$OFFLINE" = "True" ]] && return
+ local sudo="sudo"
+ [[ "$(id -u)" = "0" ]] && sudo="env"
+ $sudo http_proxy=$http_proxy https_proxy=$https_proxy \
+ yum install -y "$@"
+}
+
+
# Restore xtrace
$XTRACE
diff --git a/stack.sh b/stack.sh
index 1fb9564..60e9c72 100755
--- a/stack.sh
+++ b/stack.sh
@@ -107,7 +107,7 @@
# since this script runs as a normal user, we need to give that user
# ability to run sudo
- dpkg -l sudo || apt_get update && apt_get install sudo
+ dpkg -l sudo || apt_get update && install_package sudo
if ! getent passwd stack >/dev/null; then
echo "Creating a user called stack"
@@ -268,6 +268,7 @@
set -o xtrace
}
+
# Nova Network Configuration
# --------------------------
@@ -590,7 +591,7 @@
# install apt requirements
apt_get update
-apt_get install $(get_packages $FILES/apts)
+install_package $(get_packages $FILES/apts)
# install python requirements
pip_install $(get_packages $FILES/pips | sort -u)
@@ -677,7 +678,7 @@
# ------
if [[ $SYSLOG != "False" ]]; then
- apt_get install -y rsyslog-relp
+ install_package rsyslog-relp
if [[ "$SYSLOG_HOST" = "$HOST_IP" ]]; then
# Configure the master host to receive
cat <<EOF >/tmp/90-stack-m.conf
@@ -692,7 +693,7 @@
EOF
sudo mv /tmp/90-stack-s.conf /etc/rsyslog.d
fi
- sudo /usr/sbin/service rsyslog restart
+ restart_service rsyslog
fi
@@ -703,7 +704,7 @@
# Install and start rabbitmq-server
# the temp file is necessary due to LP: #878600
tfile=$(mktemp)
- apt_get install rabbitmq-server > "$tfile" 2>&1
+ install_package rabbitmq-server > "$tfile" 2>&1
cat "$tfile"
rm -f "$tfile"
# change the rabbit password since the default is "guest"
@@ -738,13 +739,13 @@
fi
# Install and start mysql-server
- apt_get install mysql-server
+ install_package mysql-server
# Update the DB to give user ‘$MYSQL_USER’@’%’ full control of the all databases:
sudo mysql -uroot -p$MYSQL_PASSWORD -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_USER'@'%' identified by '$MYSQL_PASSWORD';"
# Edit /etc/mysql/my.cnf to change ‘bind-address’ from localhost (127.0.0.1) to any (0.0.0.0) and restart the mysql service:
sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf
- sudo service mysql restart
+ restart_service mysql
fi
# Our screenrc file builder
@@ -801,7 +802,7 @@
if is_service_enabled horizon; then
# Install apache2, which is NOPRIME'd
- apt_get install apache2 libapache2-mod-wsgi
+ install_package apache2 libapache2-mod-wsgi
# Remove stale session database.
@@ -826,7 +827,7 @@
s,%GROUP%,$APACHE_GROUP,g;
s,%HORIZON_DIR%,$HORIZON_DIR,g;
" -i /etc/apache2/sites-enabled/000-default
- sudo service apache2 restart
+ restart_service apache2
fi
@@ -905,8 +906,7 @@
# Install deps
# FIXME add to files/apts/quantum, but don't install if not needed!
kernel_version=`cat /proc/version | cut -d " " -f3`
- apt_get install linux-headers-$kernel_version
- apt_get install openvswitch-switch openvswitch-datapath-dkms
+ install_package openvswitch-switch openvswitch-datapath-dkms linux-headers-$kernel_version
# Create database for the plugin/agent
if is_service_enabled mysql; then
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS ovs_quantum;'
@@ -1019,7 +1019,7 @@
# Virtualization Configuration
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- apt_get install libvirt-bin
+ install_package libvirt-bin
# Force IP forwarding on, just on case
sudo sysctl -w net.ipv4.ip_forward=1
@@ -1043,7 +1043,7 @@
# to simulate multiple systems.
if [[ "$LIBVIRT_TYPE" == "lxc" ]]; then
if [[ "$DISTRO" > natty ]]; then
- apt_get install cgroup-lite
+ install_package cgroup-lite
else
cgline="none /cgroup cgroup cpuacct,memory,devices,cpu,freezer,blkio 0 0"
sudo mkdir -p /cgroup
@@ -1062,7 +1062,7 @@
# libvirt detects various settings on startup, as we potentially changed
# the system configuration (modules, filesystems), we need to restart
# libvirt to detect those changes.
- sudo /etc/init.d/libvirt-bin restart
+ restart_service libvirt-bin
# Instance Storage
@@ -1113,7 +1113,7 @@
# Storage Service
if is_service_enabled swift; then
# Install memcached for swift.
- apt_get install memcached
+ install_package memcached
# We first do a bit of setup by creating the directories and
# changing the permissions so we can run it as our user.
@@ -1297,7 +1297,7 @@
# By default, the backing file is 2G in size, and is stored in /opt/stack.
# install the package
- apt_get install tgt
+ install_package tgt
if ! sudo vgs $VOLUME_GROUP; then
VOLUME_BACKING_FILE=${VOLUME_BACKING_FILE:-$DEST/nova-volumes-backing-file}
diff --git a/tests/functions.sh b/tests/functions.sh
index 69e8c0a..931cde8 100755
--- a/tests/functions.sh
+++ b/tests/functions.sh
@@ -37,3 +37,89 @@
echo "die_if_not_set [X='' false] Failed"
fi
+
+echo "Testing INI functions"
+
+cat >test.ini <<EOF
+[default]
+# comment an option
+#log_file=./log.conf
+log_file=/etc/log.conf
+handlers=do not disturb
+
+[aaa]
+# the commented option should not change
+#handlers=cc,dd
+handlers = aa, bb
+
+[bbb]
+handlers=ee,ff
+EOF
+
+# Test with spaces
+
+VAL=$(iniget test.ini aaa handlers)
+if [[ "$VAL" == "aa, bb" ]]; then
+ echo "OK: $VAL"
+else
+ echo "iniget failed: $VAL"
+fi
+
+iniset test.ini aaa handlers "11, 22"
+
+VAL=$(iniget test.ini aaa handlers)
+if [[ "$VAL" == "11, 22" ]]; then
+ echo "OK: $VAL"
+else
+ echo "iniget failed: $VAL"
+fi
+
+
+# Test without spaces, end of file
+
+VAL=$(iniget test.ini bbb handlers)
+if [[ "$VAL" == "ee,ff" ]]; then
+ echo "OK: $VAL"
+else
+ echo "iniget failed: $VAL"
+fi
+
+iniset test.ini bbb handlers "33,44"
+
+VAL=$(iniget test.ini bbb handlers)
+if [[ "$VAL" == "33,44" ]]; then
+ echo "OK: $VAL"
+else
+ echo "iniget failed: $VAL"
+fi
+
+
+# Test section not exist
+
+VAL=$(iniget test.ini zzz handlers)
+if [[ -z "$VAL" ]]; then
+ echo "OK"
+else
+ echo "iniget failed: $VAL"
+fi
+
+iniset test.ini zzz handlers "999"
+
+VAL=$(iniget test.ini zzz handlers)
+if [[ -z "$VAL" ]]; then
+ echo "OK"
+else
+ echo "iniget failed: $VAL"
+fi
+
+
+# Test comments
+
+inicomment test.ini aaa handlers
+
+VAL=$(iniget test.ini aaa handlers)
+if [[ -z "$VAL" ]]; then
+ echo "OK"
+else
+ echo "inicomment failed: $VAL"
+fi