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**,
fc744f97
 # and **Swift**
ba23cc73
 
27f29440
 # This script's options can be changed by setting appropriate environment
 # variables.  You can configure things like which git repositories to use,
 # services to enable, OS images to use, etc.  Default values are located in the
 # ``stackrc`` file. If you are crafty you can run the script on multiple nodes
 # using shared settings for common resources (eg., mysql or rabbitmq) and build
 # a multi-node developer install.
782b9917
 
4a43b7bd
 # To keep this script simple we assume you are running on a recent **Ubuntu**
5bee0cd4
 # (14.04 Trusty or newer), **Fedora** (F20 or newer), or **CentOS/RHEL**
 # (7 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
 
b4a215cc
 # Sanitize language settings to avoid commands bailing out
 # with "unsupported locale setting" errors.
 unset LANG
 unset LANGUAGE
 LC_ALL=C
 export LC_ALL
 
27f29440
 # Make sure umask is sane
 umask 022
 
7df9d1be
 # Not all distros have sbin in PATH for regular users.
 PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin
 
c6c1d439
 # Keep track of the devstack directory
51fb22ef
 TOP_DIR=$(cd $(dirname "$0") && pwd)
 
53753293
 # Check for uninitialized variables, a big cause of bugs
 NOUNSET=${NOUNSET:-}
 if [[ -n "$NOUNSET" ]]; then
     set -o nounset
 fi
 
d3bf9bdb
 # Sanity Checks
 # -------------
 
 # Clean up last environment var cache
 if [[ -r $TOP_DIR/.stackenv ]]; then
     rm $TOP_DIR/.stackenv
 fi
 
 # ``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
     die $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
     die $LINENO "missing devstack/lib"
 fi
 
 # Check if run as root
 # OpenStack is designed to be run as a non-root user; Horizon will fail to run
 # 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.
 
 if [[ $EUID -eq 0 ]]; then
     echo "You are running this script as root."
     echo "Cut it out."
     echo "Really."
3710eece
     echo "If you need an account to run DevStack, do this (as root, heh) to create a non-root account:"
d3bf9bdb
     echo "$TOP_DIR/tools/create-stack-user.sh"
     exit 1
 fi
 
 # Prepare the environment
 # -----------------------
 
53753293
 # Initialize variables:
 LAST_SPINNER_PID=""
 
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
 
48352ee7
 # Global Settings
0e8dcedf
 # ---------------
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
b8dd27bf
                 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
 
3710eece
 
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
14fd979a
     die $LINENO "missing $TOP_DIR/stackrc - did you grab more than just stack.sh?"
bbafb1b5
 fi
 source $TOP_DIR/stackrc
df0972c1
 
c973e6c9
 # Warn users who aren't on an explicitly supported distro, but allow them to
 # override check and attempt installation with ``FORCE=yes ./stack``
1f316beb
 if [[ ! ${DISTRO} =~ (precise|trusty|7.0|wheezy|sid|testing|jessie|f20|f21|rhel7) ]]; then
c973e6c9
     echo "WARNING: this script has not been tested on $DISTRO"
     if [[ "$FORCE" != "yes" ]]; then
         die $LINENO "If you wish to run this script anyway run with FORCE=yes"
     fi
 fi
 
3710eece
 # Check to see if we are already running DevStack
 # Note that this may fail if USE_SCREEN=False
 if type -p screen > /dev/null && screen -ls | egrep -q "[0-9]\.$SCREEN_NAME"; then
     echo "You are already running a stack.sh session."
     echo "To rejoin this session type 'screen -x stack'."
     echo "To destroy this session, type './unstack.sh'."
     exit 1
 fi
 
4a43b7bd
 
48352ee7
 # Local Settings
4a43b7bd
 # --------------
 
48352ee7
 # Make sure the proxy config is visible to sub-processes
 export_proxy_variables
9122e7b1
 
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
 
a79617c1
 # Look for obsolete stuff
53753293
 # if [[ ,${ENABLED_SERVICES}, =~ ,"swift", ]]; then
 #     echo "FATAL: 'swift' is not supported as a service name"
 #     echo "FATAL: Use the actual swift service names to enable them as required:"
 #     echo "FATAL: s-proxy s-object s-container s-account"
 #     exit 1
 # fi
a79617c1
 
d3bf9bdb
 # Configure sudo
 # --------------
531aeb79
 
 # 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
