From 13dc5ccd13a636dcde03324ef7586728caa59db2 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Tue, 27 Mar 2012 14:50:45 -0500 Subject: [PATCH] A) Add/move functions to 'functions' file Add ini*() and tests Add GetOSVersion() Add install_package(), yum_install() Add *_service() Rebased Change-Id: I570dba5ed4d2b988cdd1771cf6bed0aaf8e0fe27 --- functions | 163 ++++++++++++++++++++++++++++++++++++++++++++- stack.sh | 32 ++++----- tests/functions.sh | 86 ++++++++++++++++++++++++ 3 files changed, 263 insertions(+), 18 deletions(-) diff --git a/functions b/functions index 75c20d7577..ecfda057ef 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 @@ set +o xtrace # 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 @@ function get_field() { } +# 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 @@ function git_clone { } +# 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 @@ function is_service_enabled() { } +# 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 @@ function is_set() { # 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 @@ function trueorfalse() { 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 1fb9564a83..60e9c727a6 100755 --- a/stack.sh +++ b/stack.sh @@ -107,7 +107,7 @@ if [[ $EUID -eq 0 ]]; then # 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 @@ function read_password { set -o xtrace } + # Nova Network Configuration # -------------------------- @@ -590,7 +591,7 @@ function get_packages() { # 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 @@ fi # ------ 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 </tmp/90-stack-m.conf @@ -692,7 +693,7 @@ EOF 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 @@ if is_service_enabled rabbit; then # 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 @@ EOF 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 @@ screen -r stack -X hardstatus alwayslastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%< 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 @@ if is_service_enabled horizon; then 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 @@ if is_service_enabled q-svc; then # 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 @@ if is_service_enabled n-cpu; then # 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 @@ if is_service_enabled n-cpu; then # 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 @@ if is_service_enabled n-cpu; then # 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 @@ fi # 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 @@ if is_service_enabled n-vol; then # 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 69e8c0abdb..931cde810b 100755 --- a/tests/functions.sh +++ b/tests/functions.sh @@ -37,3 +37,89 @@ if [[ $? = 0 ]]; then echo "die_if_not_set [X='' false] Failed" fi + +echo "Testing INI functions" + +cat >test.ini <