stack.sh
ba23cc73
 #!/usr/bin/env bash
 
c6c1d439
 # ``stack.sh`` is an opinionated OpenStack developer installation.  It
4a43b7bd
 # installs and configures various combinations of **Ceilometer**, **Cinder**,
0cccad43
 # **Glance**, **Heat**, **Horizon**, **Keystone**, **Nova**, **Neutron**,
 # **Swift**, and **Trove**
ba23cc73
 
9b353671
 # This script allows you to specify configuration options of what git
5372f433
 # repositories to use, enabled services, network configuration and various
 # passwords.  If you are crafty you can run the script on multiple nodes using
 # shared settings for common resources (mysql, rabbitmq) and build a multi-node
 # developer install.
782b9917
 
4a43b7bd
 # To keep this script simple we assume you are running on a recent **Ubuntu**
1a6d4492
 # (12.04 Precise or newer) or **Fedora** (F16 or newer) machine.  (It may work
 # on other platforms but support for those platforms is left to those who added
 # them to DevStack.)  It should work in a VM or physical server.  Additionally
 # we maintain a list of ``apt`` and ``rpm`` dependencies and other configuration
 # files in this repo.
24859060
 
0e7e897b
 # Learn more and get the most recent version at http://devstack.org
6edd17f7
 
4e971118
 # Make sure custom grep options don't get in the way
 unset GREP_OPTIONS
 
c6c1d439
 # Keep track of the devstack directory
51fb22ef
 TOP_DIR=$(cd $(dirname "$0") && pwd)
 
6563a3ce
 # Import common functions
c6c1d439
 source $TOP_DIR/functions
 
893e6636
 # Import config functions
 source $TOP_DIR/lib/config
 
c6c1d439
 # Determine what system we are running on.  This provides ``os_VENDOR``,
 # ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME``
a9e0a488
 # and ``DISTRO``
 GetDistro
6edd17f7
 
eb2da5df
 
48352ee7
 # Global Settings
 # ===============
9122e7b1
 
893e6636
 # Check for a ``localrc`` section embedded in ``local.conf`` and extract if
 # ``localrc`` does not already exist
 
 # Phase: local
 rm -f $TOP_DIR/.localrc.auto
 if [[ -r $TOP_DIR/local.conf ]]; then
     LRC=$(get_meta_section_files $TOP_DIR/local.conf local)
     for lfile in $LRC; do
         if [[ "$lfile" == "localrc" ]]; then
             if [[ -r $TOP_DIR/localrc ]]; then
                 warn $LINENO "localrc and local.conf:[[local]] both exist, using localrc"
             else
7f9bdc47
                 echo "# Generated file, do not edit" >$TOP_DIR/.localrc.auto
893e6636
                 get_meta_section $TOP_DIR/local.conf local $lfile >>$TOP_DIR/.localrc.auto
             fi
         fi
     done
 fi
 
1a6d4492
 # ``stack.sh`` is customizable by setting environment variables.  Override a
 # default setting via export::
9122e7b1
 #
428af5a2
 #     export DATABASE_PASSWORD=anothersecret
9122e7b1
 #     ./stack.sh
 #
1a6d4492
 # or by setting the variable on the command line::
9122e7b1
 #
1a6d4492
 #     DATABASE_PASSWORD=simple ./stack.sh
 #
 # Persistent variables can be placed in a ``localrc`` file::
9122e7b1
 #
428af5a2
 #     DATABASE_PASSWORD=anothersecret
 #     DATABASE_USER=hellaroot
9122e7b1
 #
 # We try to have sensible defaults, so you should be able to run ``./stack.sh``
4a43b7bd
 # in most cases.  ``localrc`` is not distributed with DevStack and will never
 # be overwritten by a DevStack update.
9122e7b1
 #
df0972c1
 # DevStack distributes ``stackrc`` which contains locations for the OpenStack
cc6b4435
 # repositories, branches to configure, and other configuration defaults.
 # ``stackrc`` sources ``localrc`` to allow you to safely override those settings.
4a43b7bd
 
bbafb1b5
 if [[ ! -r $TOP_DIR/stackrc ]]; then
07115eb5
     log_error $LINENO "missing $TOP_DIR/stackrc - did you grab more than just stack.sh?"
bbafb1b5
 fi
 source $TOP_DIR/stackrc
df0972c1
 
4a43b7bd
 
48352ee7
 # Local Settings
4a43b7bd
 # --------------
 
48352ee7
 # Make sure the proxy config is visible to sub-processes
 export_proxy_variables
9122e7b1
 
 # Destination path for installation ``DEST``
 DEST=${DEST:-/opt/stack}
 
c6c1d439
 
 # Sanity Check
48352ee7
 # ------------
c6c1d439
 
33cb4303
 # Clean up last environment var cache
 if [[ -r $TOP_DIR/.stackenv ]]; then
     rm $TOP_DIR/.stackenv
 fi
 
cc6b4435
 # ``stack.sh`` keeps the list of ``apt`` and ``rpm`` dependencies and config
 # templates and other useful files in the ``files`` subdirectory
 FILES=$TOP_DIR/files
 if [ ! -d $FILES ]; then
     log_error $LINENO "missing devstack/files"
 fi
 
 # ``stack.sh`` keeps function libraries here
 # Make sure ``$TOP_DIR/lib`` directory is present
 if [ ! -d $TOP_DIR/lib ]; then
     log_error $LINENO "missing devstack/lib"
 fi
 
b0f1c38b
 # Import common services (database, message queue) configuration
c1b486a5
 source $TOP_DIR/lib/database
b0f1c38b
 source $TOP_DIR/lib/rpc_backend
c1b486a5
 
f04178fd
 # Remove services which were negated in ENABLED_SERVICES
6fd28117
 # using the "-" prefix (e.g., "-rabbit") instead of
f04178fd
 # calling disable_service().
 disable_negated_services
c4cd4140
 
c6c1d439
 # Warn users who aren't on an explicitly supported distro, but allow them to
 # override check and attempt installation with ``FORCE=yes ./stack``
30396576
 if [[ ! ${DISTRO} =~ (oneiric|precise|quantal|raring|saucy|7.0|wheezy|sid|testing|jessie|f16|f17|f18|f19|opensuse-12.2|rhel6) ]]; then
4a1f5a72
     echo "WARNING: this script has not been tested on $DISTRO"
c6c1d439
     if [[ "$FORCE" != "yes" ]]; then
07115eb5
         die $LINENO "If you wish to run this script anyway run with FORCE=yes"
c6c1d439
     fi
 fi
 
b0f1c38b
 # Make sure we only have one rpc backend enabled,
 # and the specified rpc backend is available on your platform.
 check_rpc_backend
4a221459
 
c6c1d439
 # Check to see if we are already running DevStack
cc6b4435
 # Note that this may fail if USE_SCREEN=False
15733351
 if type -p screen >/dev/null && screen -ls | egrep -q "[0-9].$SCREEN_NAME"; then
55458455
     echo "You are already running a stack.sh session."
     echo "To rejoin this session type 'screen -x stack'."
4a43b7bd
     echo "To destroy this session, type './unstack.sh'."
55458455
     exit 1
 fi
0a16145a
 
7903b795
 # Set up logging level
 VERBOSE=$(trueorfalse True $VERBOSE)
 
4a43b7bd
 
1a6d4492
 # Additional repos
 # ================
 