ea2fcb55
 echo "Defaults:$STACK_USER !requiretty" >> $TEMPFILE
531aeb79
 chmod 0440 $TEMPFILE
 sudo chown root:root $TEMPFILE
 sudo mv $TEMPFILE /etc/sudoers.d/50_stack_sh
4a43b7bd
 
0e8dcedf
 
 # Configure Distro Repositories
 # -----------------------------
1a6d4492
 
e83f7785
 # For debian/ubuntu make apt attempt to retry network ops on it's own
 if is_ubuntu; then
9246d96e
     echo 'APT::Acquire::Retries "20";' | sudo tee /etc/apt/apt.conf.d/80retry  >/dev/null
e83f7785
 fi
 
1a6d4492
 # Some distros need to add repos beyond the defaults provided by the vendor
 # to pick up required packages.
 
1f316beb
 if is_fedora && [[ $DISTRO == "rhel7" ]]; then
6d227a4a
     # RHEL requires EPEL for many Open Stack dependencies
3682b6de
 
ed077b28
     # note we always remove and install latest -- some environments
     # use snapshot images, and if EPEL version updates they break
     # unless we update them to latest version.
     if sudo yum repolist enabled epel | grep -q 'epel'; then
         uninstall_package epel-release || true
     fi
 
     # 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
     cat <<EOF | sudo tee /etc/yum.repos.d/epel-bootstrap.repo
 [epel-bootstrap]
3682b6de
 name=Bootstrap EPEL
1f316beb
 mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-7&arch=\$basearch
3682b6de
 failovermethod=priority
 enabled=0
 gpgcheck=0
 EOF
ed077b28
     # bare yum call due to --enablerepo
     sudo yum --enablerepo=epel-bootstrap -y install epel-release || \
         die $LINENO "Error installing EPEL repo, cannot continue"
     # epel rpm has installed it's version
     sudo rm -f /etc/yum.repos.d/epel-bootstrap.repo
3e37326a
 
     # ... and also optional to be enabled
531aeb79
     is_package_installed yum-utils || install_package yum-utils
1f316beb
     sudo yum-config-manager --enable rhel-7-server-optional-rpms
 
     RHEL_RDO_REPO_RPM=${RHEL7_RDO_REPO_RPM:-"https://repos.fedorapeople.org/repos/openstack/openstack-juno/rdo-release-juno-1.noarch.rpm"}
     RHEL_RDO_REPO_ID=${RHEL7_RDO_REPO_ID:-"openstack-juno"}
fc99426a
 
     if ! sudo yum repolist enabled $RHEL_RDO_REPO_ID | grep -q $RHEL_RDO_REPO_ID; then
         echo "RDO repo not detected; installing"
         yum_install $RHEL_RDO_REPO_RPM || \
             die $LINENO "Error installing RDO repo, cannot continue"
     fi
 
1a6d4492
 fi
 
0e8dcedf
 
 # Configure Target Directories
 # ----------------------------
 
 # Destination path for installation ``DEST``
 DEST=${DEST:-/opt/stack}
23f69d83
 
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}
 
0e8dcedf
 # Destination path for service data
 DATA_DIR=${DATA_DIR:-${DEST}/data}
 sudo mkdir -p $DATA_DIR
 safe_chown -R $STACK_USER $DATA_DIR
 
 # Configure proper hostname
3ee52c81
 # Certain services such as rabbitmq require that the local hostname resolves
 # correctly.  Make sure it exists in /etc/hosts so that is always true.
 LOCAL_HOSTNAME=`hostname -s`
 if [ -z "`grep ^127.0.0.1 /etc/hosts | grep $LOCAL_HOSTNAME`" ]; then
     sudo sed -i "s/\(^127.0.0.1.*\)/\1 $LOCAL_HOSTNAME/" /etc/hosts
 fi
 
531aeb79
 
ffd17680
 # Configure Logging
 # -----------------
 
 # Set up logging level
53753293
 VERBOSE=$(trueorfalse True VERBOSE)
ffd17680
 
 # 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
 }
 
 # 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"}
dde41d07
 LOGDAYS=${LOGDAYS:-7}
 CURRENT_LOG_TIME=$(date "+$TIMESTAMP_FORMAT")
ffd17680
 
b43b3595
 if [[ -n ${LOGDIR:-} ]]; then
     mkdir -p $LOGDIR
 fi
 
ffd17680
 if [[ -n "$LOGFILE" ]]; then
