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**
d7f6090f
 # (12.04 Precise or newer) or **Fedora** (F18 or newer) machine.  (It may work
1a6d4492
 # 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
 
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
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
 
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``
d9259ea4
 if [[ ! ${DISTRO} =~ (precise|saucy|trusty|7.0|wheezy|sid|testing|jessie|f19|f20|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
 
a79617c1
 # Look for obsolete stuff
 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 tham as required:"
     echo "FATAL: s-proxy s-object s-container s-account"
     exit 1
 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)
 
531aeb79
 # root Access
 # -----------
 
 # 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."
     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"
     exit 1
 fi
 
 # 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
 
1a6d4492
 # Additional repos
531aeb79
 # ----------------
1a6d4492
 
85a8d780
 # 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.
 
6d227a4a
 if [[ is_fedora && $DISTRO =~ (rhel) ]]; then
     # Installing Open vSwitch on RHEL requires enabling the RDO repo.
     RHEL6_RDO_REPO_RPM=${RHEL6_RDO_REPO_RPM:-"http://rdo.fedorapeople.org/openstack-icehouse/rdo-release-icehouse.rpm"}
     RHEL6_RDO_REPO_ID=${RHEL6_RDO_REPO_ID:-"openstack-icehouse"}
2a6f1bd9
     if ! sudo yum repolist enabled $RHEL6_RDO_REPO_ID | grep -q $RHEL6_RDO_REPO_ID; then
1a6d4492
         echo "RDO repo not detected; installing"
         yum_install $RHEL6_RDO_REPO_RPM || \
             die $LINENO "Error installing RDO repo, cannot continue"
     fi
6d227a4a
     # RHEL requires EPEL for many Open Stack dependencies
     if [[ $DISTRO =~ (rhel7) ]]; then
40b4f048
         EPEL_RPM=${RHEL7_EPEL_RPM:-"http://download.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-0.1.noarch.rpm"}
6d227a4a
     else
40b4f048
         EPEL_RPM=${RHEL6_EPEL_RPM:-"http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"}
6d227a4a
     fi
2a6f1bd9
     if ! sudo yum repolist enabled epel | grep -q 'epel'; then
1a6d4492
         echo "EPEL not detected; installing"
6d227a4a
         yum_install ${EPEL_RPM} || \
1a6d4492
             die $LINENO "Error installing EPEL repo, cannot continue"
     fi
3e37326a
 
     # ... and also optional to be enabled
531aeb79
     is_package_installed yum-utils || install_package yum-utils
3e37326a
     sudo yum-config-manager --enable rhel-6-server-optional-rpms
 
1a6d4492
 fi
 
531aeb79
 # Filesystem setup
 # ----------------
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}
 
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
 # Destination path for service data
 DATA_DIR=${DATA_DIR:-${DEST}/data}
 sudo mkdir -p $DATA_DIR
 safe_chown -R $STACK_USER $DATA_DIR
 
 
 # Common Configuration
 # --------------------
 
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`
 
d81a0274
 # 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.
90234ac4
 FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.0/24}
d81a0274
 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
ccb3d10e
     die $LINENO "Could not determine host ip address.  See local.conf for suggestions on setting HOST_IP."
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}
 
78096b50
 # for DSTAT logging
062cdaf8
 DSTAT_FILE=${DSTAT_FILE:-"dstat.txt"}
 
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}
 
bd24a8d0
 # Reset the bundle of CA certificates
 SSL_BUNDLE_FILE="$DATA_DIR/ca-bundle.pem"
 rm -f $SSL_BUNDLE_FILE
 
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
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
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
 
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
             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
d7952323
     RABBIT_USERID=${RABBIT_USERID:-stackrabbit}
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."
 fi
b3288381
 
6577b468
 
b7490da9
 # Configure logging
 # -----------------
471de7a3
 
7879a3ce
 # Draw a spinner so the user knows something is happening
aee18c74
 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"
aee18c74
 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"
aee18c74
 function echo_nolog {
7903b795
     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
730353b1
         # Set fd 1 and 2 to write the log file
cda90647
         exec 1> >( $TOP_DIR/tools/outfilter.py -v -o "${LOGFILE}" ) 2>&1
730353b1
         # Set fd 6 to summary log file
cda90647
         exec 6> >( $TOP_DIR/tools/outfilter.py -o "${SUMFILE}" )
7903b795
     else
         # Set fd 1 and 2 to primary logfile
cda90647
         exec 1> >( $TOP_DIR/tools/outfilter.py -o "${LOGFILE}" ) 2>&1
7903b795
         # Set fd 6 to summary logfile and stdout
cda90647
         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
cda90647
     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
a25a6f6d
 trap exit_trap EXIT
 function exit_trap {
7879a3ce
     local r=$?
94b9e820
     jobs=$(jobs -p)
a3935fb0
     # 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
94b9e820
         echo "exit_trap: cleaning up child processes"
         kill 2>&1 $jobs
     fi
7879a3ce
     exit $r
 }
 
4a43b7bd
 # Exit on any errors so that errors don't compound
a25a6f6d
 trap err_trap ERR
 function err_trap {
f9da5081
     local r=$?
     set +o xtrace
a25a6f6d
     if [[ -n "$LOGFILE" ]]; then
         echo "${0##*/} failed: full log in $LOGFILE"
     else
         echo "${0##*/} failed"
     fi
f9da5081
     exit $r
 }
 
09bd7c8f
 
 set -o errexit
 
f9da5081
 # 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
8b5d3cf3
 if [[ "$OFFLINE" != "True" ]]; then
     $TOP_DIR/tools/install_pip.sh
 fi
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
 
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
 
 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 horizon; then
ea796c05
     # 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
c3249083
     cleanup_heat
bfdad75e
     configure_heat
 fi
b7490da9
 
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
 
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
 
397f7de5
 # install the OpenStack client, needed for most setup commands
 if use_library_from_git "python-openstackclient"; then
     git_clone_by_name "python-openstackclient"
     setup_dev_lib "python-openstackclient"
 else
     # FIXME(adam)g: Work around a gate wedge by installing a capped novaclient
     # here, so that the following OSC installation does not pull in a newer one
     # via its uncapped requirement.  This can be removed once OSC ends up in a
     # venv.
     pip_install "python-novaclient>=2.17.0,<2.21"
 
     # Also install the capped neutronclient as per blocked
     # https://review.openstack.org/#/c/157606/
     pip_install "python-neutronclient>=2.3.4,<2.3.11"
 
ed049269
     pip_install "python-openstackclient<=0.4.1"
397f7de5
 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
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
 # ----------------
 
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
 
78096b50
 # Dstat
1a6d4492
 # -------
 
f1eb0475
 # A better kind of sysstat, with the top process per time slice
e8d84066
 DSTAT_OPTS="-tcmndrylp --top-cpu-adv"
f1eb0475
 if [[ -n ${SCREEN_LOGDIR} ]]; then
     screen_it dstat "cd $TOP_DIR; dstat $DSTAT_OPTS | tee $SCREEN_LOGDIR/$DSTAT_FILE"
 else
     screen_it dstat "dstat $DSTAT_OPTS"
921f2dab
 fi
 
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
 
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
 
33d1f86a
     if is_service_enabled heat; then
         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
 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
         safe_chown -R ${USER} ${NOVA_STATE_PATH}/networks
     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
 
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
 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
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"
 
     if is_baremetal; then
         echo_summary "Creating and uploading baremetal images"
 
         # build and upload separate deploy kernel & ramdisk
         upload_baremetal_deploy $TOKEN
 
         # upload images, separating out the kernel & ramdisk for PXE boot
         for image_url in ${IMAGE_URLS//,/ }; do
             upload_baremetal_image $image_url $TOKEN
         done
     else
         echo_summary "Uploading images"
 
         # 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
 
         for image_url in ${IMAGE_URLS//,/ }; do
             upload_image $image_url $TOKEN
         done
     fi
 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
     FIXED_KEY=""
16dd8b3e
     for i in $(seq 1 64); do
         FIXED_KEY+=$(echo "obase=16; $(($RANDOM % 16))" | bc);
def4c141
     done;
     iniset $NOVA_CONF keymgr fixed_key "$FIXED_KEY"
 fi
 
e542883c
 if is_service_enabled zeromq; then
     echo_summary "Starting zermomq receiver"
da6648a6
     run_process zeromq "$OSLO_BIN_DIR/oslo-messaging-zmq-receiver"
e542883c
 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
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
 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
1bcd2800
     # Initialize heat
bad9d89f
     echo_summary "Configuring Heat"
     init_heat
7903b795
     echo_summary "Starting Heat"
bfdad75e
     start_heat
 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
 
     $TOP_DIR/tools/create_userrc.sh $USERRC_PARAMS
22ef5731
 fi
 
4a43b7bd
 
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" ]] && \
b83c365c
         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
da6648a6
     run_process baremetal "nova-baremetal-deploy-helper"
f35cf91a
 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 \
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
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
 
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
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
 
91baef3e
 # TODO(dtroyer): Remove EXTRA_OPTS after stable/icehouse branch is cut
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:"
91baef3e
     echo "EXTRA_OPTS will be removed early in the Juno development cycle"
893e6636
     echo "
 [[post-config|\$NOVA_CONF]]
 [DEFAULT]
 "
     for I in "${EXTRA_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
91baef3e
 # TODO(dtroyer): Remove EXTRA_BAREMETAL_OPTS after stable/icehouse branch is cut
893e6636
 if [[ -n "$EXTRA_BAREMETAL_OPTS" ]]; then
     echo ""
91baef3e
     echo_summary "WARNING: EXTRA_BAREMETAL_OPTS is used"
     echo "You are using EXTRA_BAREMETAL_OPTS to pass configuration into nova.conf."
893e6636
     echo "Please convert that configuration in localrc to a nova.conf section in local.conf:"
91baef3e
     echo "EXTRA_BAREMETAL_OPTS will be removed early in the Juno development cycle"
893e6636
     echo "
 [[post-config|\$NOVA_CONF]]
 [baremetal]
 "
     for I in "${EXTRA_BAREMETAL_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
91baef3e
 # 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 "
 [[post-config|/\$Q_PLUGIN_CONF_FILE]]
 [DEFAULT]
 "
     for I in "${Q_AGENT_EXTRA_AGENT_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
 # 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 "
 [[post-config|/\$Q_PLUGIN_CONF_FILE]]
 [DEFAULT]
 "
     for I in "${Q_AGENT_EXTRA_SRV_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
 # TODO(dtroyer): Remove Q_DHCP_EXTRA_DEFAULT_OPTS after stable/icehouse branch is cut
893e6636
 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:"
91baef3e
     echo "Q_DHCP_EXTRA_DEFAULT_OPTS will be removed early in the Juno development cycle"
893e6636
     echo "
91baef3e
 [[post-config|/\$Q_DHCP_CONF_FILE]]
893e6636
 [DEFAULT]
 "
     for I in "${Q_DHCP_EXTRA_DEFAULT_OPTS[@]}"; do
         # Replace the first '=' with ' ' for iniset syntax
         echo ${I}
     done
 fi
 
91baef3e
 # TODO(dtroyer): Remove Q_SRV_EXTRA_DEFAULT_OPTS after stable/icehouse branch is cut
893e6636
 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:"
91baef3e
     echo "Q_SRV_EXTRA_DEFAULT_OPTS will be removed early in the Juno development cycle"
893e6636
     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."
8068455a
 
 # Restore/close logging file descriptors
 exec 1>&3
 exec 2>&3
 exec 3>&-
 exec 6>&-