630be3b8
 # For debian/ubuntu make apt attempt to retry network ops on it's own
 if is_ubuntu; then
     echo 'APT::Acquire::Retries "20";' | sudo tee /etc/apt/apt.conf.d/80retry
 fi
 
1a6d4492
 # Some distros need to add repos beyond the defaults provided by the vendor
 # to pick up required packages.
 
 # The Debian Wheezy official repositories do not contain all required packages,
 # add gplhost repository.
 if [[ "$os_VENDOR" =~ (Debian) ]]; then
     echo 'deb http://archive.gplhost.com/debian grizzly main' | sudo tee /etc/apt/sources.list.d/gplhost_wheezy-backports.list
     echo 'deb http://archive.gplhost.com/debian grizzly-backports main' | sudo tee -a /etc/apt/sources.list.d/gplhost_wheezy-backports.list
     apt_get update
     apt_get install --force-yes gplhost-archive-keyring
 fi
 
 if [[ is_fedora && $DISTRO =~ (rhel6) ]]; then
     # Installing Open vSwitch on RHEL6 requires enabling the RDO repo.
dc0bd1a8
     RHEL6_RDO_REPO_RPM=${RHEL6_RDO_REPO_RPM:-"http://rdo.fedorapeople.org/openstack-havana/rdo-release-havana.rpm"}
     RHEL6_RDO_REPO_ID=${RHEL6_RDO_REPO_ID:-"openstack-havana"}
1a6d4492
     if ! yum repolist enabled $RHEL6_RDO_REPO_ID | grep -q $RHEL6_RDO_REPO_ID; then
         echo "RDO repo not detected; installing"
         yum_install $RHEL6_RDO_REPO_RPM || \
             die $LINENO "Error installing RDO repo, cannot continue"
     fi
 
     # RHEL6 requires EPEL for many Open Stack dependencies
     RHEL6_EPEL_RPM=${RHEL6_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"}
     if ! yum repolist enabled epel | grep -q 'epel'; then
         echo "EPEL not detected; installing"
         yum_install ${RHEL6_EPEL_RPM} || \
             die $LINENO "Error installing EPEL repo, cannot continue"
     fi
 fi
 
 
4a43b7bd
 # root Access
 # -----------
 
 # OpenStack is designed to be run as a non-root user; Horizon will fail to run
23f69d83
 # as **root** since Apache will not serve content from **root** user).
 # ``stack.sh`` must not be run as **root**.  It aborts and suggests one course of
 # action to create a suitable user account.
cbe98d56
 
d4622953
 if [[ $EUID -eq 0 ]]; then
0031df01
     echo "You are running this script as root."
23f69d83
     echo "Cut it out."
     echo "Really."
     echo "If you need an account to run DevStack, do this (as root, heh) to create $STACK_USER:"
     echo "$TOP_DIR/tools/create-stack-user.sh"
f9da5081
     exit 1
d4622953
 fi
 
23f69d83
 # We're not **root**, make sure ``sudo`` is available
 is_package_installed sudo || install_package sudo
 
 # UEC images ``/etc/sudoers`` does not have a ``#includedir``, add one
 sudo grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||
     echo "#includedir /etc/sudoers.d" | sudo tee -a /etc/sudoers
 
 # Set up devstack sudoers
 TEMPFILE=`mktemp`
 echo "$STACK_USER ALL=(root) NOPASSWD:ALL" >$TEMPFILE
 # Some binaries might be under /sbin or /usr/sbin, so make sure sudo will
 # see them by forcing PATH
 echo "Defaults:$STACK_USER secure_path=/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin" >> $TEMPFILE
 chmod 0440 $TEMPFILE
 sudo chown root:root $TEMPFILE
 sudo mv $TEMPFILE /etc/sudoers.d/50_stack_sh
 
 
e26232bc
 # Create the destination directory and ensure it is writable by the user
376b6316
 # and read/executable by everybody for daemons (e.g. apache run for horizon)
e26232bc
 sudo mkdir -p $DEST
e700267e
 safe_chown -R $STACK_USER $DEST
 safe_chmod 0755 $DEST
e26232bc
 
0488edda
 # a basic test for $DEST path permissions (fatal on error unless skipped)
 check_path_perm_sanity ${DEST}
 
4a43b7bd
 # Set ``OFFLINE`` to ``True`` to configure ``stack.sh`` to run cleanly without
 # Internet access. ``stack.sh`` must have been previously run with Internet
 # access to install prerequisites and fetch repositories.
25dab66b
 OFFLINE=`trueorfalse False $OFFLINE`
 
4a43b7bd
 # Set ``ERROR_ON_CLONE`` to ``True`` to configure ``stack.sh`` to exit if
 # the destination git repository does not exist during the ``git_clone``
 # operation.
94cb9600
 ERROR_ON_CLONE=`trueorfalse False $ERROR_ON_CLONE`
 
03997942
 # Whether to enable the debug log level in OpenStack services
 ENABLE_DEBUG_LOG_LEVEL=`trueorfalse True $ENABLE_DEBUG_LOG_LEVEL`
 
67787e6b
 # Destination path for service data
 DATA_DIR=${DATA_DIR:-${DEST}/data}
 sudo mkdir -p $DATA_DIR
e700267e
 safe_chown -R $STACK_USER $DATA_DIR
67787e6b
 
 
d81a0274
 # Common Configuration
 # ====================
 
 # Set fixed and floating range here so we can make sure not to use addresses
 # from either range when attempting to guess the IP to use for the host.
 # Note that setting FIXED_RANGE may be necessary when running DevStack
 # in an OpenStack cloud that uses either of these address ranges internally.
 FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.224/28}
 FIXED_RANGE=${FIXED_RANGE:-10.0.0.0/24}
 FIXED_NETWORK_SIZE=${FIXED_NETWORK_SIZE:-256}
 
c892bde6
 HOST_IP=$(get_default_host_ip $FIXED_RANGE $FLOATING_RANGE "$HOST_IP_IFACE" "$HOST_IP")
 if [ "$HOST_IP" == "" ]; then
     die $LINENO "Could not determine host ip address. Either localrc specified dhcp on ${HOST_IP_IFACE} or defaulted"
d81a0274
 fi
 
 # Allow the use of an alternate hostname (such as localhost/127.0.0.1) for service endpoints.
 SERVICE_HOST=${SERVICE_HOST:-$HOST_IP}
cc6b4435
 
 # Allow the use of an alternate protocol (such as https) for service endpoints
c83a7e12
 SERVICE_PROTOCOL=${SERVICE_PROTOCOL:-http}
d81a0274
 
 # Configure services to use syslog instead of writing to individual log files
 SYSLOG=`trueorfalse False $SYSLOG`
 SYSLOG_HOST=${SYSLOG_HOST:-$HOST_IP}
 SYSLOG_PORT=${SYSLOG_PORT:-516}
 
e3aaa96a
 # Enable sysstat logging
 SYSSTAT_FILE=${SYSSTAT_FILE:-"sysstat.dat"}
 SYSSTAT_INTERVAL=${SYSSTAT_INTERVAL:-"1"}
 
d81a0274
 # 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}
 
 
4a43b7bd
 # Configure Projects
 # ==================
67787e6b
 
1a6d4492
 # Source project function libraries
d98a5d0a
 source $TOP_DIR/lib/apache
c83a7e12
 source $TOP_DIR/lib/tls