ad5cc986
     # Clean up old log files.  Append '.*' to the user-specified
     # ``LOGFILE`` to match the date in the search template.
fc9cc965
     LOGFILE_DIR="${LOGFILE%/*}"           # dirname
     LOGFILE_NAME="${LOGFILE##*/}"         # basename
     mkdir -p $LOGFILE_DIR
     find $LOGFILE_DIR -maxdepth 1 -name $LOGFILE_NAME.\* -mtime +$LOGDAYS -exec rm {} \;
ffd17680
     LOGFILE=$LOGFILE.${CURRENT_LOG_TIME}
ad5cc986
     SUMFILE=$LOGFILE.summary.${CURRENT_LOG_TIME}
ffd17680
 
     # 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
fc9cc965
     ln -sf $LOGFILE $LOGFILE_DIR/$LOGFILE_NAME
     ln -sf $SUMFILE $LOGFILE_DIR/$LOGFILE_NAME.summary
ffd17680
 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``.
dde41d07
 # This is deprecated....logs go in ``LOGDIR``, only symlinks will be here now.
ffd17680
 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
 
bd24a8d0
 # Reset the bundle of CA certificates
 SSL_BUNDLE_FILE="$DATA_DIR/ca-bundle.pem"
 rm -f $SSL_BUNDLE_FILE
 
0e8dcedf
 # Import common services (database, message queue) configuration
 source $TOP_DIR/lib/database
 source $TOP_DIR/lib/rpc_backend
 
 # Make sure we only have one rpc backend enabled,
 # and the specified rpc backend is available on your platform.
 check_rpc_backend
 
18d4778c
 # 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
d81a0274
 
4a43b7bd
 # Configure Projects
 # ==================
67787e6b
 
0049c0c4
 # Import apache functions
d98a5d0a
 source $TOP_DIR/lib/apache
0049c0c4
 
 # Import TLS functions
c83a7e12
 source $TOP_DIR/lib/tls
0049c0c4
 
 # Source project function libraries
0392a10a
 source $TOP_DIR/lib/infra
1b6b5318
 source $TOP_DIR/lib/oslo
6832272a
 source $TOP_DIR/lib/stackforge
d470867f
 source $TOP_DIR/lib/lvm
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
f127e2f3
 source $TOP_DIR/lib/ldap
e0b08d04
 source $TOP_DIR/lib/dstat
67787e6b
 
2c65e71a
 # Clone all external plugins
 fetch_plugins
 
cdf3d766
 # Extras Source
 # --------------
 
 # Phase: source
2c65e71a
 run_phase source
cdf3d766
 
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}
 