0392a10a
 source $TOP_DIR/lib/infra
1b6b5318
 source $TOP_DIR/lib/oslo
b562e6a7
 source $TOP_DIR/lib/horizon
d81a0274
 source $TOP_DIR/lib/keystone
73f6f25b
 source $TOP_DIR/lib/glance
bf67c19c
 source $TOP_DIR/lib/nova
67787e6b
 source $TOP_DIR/lib/cinder
ece6a332
 source $TOP_DIR/lib/swift
93361643
 source $TOP_DIR/lib/ceilometer
bfdad75e
 source $TOP_DIR/lib/heat
b05c8769
 source $TOP_DIR/lib/neutron
f35cf91a
 source $TOP_DIR/lib/baremetal
f127e2f3
 source $TOP_DIR/lib/ldap
ce696b60
 source $TOP_DIR/lib/ironic
0cccad43
 source $TOP_DIR/lib/trove
67787e6b
 
cdf3d766
 # Extras Source
 # --------------
 
 # Phase: source
 if [[ -d $TOP_DIR/extras.d ]]; then
     for i in $TOP_DIR/extras.d/*.sh; do
         [[ -r $i ]] && source $i source
     done
 fi
 
1a6d4492
 # Set the destination directories for other OpenStack projects
9f61d29e
 OPENSTACKCLIENT_DIR=$DEST/python-openstackclient
b7490da9
 
 # Interactive Configuration
 # -------------------------
 
 # Do all interactive config up front before the logging spew begins
213c4168
 
7a549f40
 # Generic helper to configure passwords
 function read_password {
7903b795
     XTRACE=$(set +o | grep xtrace)
7a549f40
     set +o xtrace
     var=$1; msg=$2
     pw=${!var}
 
b4db2254
     localrc=$TOP_DIR/localrc
6015c82a
 
7a549f40
     # If the password is not defined yet, proceed to prompt user for a password.
     if [ ! $pw ]; then
         # If there is no localrc file, create one
b4db2254
         if [ ! -e $localrc ]; then
             touch $localrc
7a549f40
         fi
 
9b353671
         # Presumably if we got this far it can only be that our localrc is missing
7a549f40
         # the required password.  Prompt user for a password and write to localrc.
b4db2254
         echo ''
         echo '################################################################################'
         echo $msg
         echo '################################################################################'
4e6a2b71
         echo "This value will be written to your localrc file so you don't have to enter it "
         echo "again.  Use only alphanumeric characters."
b4db2254
         echo "If you leave this blank, a random default value will be used."
4e6a2b71
         pw=" "
         while true; do
             echo "Enter a password now:"
             read -e $var
             pw=${!var}
             [[ "$pw" = "`echo $pw | tr -cd [:alnum:]`" ]] && break
             echo "Invalid chars in password.  Try again:"
         done
b4db2254
         if [ ! $pw ]; then
             pw=`openssl rand -hex 10`
7a549f40
         fi
b4db2254
         eval "$var=$pw"
         echo "$var=$pw" >> $localrc
7a549f40
     fi
7903b795
     $XTRACE
7a549f40
 }
 
13dc5ccd
 
b9182d65
 # Database Configuration
 
afc29fe5
 # To select between database backends, add the following to ``localrc``:
428af5a2
 #
afc29fe5
 #    disable_service mysql
 #    enable_service postgresql
428af5a2
 #
afc29fe5
 # The available database backends are listed in ``DATABASE_BACKENDS`` after
 # ``lib/database`` is sourced. ``mysql`` is the default.
782b9917
 
428af5a2
 initialize_database_backends && echo "Using $DATABASE_TYPE database backend" || echo "No database enabled"
782b9917
 
b9182d65
 
b7490da9
 # Queue Configuration
a841644e
 
 # Rabbit connection info
4a221459
 if is_service_enabled rabbit; then
     RABBIT_HOST=${RABBIT_HOST:-localhost}
     read_password RABBIT_PASSWORD "ENTER A PASSWORD TO USE FOR RABBIT."
 fi
ba23cc73
 
7d28a0e1
 
782b9917
 # Keystone
 
b7490da9
 if is_service_enabled key; then
     # The ``SERVICE_TOKEN`` is used to bootstrap the Keystone database.  It is
     # just a string and is not a 'real' Keystone token.
     read_password SERVICE_TOKEN "ENTER A SERVICE_TOKEN TO USE FOR THE SERVICE ADMIN TOKEN."
     # Services authenticate to Identity with servicename/``SERVICE_PASSWORD``
     read_password SERVICE_PASSWORD "ENTER A SERVICE_PASSWORD TO USE FOR THE SERVICE AUTHENTICATION."
     # Horizon currently truncates usernames and passwords at 20 characters
     read_password ADMIN_PASSWORD "ENTER A PASSWORD TO USE FOR HORIZON AND KEYSTONE (20 CHARS OR LESS)."
 
     # Keystone can now optionally install OpenLDAP by enabling the ``ldap``
     # service in ``localrc`` (e.g. ``enable_service ldap``).
     # To clean out the Keystone contents in OpenLDAP set ``KEYSTONE_CLEAR_LDAP``
     # to ``yes`` (e.g. ``KEYSTONE_CLEAR_LDAP=yes``) in ``localrc``.  To enable the
     # Keystone Identity Driver (``keystone.identity.backends.ldap.Identity``)
     # set ``KEYSTONE_IDENTITY_BACKEND`` to ``ldap`` (e.g.
     # ``KEYSTONE_IDENTITY_BACKEND=ldap``) in ``localrc``.
 
     # only request ldap password if the service is enabled
     if is_service_enabled ldap; then
         read_password LDAP_PASSWORD "ENTER A PASSWORD TO USE FOR LDAP"
     fi
 fi
f127e2f3
 
 
b7490da9
 # Swift
b96871e4
 
b7490da9
 if is_service_enabled s-proxy; then
     # We only ask for Swift Hash if we have enabled swift service.
     # ``SWIFT_HASH`` is a random unique string for a swift cluster that
     # can never change.
     read_password SWIFT_HASH "ENTER A RANDOM SWIFT HASH."
 fi
b3288381
 
6577b468
 
b7490da9
 # Configure logging
 # -----------------
471de7a3
 
7879a3ce
 # Draw a spinner so the user knows something is happening
b9182d65
 function spinner() {
7879a3ce
     local delay=0.75
b9182d65
     local spinstr='/-\|'
7879a3ce
     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
 }
 
7903b795
 # Echo text to the log file, summary log file and stdout
 # echo_summary "something to say"
 function echo_summary() {
7879a3ce
     if [[ -t 3 && "$VERBOSE" != "True" ]]; then
         kill >/dev/null 2>&1 $LAST_SPINNER_PID
         if [ ! -z "$LAST_SPINNER_PID" ]; then
             printf "\b\b\bdone\n" >&3
         fi
afc29fe5
         echo -n -e $@ >&6
7879a3ce
         spinner &
         LAST_SPINNER_PID=$!
     else
afc29fe5
         echo -e $@ >&6
7879a3ce
     fi
7903b795
 }
 
 # Echo text only to stdout, no log files
 # echo_nolog "something not for the logs"
 function echo_nolog() {
     echo $@ >&3
 }
 
4a43b7bd
 # 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
33cb4303
 TIMESTAMP_FORMAT=${TIMESTAMP_FORMAT:-"%F-%H%M%S"}
d966ed23
 if [[ -n "$LOGFILE" || -n "$SCREEN_LOGDIR" ]]; then
     LOGDAYS=${LOGDAYS:-7}
     CURRENT_LOG_TIME=$(date "+$TIMESTAMP_FORMAT")
 fi
 
471de7a3
 if [[ -n "$LOGFILE" ]]; then
4a43b7bd
     # First clean up old log files.  Use the user-specified ``LOGFILE``
471de7a3
     # as the template to search for, appending '.*' to match the date
     # we added on earlier runs.
     LOGDIR=$(dirname "$LOGFILE")
406019a7
     LOGFILENAME=$(basename "$LOGFILE")
fff6fec4
     mkdir -p $LOGDIR
406019a7
     find $LOGDIR -maxdepth 1 -name $LOGFILENAME.\* -mtime +$LOGDAYS -exec rm {} \;
d966ed23
     LOGFILE=$LOGFILE.${CURRENT_LOG_TIME}
7903b795
     SUMFILE=$LOGFILE.${CURRENT_LOG_TIME}.summary
 
     # Redirect output according to config
b9182d65
 
7903b795
     # Copy stdout to fd 3
     exec 3>&1
     if [[ "$VERBOSE" == "True" ]]; then
58608a1d
         # Set fd 1 and 2 to write the log file
b4f7a5e6
         exec 1> >( $TOP_DIR/tools/outfilter.py -v -o "${LOGFILE}" ) 2>&1
58608a1d
         # Set fd 6 to summary log file
b4f7a5e6
         exec 6> >( $TOP_DIR/tools/outfilter.py -o "${SUMFILE}" )
7903b795
     else
         # Set fd 1 and 2 to primary logfile
b4f7a5e6
         exec 1> >( $TOP_DIR/tools/outfilter.py -o "${LOGFILE}" ) 2>&1
7903b795
         # Set fd 6 to summary logfile and stdout
b4f7a5e6
         exec 6> >( $TOP_DIR/tools/outfilter.py -v -o "${SUMFILE}" >&3 )
7903b795
     fi
 
     echo_summary "stack.sh log $LOGFILE"
471de7a3
     # Specified logfile name always links to the most recent log
406019a7
     ln -sf $LOGFILE $LOGDIR/$LOGFILENAME
     ln -sf $SUMFILE $LOGDIR/$LOGFILENAME.summary
7903b795
 else
     # Set up output redirection without log files
     # Copy stdout to fd 3
     exec 3>&1
efdf3ffc
     if [[ "$VERBOSE" != "True" ]]; then
7903b795
         # Throw away stdout and stderr
         exec 1>/dev/null 2>&1
     fi
     # Always send summary fd to original stdout
b4f7a5e6
     exec 6> >( $TOP_DIR/tools/outfilter.py -v >&3 )
471de7a3
 fi
 
d966ed23
 # Set up logging of screen windows
4a43b7bd
 # 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``.
d966ed23
 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
 
4a43b7bd
 
 # Set Up Script Execution
 # -----------------------
 
7879a3ce
 # Kill background processes on exit
 trap clean EXIT
 clean() {
     local r=$?
     kill >/dev/null 2>&1 $(jobs -p)
     exit $r
 }
 
 
4a43b7bd
 # Exit on any errors so that errors don't compound
f9da5081
 trap failed ERR
 failed() {
     local r=$?
7879a3ce
     kill >/dev/null 2>&1 $(jobs -p)
f9da5081
     set +o xtrace
     [ -n "$LOGFILE" ] && echo "${0##*/} failed: full log in $LOGFILE"
     exit $r
 }
 
 # 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
 
1a6d4492
 
30f68e96
 # Install Packages
d74257d0
 # ================
7d28a0e1
 
4a43b7bd
 # OpenStack uses a fair number of other projects.
30f68e96
 
7d28a0e1
 # Install package requirements
48352ee7
 # Source it so the entire environment is available
7903b795
 echo_summary "Installing package prerequisites"
48352ee7
 source $TOP_DIR/tools/install_prereqs.sh
47f02060
 
62d1d698
 # Configure an appropriate python environment
 $TOP_DIR/tools/install_pip.sh
1a6d4492
 
9acc12a3
 # Do the ugly hacks for borken packages and distros
 $TOP_DIR/tools/fixup_stuff.sh
 
62d1d698
 install_rpc_backend
 
 if is_service_enabled $DATABASE_BACKENDS; then
     install_database
 fi
 
 if is_service_enabled neutron; then
     install_neutron_agent_packages
 fi
 
47f02060
 TRACK_DEPENDS=${TRACK_DEPENDS:-False}
 
 # Install python packages into a virtualenv so that we can track them
cc6b4435
 if [[ $TRACK_DEPENDS = True ]]; then
7903b795
     echo_summary "Installing Python packages into a virtualenv $DEST/.venv"
6c844630
     pip_install -U virtualenv
47f02060
 
     rm -rf $DEST/.venv
     virtualenv --system-site-packages $DEST/.venv
     source $DEST/.venv/bin/activate
     $DEST/.venv/bin/pip freeze > $DEST/requires-pre-pip
 fi
 
fe51a900
 # Check Out and Install Source
 # ----------------------------
4a43b7bd
 
7903b795
 echo_summary "Installing OpenStack project source"
 
0392a10a
 # Install required infra support libraries
 install_infra
5e159496
 
1b6b5318
 # Install oslo libraries that have graduated
 install_oslo
 
fe51a900
 # Install clients libraries
d81a0274
 install_keystoneclient
73f6f25b
 install_glanceclient
253a1a35
 install_cinderclient
bf67c19c
 install_novaclient
75195b58
 if is_service_enabled swift glance horizon; then
fe51a900
     install_swiftclient
 fi
75195b58
 if is_service_enabled neutron nova horizon; then
b05c8769
     install_neutronclient
fe51a900
 fi
75195b58
 if is_service_enabled heat horizon; then
     install_heatclient
 fi
fe51a900
 
9f61d29e
 git_clone $OPENSTACKCLIENT_REPO $OPENSTACKCLIENT_DIR $OPENSTACKCLIENT_BRANCH
253a1a35
 setup_develop $OPENSTACKCLIENT_DIR
9f61d29e
 
fe51a900
 if is_service_enabled key; then
d81a0274
     install_keystone
fe51a900
     configure_keystone
38df1228
 fi
ece6a332
 
0c3a5584
 if is_service_enabled s-proxy; then
ece6a332
     install_swift
fe51a900
     configure_swift
 
9d2647a9
     # swift3 middleware to provide S3 emulation to Swift
6ae9ea59
     if is_service_enabled swift3; then
9d2647a9
         # replace the nova-objectstore port by the swift port
         S3_SERVICE_PORT=8080
6ae9ea59
         git_clone $SWIFT3_REPO $SWIFT3_DIR $SWIFT3_BRANCH
fe51a900
         setup_develop $SWIFT3_DIR
6ae9ea59
     fi
e7ce24fc
 fi
ece6a332
 
a6651e94
 if is_service_enabled g-api n-api; then
e7ce24fc
     # image catalog service
73f6f25b
     install_glance
fe51a900
     configure_glance
e7ce24fc
 fi
fe51a900
 
 if is_service_enabled cinder; then
     install_cinder
     configure_cinder
 fi
 
b05c8769
 if is_service_enabled neutron; then
     install_neutron
     install_neutron_third_party