9e032c2d
     if [[ -f $RC_DIR/localrc ]]; then
         localrc=$TOP_DIR/localrc
     else
         localrc=$TOP_DIR/.localrc.auto
     fi
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
f71b500b
             pw=$(generate_hex_string 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
 
2d7c346f
 initialize_database_backends && echo "Using $DATABASE_TYPE database backend" || die $LINENO "No database enabled"
782b9917
 
b9182d65
 
b7490da9
 # Queue Configuration
a841644e
 
 # Rabbit connection info
f6287c2a
 # In multi node devstack, second node needs RABBIT_USERID, but rabbit
 # isn't enabled.
 RABBIT_USERID=${RABBIT_USERID:-stackrabbit}
4a221459
 if is_service_enabled rabbit; then
e309e5a9
     RABBIT_HOST=${RABBIT_HOST:-$SERVICE_HOST}
4a221459
     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."
abbb0e9a
 
     if [[ -z "$SWIFT_TEMPURL_KEY" ]] && [[ "$SWIFT_ENABLE_TEMPURLS" == "True" ]]; then
         read_password SWIFT_TEMPURL_KEY "ENTER A KEY FOR SWIFT TEMPURLS."
     fi
b7490da9
 fi
b3288381
 
6577b468
 
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
8b5d3cf3
 if [[ "$OFFLINE" != "True" ]]; then
53753293
     PYPI_ALTERNATIVE_URL=${PYPI_ALTERNATIVE_URL:-""} $TOP_DIR/tools/install_pip.sh
8b5d3cf3
 fi
1a6d4492
 
981ed299
 TRACK_DEPENDS=${TRACK_DEPENDS:-False}
 
 # Install python packages into a virtualenv so that we can track them
 if [[ $TRACK_DEPENDS = True ]]; then
     echo_summary "Installing Python packages into a virtualenv $DEST/.venv"
     pip_install -U virtualenv
 
     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
 
d3121f64
 # Do the ugly hacks for broken packages and distros
04a35113
 source $TOP_DIR/tools/fixup_stuff.sh
9acc12a3
 
5c3a63e6
 
 # Extras Pre-install
 # ------------------
 
 # Phase: pre-install
2c65e71a
 run_phase stack pre-install
5c3a63e6
 
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
 
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
 
6832272a
 # Install stackforge libraries for testing
f7cfa0c6
 if is_service_enabled stackforge_libs; then
     install_stackforge
 fi
6832272a
 
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
 
58936fdb
 # Install middleware
 install_keystonemiddleware
 
5cb19069
 # install the OpenStack client, needed for most setup commands
e08ab104
 if use_library_from_git "python-openstackclient"; then
     git_clone_by_name "python-openstackclient"
     setup_dev_lib "python-openstackclient"
5cb19069
 else
e9a96ea8
     pip_install 'python-openstackclient>=1.0.2'
5cb19069
 fi
 
9f61d29e
 
fe51a900
 if is_service_enabled key; then
0abde393
     if [ "$KEYSTONE_AUTH_HOST" == "$SERVICE_HOST" ]; then
         install_keystone
         configure_keystone
     fi
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 horizon; then
e385d1e0
     # 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
93361643
 fi
4a43b7bd
 
bfdad75e
 if is_service_enabled heat; then
d644e23c
     install_heat
315971d9
     install_heat_other
c3249083
     cleanup_heat
bfdad75e
     configure_heat
 fi
b7490da9
 
18d4778c
 if is_service_enabled tls-proxy || [ "$USE_SSL" == "True" ]; then
fe51a900
     configure_CA
     init_CA
     init_cert
     # Add name to /etc/hosts
     # don't be naive and add to existing line!
67787e6b
 fi
75a37653
 
ce696b60
 
cdf3d766
 # Extras Install
 # --------------
 
 # Phase: install
2c65e71a
 run_phase stack install
cdf3d766
 
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
e8fa8537
         echo "Detect some changes for installed packages of pip, in depend tracking mode"
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
 
bd24a8d0
 # Export Certicate Authority Bundle
 # ---------------------------------
 
 # If certificates were used and written to the SSL bundle file then these
 # should be exported so clients can validate their connections.
 
 if [ -f $SSL_BUNDLE_FILE ]; then
     export OS_CACERT=$SSL_BUNDLE_FILE
 fi
 
 
428af5a2
 # Configure database
 # ------------------
b9182d65
 
428af5a2
 if is_service_enabled $DATABASE_BACKENDS; then
     configure_database
24859060
 fi
 
b9182d65
 
 # Configure screen
 # ----------------
 
53753293
 USE_SCREEN=$(trueorfalse True USE_SCREEN)
681f3fdd
 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
ff72c505
     SCREEN_HARDSTATUS=${SCREEN_HARDSTATUS:-}
681f3fdd
     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
 
78096b50
 # Dstat
1a6d4492
 # -------
 
f1eb0475
 # A better kind of sysstat, with the top process per time slice
e0b08d04
 start_dstat
921f2dab
 
893e6636
 # Start Services
 # ==============
 
d81a0274
 # Keystone
 # --------
 
 if is_service_enabled key; then
7903b795
     echo_summary "Starting Keystone"
0abde393
 
     if [ "$KEYSTONE_AUTH_HOST" == "$SERVICE_HOST" ]; then
         init_keystone
         start_keystone
     fi
d81a0274
 
d835de89
     # Set up a temporary admin URI for Keystone
3561d7f9
     SERVICE_ENDPOINT=$KEYSTONE_AUTH_URI/v2.0
c83a7e12
 
     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
 
42a59c2b
     # Setup OpenStackclient token-flow auth
19685428
     export OS_TOKEN=$SERVICE_TOKEN
     export OS_URL=$SERVICE_ENDPOINT
42a59c2b
 
d835de89
     create_keystone_accounts
a0dce264
     create_nova_accounts
42a59c2b
     create_glance_accounts
671c16e6
     create_cinder_accounts
b05c8769
     create_neutron_accounts
d835de89
 
fa5ccfff
     if is_service_enabled ceilometer; then
         create_ceilometer_accounts
     fi
 
42a59c2b
     if is_service_enabled swift; then
0ff314c0
         create_swift_accounts
     fi
 
e389aed5
     if is_service_enabled heat && [[ "$HEAT_STANDALONE" != "True" ]]; then
33d1f86a
         create_heat_accounts
     fi
 
42a59c2b
     # Begone token-flow auth
19685428
     unset OS_TOKEN OS_URL
42a59c2b
 
     # Set up password-flow auth creds now that keystone is bootstrapped
d81a0274
     export OS_AUTH_URL=$SERVICE_ENDPOINT
     export OS_TENANT_NAME=admin
     export OS_USERNAME=admin
     export OS_PASSWORD=$ADMIN_PASSWORD
0abde393
     export OS_REGION_NAME=$REGION_NAME
d81a0274
 fi
 
 
26ac3d7e
 # ZeroMQ
 # ------
 if is_service_enabled zeromq; then
     echo_summary "Starting zeromq receiver"
     run_process zeromq "$OSLO_BIN_DIR/oslo-messaging-zmq-receiver"
 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
 
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
7a7fb49b
 
     if is_service_enabled n-net; then
         rm -rf ${NOVA_STATE_PATH}/networks
         sudo mkdir -p ${NOVA_STATE_PATH}/networks
a0ced4df
         safe_chown -R ${STACK_USER} ${NOVA_STATE_PATH}/networks
7a7fb49b
     fi
 
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
 
cdf3d766
 # Extras Configuration
 # ====================
 
 # Phase: post-config
2c65e71a
 run_phase stack post-config
cdf3d766
 
 
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
e4fa7213
 if is_service_enabled glance; then
7903b795
     echo_summary "Starting Glance"
73f6f25b
     start_glance
d000b22d
 fi
 
0b9776d2
 # Install Images
 # ==============
 
 # Upload an image to glance.
 #
 # The default image is cirros, a small testing image which lets you login as **root**
 # 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
 #
 # Override ``IMAGE_URLS`` with a comma-separated list of UEC images.
 #  * **precise**: http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64.tar.gz
 
 if is_service_enabled g-reg; then
     TOKEN=$(keystone token-get | grep ' id ' | get_field 2)
     die_if_not_set $LINENO TOKEN "Keystone fail to get token"
 
2f8e08b5
     echo_summary "Uploading images"
0b9776d2
 
2f8e08b5
     # 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"
0b9776d2
     fi
2f8e08b5
 
     for image_url in ${IMAGE_URLS//,/ }; do
         upload_image $image_url $TOKEN
     done
0b9776d2
 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
df6793a8
     eval $(openstack ec2 credentials create --user nova --project $SERVICE_TENANT_NAME -f shell -c access -c secret)
     iniset $NOVA_CONF DEFAULT s3_access_key "$access"
     iniset $NOVA_CONF DEFAULT s3_secret_key "$secret"
9bc47db2
     iniset $NOVA_CONF DEFAULT s3_affix_tenant "True"
d000b22d
 fi
 
def4c141
 # Create a randomized default value for the keymgr's fixed_key
 if is_service_enabled nova; then
f71b500b
     iniset $NOVA_CONF keymgr fixed_key $(generate_hex_string 32)
def4c141
 fi
 
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
ef1e0802
     check_neutron_third_party_integration
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
6fbb28d0
 # Once neutron agents are started setup initial network elements
7bce8fa3
 if is_service_enabled q-svc && [[ "$NEUTRON_CREATE_INITIAL_NETWORKS" == "True" ]]; then
6fbb28d0
     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
09718335
     create_volume_types
67787e6b
 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
1bcd2800
     # Initialize heat
bad9d89f
     echo_summary "Configuring Heat"
     init_heat
7903b795
     echo_summary "Starting Heat"
bfdad75e
     start_heat
2a6009cd
     if [ "$HEAT_CREATE_TEST_IMAGE" = "True" ]; then
         echo_summary "Building Heat functional test image"
         build_heat_functional_test_image
     fi
bfdad75e
 fi
7d28a0e1
 
bd24a8d0
 
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
bd24a8d0
     USERRC_PARAMS="-PA --target-dir $TOP_DIR/accrc"
 
     if [ -f $SSL_BUNDLE_FILE ]; then
         USERRC_PARAMS="$USERRC_PARAMS --os-cacert $SSL_BUNDLE_FILE"
     fi
 
e389aed5
     if [[ "$HEAT_STANDALONE" = "True" ]]; then
         USERRC_PARAMS="$USERRC_PARAMS --heat-url http://$HEAT_API_HOST:$HEAT_API_PORT/v1"
     fi
 
bd24a8d0
     $TOP_DIR/tools/create_userrc.sh $USERRC_PARAMS
22ef5731
 fi
 
4a43b7bd
 
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 \
bd24a8d0
     SERVICE_HOST SERVICE_PROTOCOL STACK_USER TLS_IP KEYSTONE_AUTH_PROTOCOL OS_CACERT; 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
2c65e71a
 run_phase stack extra
768295e9
 
feb28837
 # Local Configuration
 # ===================
 
 # Apply configuration from local.conf if it exists for layer 2 services
 # Phase: post-extra
 merge_config_group $TOP_DIR/local.conf post-extra
 
768295e9
 
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
 
df0972c1
 # If Keystone is present you can point ``nova`` cli to this server
a6651e94
 if is_service_enabled key; then
3561d7f9
     echo "Keystone is serving at $KEYSTONE_SERVICE_URI/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
 
5bae6ca0
 if is_service_enabled neutron; then
     # TODO(dtroyer): Remove Q_AGENT_EXTRA_AGENT_OPTS after stable/juno branch is cut
     if [[ -n "$Q_AGENT_EXTRA_AGENT_OPTS" ]]; then
         echo ""
         echo_summary "WARNING: Q_AGENT_EXTRA_AGENT_OPTS is used"
         echo "You are using Q_AGENT_EXTRA_AGENT_OPTS to pass configuration into $NEUTRON_CONF."
         echo "Please convert that configuration in localrc to a $NEUTRON_CONF section in local.conf:"
         echo "Q_AGENT_EXTRA_AGENT_OPTS will be removed early in the 'K' development cycle"
         echo "
91baef3e
 [[post-config|/\$Q_PLUGIN_CONF_FILE]]
 [DEFAULT]
 "
5bae6ca0
         for I in "${Q_AGENT_EXTRA_AGENT_OPTS[@]}"; do
             # Replace the first '=' with ' ' for iniset syntax
             echo ${I}
         done
     fi
91baef3e
 
5bae6ca0
     # TODO(dtroyer): Remove Q_AGENT_EXTRA_SRV_OPTS after stable/juno branch is cut
     if [[ -n "$Q_AGENT_EXTRA_SRV_OPTS" ]]; then
         echo ""
         echo_summary "WARNING: Q_AGENT_EXTRA_SRV_OPTS is used"
         echo "You are using Q_AGENT_EXTRA_SRV_OPTS to pass configuration into $NEUTRON_CONF."
         echo "Please convert that configuration in localrc to a $NEUTRON_CONF section in local.conf:"
         echo "Q_AGENT_EXTRA_AGENT_OPTS will be removed early in the 'K' development cycle"
         echo "
91baef3e
 [[post-config|/\$Q_PLUGIN_CONF_FILE]]
 [DEFAULT]
 "
5bae6ca0
         for I in "${Q_AGENT_EXTRA_SRV_OPTS[@]}"; do
             # Replace the first '=' with ' ' for iniset syntax
             echo ${I}
         done
     fi
91baef3e
 fi
 
5bae6ca0
 if is_service_enabled cinder; then
     # TODO(dtroyer): Remove CINDER_MULTI_LVM_BACKEND after stable/juno branch is cut
     if [[ "$CINDER_MULTI_LVM_BACKEND" = "True" ]]; then
         echo ""
         echo_summary "WARNING: CINDER_MULTI_LVM_BACKEND is used"
         echo "You are using CINDER_MULTI_LVM_BACKEND to configure Cinder's multiple LVM backends"
         echo "Please convert that configuration in local.conf to use CINDER_ENABLED_BACKENDS."
f787919b
         echo "CINDER_MULTI_LVM_BACKEND will be removed early in the 'K' development cycle"
5bae6ca0
         echo "
09718335
 [[local|localrc]]
 CINDER_ENABLED_BACKENDS=lvm:lvmdriver-1,lvm:lvmdriver-2
 "
5bae6ca0
     fi
09718335
 fi
 
4a43b7bd
 # Indicate how long this took to run (bash maintained variable ``SECONDS``)
7903b795
 echo_summary "stack.sh completed in $SECONDS seconds."
8068455a
 
 # Restore/close logging file descriptors
 exec 1>&3
 exec 2>&3
 exec 3>&-
 exec 6>&-