fe51a900
 fi
 
bf67c19c
 if is_service_enabled nova; then
     # compute service
     install_nova
fe51a900
     cleanup_nova
     configure_nova
bf67c19c
 fi
fe51a900
 
a6651e94
 if is_service_enabled n-novnc; then
e7ce24fc
     # a websockets/html5 or flash powered VNC console for vm instances
     git_clone $NOVNC_REPO $NOVNC_DIR $NOVNC_BRANCH
 fi
fe51a900
 
d10e12f1
 if is_service_enabled n-spice; then
     # a websockets/html5 or flash powered SPICE console for vm instances
     git_clone $SPICE_REPO $SPICE_DIR $SPICE_BRANCH
 fi
fe51a900
 
a6651e94
 if is_service_enabled horizon; then
a88be173
     # django openstack_auth
     install_django_openstack_auth
b562e6a7
     # dashboard
     install_horizon
fe51a900
     configure_horizon
e7ce24fc
 fi
fe51a900
 
93361643
 if is_service_enabled ceilometer; then
e583d9b8
     install_ceilometerclient
93361643
     install_ceilometer
12bb53b6
     echo_summary "Configuring Ceilometer"
     configure_ceilometer
     configure_ceilometerclient
93361643
 fi
4a43b7bd
 
bfdad75e
 if is_service_enabled heat; then
d644e23c
     install_heat
c3249083
     cleanup_heat
bfdad75e
     configure_heat
 fi
b7490da9
 
0cccad43
 if is_service_enabled trove; then
     install_trove
     install_troveclient
     cleanup_trove
 fi
 
fe51a900
 if is_service_enabled tls-proxy; then
     configure_CA
     init_CA
     init_cert
     # Add name to /etc/hosts
     # don't be naive and add to existing line!
67787e6b
 fi
75a37653
 
ce696b60
 if is_service_enabled ir-api ir-cond; then
     install_ironic
     configure_ironic
 fi
 
cdf3d766
 # Extras Install
 # --------------
 
 # Phase: install
 if [[ -d $TOP_DIR/extras.d ]]; then
     for i in $TOP_DIR/extras.d/*.sh; do
         [[ -r $i ]] && source $i stack install
     done
 fi
 
cc6b4435
 if [[ $TRACK_DEPENDS = True ]]; then
47f02060
     $DEST/.venv/bin/pip freeze > $DEST/requires-post-pip
cc6b4435
     if ! diff -Nru $DEST/requires-pre-pip $DEST/requires-post-pip > $DEST/requires.diff; then
47f02060
         cat $DEST/requires.diff
     fi
     echo "Ran stack.sh in depend tracking mode, bailing out now"
     exit 0
 fi
df0972c1
 
b7490da9
 
ff603ef5
 # Syslog
df0972c1
 # ------
ff603ef5
 
 if [[ $SYSLOG != "False" ]]; then
     if [[ "$SYSLOG_HOST" = "$HOST_IP" ]]; then
         # Configure the master host to receive
         cat <<EOF >/tmp/90-stack-m.conf
 \$ModLoad imrelp
 \$InputRELPServerRun $SYSLOG_PORT
 EOF
         sudo mv /tmp/90-stack-m.conf /etc/rsyslog.d
     else
         # Set rsyslog to send to remote host
         cat <<EOF >/tmp/90-stack-s.conf
 *.*		:omrelp:$SYSLOG_HOST:$SYSLOG_PORT
 EOF
         sudo mv /tmp/90-stack-s.conf /etc/rsyslog.d
     fi
e4859f0b
 
     RSYSLOGCONF="/etc/rsyslog.conf"
     if [ -f $RSYSLOGCONF ]; then
         sudo cp -b $RSYSLOGCONF $RSYSLOGCONF.bak
         if [[ $(grep '$SystemLogRateLimitBurst' $RSYSLOGCONF)  ]]; then
             sudo sed -i 's/$SystemLogRateLimitBurst\ .*/$SystemLogRateLimitBurst\ 0/' $RSYSLOGCONF
         else
             sudo sed -i '$ i $SystemLogRateLimitBurst\ 0' $RSYSLOGCONF
         fi
         if [[ $(grep '$SystemLogRateLimitInterval' $RSYSLOGCONF)  ]]; then
             sudo sed -i 's/$SystemLogRateLimitInterval\ .*/$SystemLogRateLimitInterval\ 0/' $RSYSLOGCONF
         else
             sudo sed -i '$ i $SystemLogRateLimitInterval\ 0' $RSYSLOGCONF
         fi
     fi
 
7903b795
     echo_summary "Starting rsyslog"
13dc5ccd
     restart_service rsyslog
ff603ef5
 fi
 
df0972c1
 
e5d92380
 # Finalize queue installation
 # ----------------------------
b0f1c38b
 restart_rpc_backend
ba23cc73
 
df0972c1
 
428af5a2
 # Configure database
 # ------------------
b9182d65
 
428af5a2
 if is_service_enabled $DATABASE_BACKENDS; then
     configure_database
24859060
 fi
 
b9182d65
 
 # Configure screen
 # ----------------
 
681f3fdd
 USE_SCREEN=$(trueorfalse True $USE_SCREEN)
 if [[ "$USE_SCREEN" == "True" ]]; then
     # Create a new named screen to run processes in
     screen -d -m -S $SCREEN_NAME -t shell -s /bin/bash
     sleep 1
 
     # Set a reasonable status bar
     if [ -z "$SCREEN_HARDSTATUS" ]; then
         SCREEN_HARDSTATUS='%{= .} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
     fi
     screen -r $SCREEN_NAME -X hardstatus alwayslastline "$SCREEN_HARDSTATUS"
30396576
     screen -r $SCREEN_NAME -X setenv PROMPT_COMMAND /bin/true
0a7a41eb
 fi
 
61bb2c1b
 # Clear screen rc file
 SCREENRC=$TOP_DIR/$SCREEN_NAME-screenrc
 if [[ -e $SCREENRC ]]; then
8e58c073
     rm -f $SCREENRC
61bb2c1b
 fi
b9182d65
 
a9414249
 # Initialize the directory for service status check
 init_service_check
7d28a0e1
 
cc6b4435
 
1a6d4492
 # Sysstat
 # -------
 
 # If enabled, systat has to start early to track OpenStack service startup.
921f2dab
 if is_service_enabled sysstat;then
     if [[ -n ${SCREEN_LOGDIR} ]]; then
         screen_it sysstat "sar -o $SCREEN_LOGDIR/$SYSSTAT_FILE $SYSSTAT_INTERVAL"
     else
         screen_it sysstat "sar $SYSSTAT_INTERVAL"
     fi
 fi
 
cc6b4435
 
893e6636
 # Start Services
 # ==============
 
d81a0274
 # Keystone
 # --------
 
 if is_service_enabled key; then
7903b795
     echo_summary "Starting Keystone"
d81a0274
     init_keystone
     start_keystone
 
d835de89
     # Set up a temporary admin URI for Keystone
c83a7e12
     SERVICE_ENDPOINT=$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_AUTH_HOST:$KEYSTONE_AUTH_PORT/v2.0
 
     if is_service_enabled tls-proxy; then
         export OS_CACERT=$INT_CA_DIR/ca-chain.pem
         # Until the client support is fixed, just use the internal endpoint
         SERVICE_ENDPOINT=http://$KEYSTONE_AUTH_HOST:$KEYSTONE_AUTH_PORT_INT/v2.0
     fi
d81a0274
 
d835de89
     # Do the keystone-specific bits from keystone_data.sh
     export OS_SERVICE_TOKEN=$SERVICE_TOKEN
     export OS_SERVICE_ENDPOINT=$SERVICE_ENDPOINT
     create_keystone_accounts
a0dce264
     create_nova_accounts
671c16e6
     create_cinder_accounts
b05c8769
     create_neutron_accounts
d835de89
 
0cccad43
     if is_service_enabled trove; then
         create_trove_accounts
     fi
 
0ff314c0
     if is_service_enabled swift || is_service_enabled s-proxy; then
         create_swift_accounts
     fi
 
d835de89
     # ``keystone_data.sh`` creates services, admin and demo users, and roles.
d81a0274
     ADMIN_PASSWORD=$ADMIN_PASSWORD SERVICE_TENANT_NAME=$SERVICE_TENANT_NAME SERVICE_PASSWORD=$SERVICE_PASSWORD \
     SERVICE_TOKEN=$SERVICE_TOKEN SERVICE_ENDPOINT=$SERVICE_ENDPOINT SERVICE_HOST=$SERVICE_HOST \
     S3_SERVICE_PORT=$S3_SERVICE_PORT KEYSTONE_CATALOG_BACKEND=$KEYSTONE_CATALOG_BACKEND \
e2790210
     DEVSTACK_DIR=$TOP_DIR ENABLED_SERVICES=$ENABLED_SERVICES HEAT_API_CFN_PORT=$HEAT_API_CFN_PORT \
bb421bed
     HEAT_API_PORT=$HEAT_API_PORT \
d81a0274
         bash -x $FILES/keystone_data.sh
 
     # Set up auth creds now that keystone is bootstrapped
     export OS_AUTH_URL=$SERVICE_ENDPOINT
     export OS_TENANT_NAME=admin
     export OS_USERNAME=admin
     export OS_PASSWORD=$ADMIN_PASSWORD
d835de89
     unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT
d81a0274
 fi
 
 
ca85b799
 # Horizon
df0972c1
 # -------
cbe98d56
 
7d28a0e1
 # Set up the django horizon application to serve via apache/wsgi
75a37653
 
a6651e94
 if is_service_enabled horizon; then
7903b795
     echo_summary "Configuring and starting Horizon"
b562e6a7
     init_horizon
     start_horizon
70dc5e05
 fi
1c1d1505
 
18d350da
 
d74257d0
 # Glance
 # ------
 
a6651e94
 if is_service_enabled g-reg; then
7903b795
     echo_summary "Configuring Glance"
73f6f25b
     init_glance
70dc5e05
 fi
75a37653
 
8c032d16
 
ce696b60
 # Ironic
 # ------
 
 if is_service_enabled ir-api ir-cond; then
     echo_summary "Configuring Ironic"
     init_ironic
 fi
 
 
b05c8769
 # Neutron
60df29a2
 # -------
7d28a0e1
 
b05c8769
 if is_service_enabled neutron; then
     echo_summary "Configuring Neutron"
b9182d65
 
b05c8769
     configure_neutron
dd64988f
     # Run init_neutron only on the node hosting the neutron API server
     if is_service_enabled $DATABASE_BACKENDS && is_service_enabled q-svc; then
         init_neutron
     fi
60df29a2
 fi
 
b05c8769
 # Some Neutron plugins require network controllers which are not
66afb47c
 # a part of the OpenStack project. Configure and start them.
b05c8769
 if is_service_enabled neutron; then
     configure_neutron_third_party
     init_neutron_third_party
     start_neutron_third_party
396a014b
 fi
 
b9182d65
 
d74257d0
 # Nova
 # ----
bd13b708
 
6f85ab35
 if is_service_enabled n-net q-dhcp; then
55458455
     # Delete traces of nova networks from prior runs
d71d6e71
     # Do not kill any dnsmasq instance spawned by NetworkManager
     netman_pid=$(pidof NetworkManager || true)
     if [ -z "$netman_pid" ]; then
         sudo killall dnsmasq || true
     else
         sudo ps h -o pid,ppid -C dnsmasq | grep -v $netman_pid | awk '{print $1}' | sudo xargs kill || true
     fi
 
55458455
     clean_iptables
f35cf91a
     rm -rf ${NOVA_STATE_PATH}/networks
     sudo mkdir -p ${NOVA_STATE_PATH}/networks
e700267e
     safe_chown -R ${USER} ${NOVA_STATE_PATH}/networks
1a6d4492
     # Force IP forwarding on, just in case
0b31e867
     sudo sysctl -w net.ipv4.ip_forward=1
70dc5e05
 fi
 
7d28a0e1
 
28fa4e8d
 # Storage Service
7d28a0e1
 # ---------------
 
0c3a5584
 if is_service_enabled s-proxy; then
7903b795
     echo_summary "Configuring Swift"
ece6a332
     init_swift
28fa4e8d
 fi
 
df0972c1
 
acff87a2
 # Volume Service
 # --------------
 
67787e6b
 if is_service_enabled cinder; then
7903b795
     echo_summary "Configuring Cinder"
67787e6b
     init_cinder
acff87a2
 fi
 
2aa2a89c
 
 # Compute Service
 # ---------------
 
bf67c19c
 if is_service_enabled nova; then
     echo_summary "Configuring Nova"
     init_nova
0007f3a6
 
86a79694
     # Additional Nova configuration that is dependent on other services
b05c8769
     if is_service_enabled neutron; then
         create_nova_conf_neutron
86a79694
     elif is_service_enabled n-net; then
66afb47c
         create_nova_conf_nova_network
1bfa3d53
     fi
fb2a3ae3
 
     init_nova_cells
b62b4ca2
 fi
 
f35cf91a
 # Extra things to prepare nova for baremetal, before nova starts
 if is_service_enabled nova && is_baremetal; then
     echo_summary "Preparing for nova baremetal"
     prepare_baremetal_toolchain
     configure_baremetal_nova_dirs
7611c894
     if [[ "$BM_USE_FAKE_ENV" = "True" ]]; then
15f4b7ab
         create_fake_baremetal_env
7611c894
     fi
f35cf91a
 fi
df0972c1
 
b7490da9
 
cdf3d766
 # Extras Configuration
 # ====================
 
 # Phase: post-config
 if [[ -d $TOP_DIR/extras.d ]]; then
     for i in $TOP_DIR/extras.d/*.sh; do
         [[ -r $i ]] && source $i stack post-config
     done
 fi
 
 
893e6636
 # Local Configuration
 # ===================
 
 # Apply configuration from local.conf if it exists for layer 2 services
 # Phase: post-config
 merge_config_group $TOP_DIR/local.conf post-config
 
 
d74257d0
 # Launch Services
 # ===============
30f68e96
 
dfcd2003
 # Only run the services specified in ``ENABLED_SERVICES``
 
ece6a332
 # Launch Swift Services
0c3a5584
 if is_service_enabled s-proxy; then
ece6a332
     echo_summary "Starting Swift"
     start_swift
 fi
 
73f6f25b
 # Launch the Glance services
 if is_service_enabled g-api g-reg; then
7903b795
     echo_summary "Starting Glance"
73f6f25b
     start_glance
d000b22d
 fi
 
ce696b60
 # Launch the Ironic services
 if is_service_enabled ir-api ir-cond; then
     echo_summary "Starting Ironic"
     start_ironic
 fi
 
d81a0274
 # Create an access key and secret key for nova ec2 register image
 if is_service_enabled key && is_service_enabled swift3 && is_service_enabled nova; then
     NOVA_USER_ID=$(keystone user-list | grep ' nova ' | get_field 1)
     NOVA_TENANT_ID=$(keystone tenant-list | grep " $SERVICE_TENANT_NAME " | get_field 1)
     CREDS=$(keystone ec2-credentials-create --user_id $NOVA_USER_ID --tenant_id $NOVA_TENANT_ID)
     ACCESS_KEY=$(echo "$CREDS" | awk '/ access / { print $4 }')
     SECRET_KEY=$(echo "$CREDS" | awk '/ secret / { print $4 }')
9bc47db2
     iniset $NOVA_CONF DEFAULT s3_access_key "$ACCESS_KEY"
     iniset $NOVA_CONF DEFAULT s3_secret_key "$SECRET_KEY"
     iniset $NOVA_CONF DEFAULT s3_affix_tenant "True"
d000b22d
 fi
 
1946b0e9
 # Create a randomized default value for the keymgr's fixed_key
 if is_service_enabled nova; then
     FIXED_KEY=$(cat /dev/urandom | tr -cd 'A-F0-9' | head -c 64)
     iniset $NOVA_CONF keymgr fixed_key "$FIXED_KEY"
 fi
 
e542883c
 if is_service_enabled zeromq; then
     echo_summary "Starting zermomq receiver"
     screen_it zeromq "cd $NOVA_DIR && $NOVA_BIN_DIR/nova-rpc-zmq-receiver"
 fi
3bae7c2c
 
7d28a0e1
 # Launch the nova-api and wait for it to answer before continuing
a6651e94
 if is_service_enabled n-api; then
7903b795
     echo_summary "Starting Nova API"
3a3a2bac
     start_nova_api
d000b22d
 fi
1bfa3d53
 
37dda8d7
 if is_service_enabled q-svc; then
b05c8769
     echo_summary "Starting Neutron"
     start_neutron_service_and_check
8ec719b4
 elif is_service_enabled $DATABASE_BACKENDS && is_service_enabled n-net; then
fb2a3ae3
     NM_CONF=${NOVA_CONF}
     if is_service_enabled n-cell; then
         NM_CONF=${NOVA_CELLS_CONF}
     fi
 
37dda8d7
     # Create a small network
fb2a3ae3
     $NOVA_BIN_DIR/nova-manage --config-file $NM_CONF network create "$PRIVATE_NETWORK_NAME" $FIXED_RANGE 1 $FIXED_NETWORK_SIZE $NETWORK_CREATE_ARGS
37dda8d7
 
     # Create some floating ips
fb2a3ae3
     $NOVA_BIN_DIR/nova-manage --config-file $NM_CONF floating create $FLOATING_RANGE --pool=$PUBLIC_NETWORK_NAME
37dda8d7
 
     # Create a second pool
fb2a3ae3
     $NOVA_BIN_DIR/nova-manage --config-file $NM_CONF floating create --ip_range=$TEST_FLOATING_RANGE --pool=$TEST_FLOATING_POOL
1bfa3d53
 fi
 
b05c8769
 if is_service_enabled neutron; then
     start_neutron_agents
66afb47c
 fi
b921bb38
 # Once neutron agents are started setup initial network elements
 if is_service_enabled q-svc; then
     echo_summary "Creating initial neutron network elements"
     create_neutron_initial_network
     setup_neutron_debug
 fi
bf67c19c
 if is_service_enabled nova; then
     echo_summary "Starting Nova"
     start_nova
 fi
67787e6b
 if is_service_enabled cinder; then
7903b795
     echo_summary "Starting Cinder"
67787e6b
     start_cinder
 fi
93361643
 if is_service_enabled ceilometer; then
c5259b4a
     echo_summary "Starting Ceilometer"
8c54849d
     init_ceilometer
93361643
     start_ceilometer
 fi
b562e6a7
 
bad9d89f
 # Configure and launch heat engine, api and metadata
bfdad75e
 if is_service_enabled heat; then
bad9d89f
     # Initialize heat, including replacing nova flavors
     echo_summary "Configuring Heat"
     init_heat
7903b795
     echo_summary "Starting Heat"
bfdad75e
     start_heat
 fi
7d28a0e1
 
0cccad43
 # Configure and launch the trove service api, and taskmanager
 if is_service_enabled trove; then
     # Initialize trove
     echo_summary "Configuring Trove"
     configure_troveclient
     configure_trove
     init_trove
 
     # Start the trove API and trove taskmgr components
     echo_summary "Starting Trove"
     start_trove
 fi
b7490da9
 
22ef5731
 # Create account rc files
 # =======================
 
 # Creates source able script files for easier user switching.
 # This step also creates certificates for tenants and users,
 # which is helpful in image bundle steps.
 
 if is_service_enabled nova && is_service_enabled key; then
     $TOP_DIR/tools/create_userrc.sh -PA --target-dir $TOP_DIR/accrc
 fi
 
4a43b7bd
 
d74257d0
 # Install Images
 # ==============
e49b8bd6
 
0ab1d46e
 # Upload an image to glance.
5372f433
 #
4a43b7bd
 # The default image is cirros, a small testing image which lets you login as **root**
cde655ac
 # cirros has a ``cloud-init`` analog supporting login via keypair and sending
 # scripts as userdata.
 # See https://help.ubuntu.com/community/CloudInit for more on cloud-init
0ab1d46e
 #
4a43b7bd
 # Override ``IMAGE_URLS`` with a comma-separated list of UEC images.
aab7eae0
 #  * **oneiric**: http://uec-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64.tar.gz
ca0e3d02
 #  * **precise**: http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64.tar.gz
08e8b745
 
a6651e94
 if is_service_enabled g-reg; then
bc071bce
     TOKEN=$(keystone token-get | grep ' id ' | get_field 2)
747ee33e
 
f35cf91a
     if is_baremetal; then
15f4b7ab
         echo_summary "Creating and uploading baremetal images"
b62b4ca2
 
15f4b7ab
         # build and upload separate deploy kernel & ramdisk
         upload_baremetal_deploy $TOKEN
f35cf91a
 
15f4b7ab
         # upload images, separating out the kernel & ramdisk for PXE boot
         for image_url in ${IMAGE_URLS//,/ }; do
             upload_baremetal_image $image_url $TOKEN
         done
f35cf91a
     else
15f4b7ab
         echo_summary "Uploading images"
f35cf91a
 
15f4b7ab
         # Option to upload legacy ami-tty, which works with xenserver
         if [[ -n "$UPLOAD_LEGACY_TTY" ]]; then
             IMAGE_URLS="${IMAGE_URLS:+${IMAGE_URLS},}https://github.com/downloads/citrix-openstack/warehouse/tty.tgz"
         fi
f35cf91a
 
15f4b7ab
         for image_url in ${IMAGE_URLS//,/ }; do
             upload_image $image_url $TOKEN
         done
f35cf91a
     fi
70dc5e05
 fi
24859060
 
f35cf91a
 # If we are running nova with baremetal driver, there are a few
 # last-mile configuration bits to attend to, which must happen
 # after n-api and n-sch have started.
 # Also, creating the baremetal flavor must happen after images
 # are loaded into glance, though just knowing the IDs is sufficient here
 if is_service_enabled nova && is_baremetal; then
     # create special flavor for baremetal if we know what images to associate
     [[ -n "$BM_DEPLOY_KERNEL_ID" ]] && [[ -n "$BM_DEPLOY_RAMDISK_ID" ]] && \
15f4b7ab
         create_baremetal_flavor $BM_DEPLOY_KERNEL_ID $BM_DEPLOY_RAMDISK_ID
f35cf91a
 
     # otherwise user can manually add it later by calling nova-baremetal-manage
     [[ -n "$BM_FIRST_MAC" ]] && add_baremetal_node
 
bbf06459
     if [[ "$BM_DNSMASQ_FROM_NOVA_NETWORK" = "False" ]]; then
         # NOTE: we do this here to ensure that our copy of dnsmasq is running
         sudo pkill dnsmasq || true
         sudo dnsmasq --conf-file= --port=0 --enable-tftp --tftp-root=/tftpboot \
             --dhcp-boot=pxelinux.0 --bind-interfaces --pid-file=/var/run/dnsmasq.pid \
             --interface=$BM_DNSMASQ_IFACE --dhcp-range=$BM_DNSMASQ_RANGE \
             ${BM_DNSMASQ_DNS:+--dhcp-option=option:dns-server,$BM_DNSMASQ_DNS}
     fi
f35cf91a
     # ensure callback daemon is running
     sudo pkill nova-baremetal-deploy-helper || true
     screen_it baremetal "nova-baremetal-deploy-helper"
 fi
df0972c1
 
33cb4303
 # Save some values we generated for later use
 CURRENT_RUN_TIME=$(date "+$TIMESTAMP_FORMAT")
 echo "# $CURRENT_RUN_TIME" >$TOP_DIR/.stackenv
 for i in BASE_SQL_CONN ENABLED_SERVICES HOST_IP LOGFILE \
15f4b7ab
     SERVICE_HOST SERVICE_PROTOCOL STACK_USER TLS_IP; do
33cb4303
     echo $i=${!i} >>$TOP_DIR/.stackenv
 done
 
ec086512
 
893e6636
 # Local Configuration
 # ===================
 
 # Apply configuration from local.conf if it exists for layer 2 services
 # Phase: extra
 merge_config_group $TOP_DIR/local.conf extra
 
 
768295e9
 # Run extras
 # ==========
 
cdf3d766
 # Phase: extra
768295e9
 if [[ -d $TOP_DIR/extras.d ]]; then
     for i in $TOP_DIR/extras.d/*.sh; do
cdf3d766
         [[ -r $i ]] && source $i stack extra
768295e9
     done
 fi
 
 
f5633ddb
 # Run local script
 # ================
 
 # Run ``local.sh`` if it exists to perform user-managed tasks
 if [[ -x $TOP_DIR/local.sh ]]; then
     echo "Running user script $TOP_DIR/local.sh"
     $TOP_DIR/local.sh
 fi
 
a9414249
 # Check the status of running services
 service_check
f5633ddb
 
b7490da9
 
b94f4bf3
 # Fin
 # ===
 
471de7a3
 set +o xtrace
b94f4bf3
 
7903b795
 if [[ -n "$LOGFILE" ]]; then
     exec 1>&3
     # Force all output to stdout and logs now
baa8b42a
     exec 1> >( tee -a "${LOGFILE}" ) 2>&1
7903b795
 else
     # Force all output to stdout now
     exec 1>&3
 fi
 
df0972c1
 
24859060
 # Using the cloud
4a43b7bd
 # ---------------
24859060
 
e19d8847
 echo ""
 echo ""
 echo ""
 
df0972c1
 # If you installed Horizon on this server you should be able
40a37006
 # to access the site using your browser.
a6651e94
 if is_service_enabled horizon; then
df0972c1
     echo "Horizon is now available at http://$SERVICE_HOST/"
24859060
 fi
 
bad9d89f
 # Warn that the default flavors have been changed by Heat
 if is_service_enabled heat; then
     echo "Heat has replaced the default flavors. View by running: nova flavor-list"
 fi
 
df0972c1
 # If Keystone is present you can point ``nova`` cli to this server
a6651e94
 if is_service_enabled key; then
d835de89
     echo "Keystone is serving at $KEYSTONE_AUTH_PROTOCOL://$SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/"
df0972c1
     echo "Examples on using novaclient command line is in exercise.sh"
     echo "The default users are: admin and demo"
     echo "The password: $ADMIN_PASSWORD"
24859060
 fi
523c405f
 
4a43b7bd
 # Echo ``HOST_IP`` - useful for ``build_uec.sh``, which uses dhcp to give the instance an address
1097c7ca
 echo "This is your host ip: $HOST_IP"
 
afc29fe5
 # Warn that a deprecated feature was used
 if [[ -n "$DEPRECATED_TEXT" ]]; then
     echo_summary "WARNING: $DEPRECATED_TEXT"
ced65179
 fi
 
893e6636
 # Specific warning for deprecated configs
 if [[ -n "$EXTRA_OPTS" ]]; then
     echo ""
     echo_summary "WARNING: EXTRA_OPTS is used"
     echo "You are using EXTRA_OPTS to pass configuration into nova.conf."
     echo "Please convert that configuration in localrc to a nova.conf section in local.conf:"
     echo "
 [[post-config|\$NOVA_CONF]]
 [DEFAULT]
 "
     for I in "${EXTRA_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
 if [[ -n "$EXTRA_BAREMETAL_OPTS" ]]; then
     echo ""
     echo_summary "WARNING: EXTRA_OPTS is used"
     echo "You are using EXTRA_OPTS to pass configuration into nova.conf."
     echo "Please convert that configuration in localrc to a nova.conf section in local.conf:"
     echo "
 [[post-config|\$NOVA_CONF]]
 [baremetal]
 "
     for I in "${EXTRA_BAREMETAL_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
 if [[ -n "$Q_DHCP_EXTRA_DEFAULT_OPTS" ]]; then
     echo ""
     echo_summary "WARNING: Q_DHCP_EXTRA_DEFAULT_OPTS is used"
     echo "You are using Q_DHCP_EXTRA_DEFAULT_OPTS to pass configuration into $Q_DHCP_CONF_FILE."
     echo "Please convert that configuration in localrc to a $Q_DHCP_CONF_FILE section in local.conf:"
     echo "
 [[post-config|\$Q_DHCP_CONF_FILE]]
 [DEFAULT]
 "
     for I in "${Q_DHCP_EXTRA_DEFAULT_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
 if [[ -n "$Q_SRV_EXTRA_DEFAULT_OPTS" ]]; then
     echo ""
     echo_summary "WARNING: Q_SRV_EXTRA_DEFAULT_OPTS is used"
     echo "You are using Q_SRV_EXTRA_DEFAULT_OPTS to pass configuration into $NEUTRON_CONF."
     echo "Please convert that configuration in localrc to a $NEUTRON_CONF section in local.conf:"
     echo "
 [[post-config|\$NEUTRON_CONF]]
 [DEFAULT]
 "
     for I in "${Q_SRV_EXTRA_DEFAULT_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
4a43b7bd
 # Indicate how long this took to run (bash maintained variable ``SECONDS``)
7903b795
 echo_summary "stack.sh completed in $SECONDS seconds."