blob: 8c18f5130fa7c7ecfcb0f74c3fafad0b4684d4db [file] [log] [blame]
Jesse Andrewsba23cc72011-09-11 03:22:13 -07001#!/usr/bin/env bash
2
Dean Troyerc6c1d432012-03-27 20:59:22 -05003# ``stack.sh`` is an opinionated OpenStack developer installation. It
Dean Troyer4a43b7b2012-08-28 17:43:40 -05004# installs and configures various combinations of **Ceilometer**, **Cinder**,
Nikhil Manchanda0cccad42012-12-03 18:15:09 -07005# **Glance**, **Heat**, **Horizon**, **Keystone**, **Nova**, **Neutron**,
Dean Troyerfc744f92014-01-27 13:45:21 -06006# and **Swift**
Jesse Andrewsba23cc72011-09-11 03:22:13 -07007
Brett Campbell27f29442014-02-19 18:23:16 -08008# This script's options can be changed by setting appropriate environment
9# variables. You can configure things like which git repositories to use,
10# services to enable, OS images to use, etc. Default values are located in the
11# ``stackrc`` file. If you are crafty you can run the script on multiple nodes
12# using shared settings for common resources (eg., mysql or rabbitmq) and build
13# a multi-node developer install.
Jesse Andrews782b9912011-10-02 16:53:21 -040014
Dean Troyer4a43b7b2012-08-28 17:43:40 -050015# To keep this script simple we assume you are running on a recent **Ubuntu**
Alvaro Lopez Ortegad7f60902013-12-22 17:03:47 +010016# (12.04 Precise or newer) or **Fedora** (F18 or newer) machine. (It may work
Dean Troyer1a6d4492013-06-03 16:47:36 -050017# on other platforms but support for those platforms is left to those who added
18# them to DevStack.) It should work in a VM or physical server. Additionally
19# we maintain a list of ``apt`` and ``rpm`` dependencies and other configuration
20# files in this repo.
Jesse Andrews24859062011-09-15 21:28:23 -070021
Jesse Andrews0e7e8972011-10-02 16:36:54 -040022# Learn more and get the most recent version at http://devstack.org
Jesse Andrews6edd17f2011-09-15 22:19:42 -070023
Jason Dunsmore4e971112013-04-10 10:17:40 -050024# Make sure custom grep options don't get in the way
25unset GREP_OPTIONS
26
YAMAMOTO Takashib4a215c2014-01-10 16:39:32 +090027# Sanitize language settings to avoid commands bailing out
28# with "unsupported locale setting" errors.
29unset LANG
30unset LANGUAGE
31LC_ALL=C
32export LC_ALL
33
Brett Campbell27f29442014-02-19 18:23:16 -080034# Make sure umask is sane
35umask 022
36
Dean Troyerc6c1d432012-03-27 20:59:22 -050037# Keep track of the devstack directory
Jesse Andrews51fb22e2011-10-19 09:24:17 -070038TOP_DIR=$(cd $(dirname "$0") && pwd)
39
Dean Troyerd3bf9bd2014-07-25 10:20:19 -050040
41# Sanity Checks
42# -------------
43
44# Clean up last environment var cache
45if [[ -r $TOP_DIR/.stackenv ]]; then
46 rm $TOP_DIR/.stackenv
47fi
48
49# ``stack.sh`` keeps the list of ``apt`` and ``rpm`` dependencies and config
50# templates and other useful files in the ``files`` subdirectory
51FILES=$TOP_DIR/files
52if [ ! -d $FILES ]; then
53 die $LINENO "missing devstack/files"
54fi
55
56# ``stack.sh`` keeps function libraries here
57# Make sure ``$TOP_DIR/lib`` directory is present
58if [ ! -d $TOP_DIR/lib ]; then
59 die $LINENO "missing devstack/lib"
60fi
61
62# Check if run as root
63# OpenStack is designed to be run as a non-root user; Horizon will fail to run
64# as **root** since Apache will not serve content from **root** user).
65# ``stack.sh`` must not be run as **root**. It aborts and suggests one course of
66# action to create a suitable user account.
67
68if [[ $EUID -eq 0 ]]; then
69 echo "You are running this script as root."
70 echo "Cut it out."
71 echo "Really."
72 echo "If you need an account to run DevStack, do this (as root, heh) to create $STACK_USER:"
73 echo "$TOP_DIR/tools/create-stack-user.sh"
74 exit 1
75fi
76
77# Check to see if we are already running DevStack
78# Note that this may fail if USE_SCREEN=False
79if type -p screen >/dev/null && screen -ls | egrep -q "[0-9].$SCREEN_NAME"; then
80 echo "You are already running a stack.sh session."
81 echo "To rejoin this session type 'screen -x stack'."
82 echo "To destroy this session, type './unstack.sh'."
83 exit 1
84fi
85
86
87# Prepare the environment
88# -----------------------
89
Dean Troyer6563a3c2012-01-31 12:11:56 -060090# Import common functions
Dean Troyerc6c1d432012-03-27 20:59:22 -050091source $TOP_DIR/functions
Dean Troyer6563a3c2012-01-31 12:11:56 -060092
Dean Troyer893e6632013-09-13 15:05:51 -050093# Import config functions
94source $TOP_DIR/lib/config
95
Dean Troyerc6c1d432012-03-27 20:59:22 -050096# Determine what system we are running on. This provides ``os_VENDOR``,
97# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME``
Dean Troyera9e0a482012-07-09 14:07:23 -050098# and ``DISTRO``
99GetDistro
Jesse Andrews6edd17f2011-09-15 22:19:42 -0700100
Dean Troyerd3bf9bd2014-07-25 10:20:19 -0500101# Warn users who aren't on an explicitly supported distro, but allow them to
102# override check and attempt installation with ``FORCE=yes ./stack``
103if [[ ! ${DISTRO} =~ (precise|trusty|7.0|wheezy|sid|testing|jessie|f19|f20|rhel6|rhel7) ]]; then
104 echo "WARNING: this script has not been tested on $DISTRO"
105 if [[ "$FORCE" != "yes" ]]; then
106 die $LINENO "If you wish to run this script anyway run with FORCE=yes"
107 fi
108fi
109
Maru Newbyeb2da5d2013-05-15 21:28:29 +0000110
Dean Troyer48352ee2012-12-12 12:50:38 -0600111# Global Settings
112# ===============
Scott Moserf9da5082011-10-07 21:28:00 -0400113
Dean Troyer893e6632013-09-13 15:05:51 -0500114# Check for a ``localrc`` section embedded in ``local.conf`` and extract if
115# ``localrc`` does not already exist
116
117# Phase: local
118rm -f $TOP_DIR/.localrc.auto
119if [[ -r $TOP_DIR/local.conf ]]; then
120 LRC=$(get_meta_section_files $TOP_DIR/local.conf local)
121 for lfile in $LRC; do
122 if [[ "$lfile" == "localrc" ]]; then
123 if [[ -r $TOP_DIR/localrc ]]; then
124 warn $LINENO "localrc and local.conf:[[local]] both exist, using localrc"
125 else
Dean Troyerb8dd27b2013-10-17 12:03:55 -0500126 echo "# Generated file, do not edit" >$TOP_DIR/.localrc.auto
Dean Troyer893e6632013-09-13 15:05:51 -0500127 get_meta_section $TOP_DIR/local.conf local $lfile >>$TOP_DIR/.localrc.auto
128 fi
129 fi
130 done
131fi
132
Dean Troyer1a6d4492013-06-03 16:47:36 -0500133# ``stack.sh`` is customizable by setting environment variables. Override a
134# default setting via export::
Scott Moserf9da5082011-10-07 21:28:00 -0400135#
Terry Wilson428af5a2012-11-01 16:12:39 -0400136# export DATABASE_PASSWORD=anothersecret
Scott Moserf9da5082011-10-07 21:28:00 -0400137# ./stack.sh
138#
Dean Troyer1a6d4492013-06-03 16:47:36 -0500139# or by setting the variable on the command line::
Scott Moserf9da5082011-10-07 21:28:00 -0400140#
Dean Troyer1a6d4492013-06-03 16:47:36 -0500141# DATABASE_PASSWORD=simple ./stack.sh
142#
143# Persistent variables can be placed in a ``localrc`` file::
Scott Moserf9da5082011-10-07 21:28:00 -0400144#
Terry Wilson428af5a2012-11-01 16:12:39 -0400145# DATABASE_PASSWORD=anothersecret
146# DATABASE_USER=hellaroot
Scott Moserf9da5082011-10-07 21:28:00 -0400147#
148# We try to have sensible defaults, so you should be able to run ``./stack.sh``
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500149# in most cases. ``localrc`` is not distributed with DevStack and will never
150# be overwritten by a DevStack update.
Scott Moserf9da5082011-10-07 21:28:00 -0400151#
Dean Troyerdf0972c2012-03-07 17:31:03 -0600152# DevStack distributes ``stackrc`` which contains locations for the OpenStack
Dean Troyercc6b4432013-04-08 15:38:03 -0500153# repositories, branches to configure, and other configuration defaults.
154# ``stackrc`` sources ``localrc`` to allow you to safely override those settings.
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500155
Dean Troyerbbafb1b2012-06-11 16:51:39 -0500156if [[ ! -r $TOP_DIR/stackrc ]]; then
Dean Troyer14fd9792014-07-25 10:34:11 -0500157 die $LINENO "missing $TOP_DIR/stackrc - did you grab more than just stack.sh?"
Dean Troyerbbafb1b2012-06-11 16:51:39 -0500158fi
159source $TOP_DIR/stackrc
Dean Troyerdf0972c2012-03-07 17:31:03 -0600160
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500161
Dean Troyer48352ee2012-12-12 12:50:38 -0600162# Local Settings
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500163# --------------
164
Dean Troyer48352ee2012-12-12 12:50:38 -0600165# Make sure the proxy config is visible to sub-processes
166export_proxy_variables
Scott Moserf9da5082011-10-07 21:28:00 -0400167
Jesse Andrews6edd17f2011-09-15 22:19:42 -0700168# Destination path for installation ``DEST``
Anthony Younge8fed482011-09-26 19:50:43 -0700169DEST=${DEST:-/opt/stack}
Jesse Andrewsba23cc72011-09-11 03:22:13 -0700170
Dean Troyerc6c1d432012-03-27 20:59:22 -0500171
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900172# Import common services (database, message queue) configuration
Dean Troyerc1b486a2012-11-05 14:26:09 -0600173source $TOP_DIR/lib/database
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900174source $TOP_DIR/lib/rpc_backend
Dean Troyerc1b486a2012-11-05 14:26:09 -0600175
Doug Hellmannf04178f2012-07-05 17:10:03 -0400176# Remove services which were negated in ENABLED_SERVICES
Joe Gordon6fd28112012-11-13 16:55:41 -0800177# using the "-" prefix (e.g., "-rabbit") instead of
Doug Hellmannf04178f2012-07-05 17:10:03 -0400178# calling disable_service().
179disable_negated_services
Chmouel Boudjnahc4cd4142012-06-27 11:01:40 +0200180
Dean Troyerc6c1d432012-03-27 20:59:22 -0500181
Dean Troyera79617c2014-04-13 18:16:54 -0500182# Look for obsolete stuff
JordanPea9c24b2014-04-28 08:38:34 +0000183if [[ ,${ENABLED_SERVICES}, =~ ,"swift", ]]; then
Dean Troyera79617c2014-04-13 18:16:54 -0500184 echo "FATAL: 'swift' is not supported as a service name"
Gael Chamoulaudd3121f62014-07-24 23:53:02 +0200185 echo "FATAL: Use the actual swift service names to enable them as required:"
Dean Troyera79617c2014-04-13 18:16:54 -0500186 echo "FATAL: s-proxy s-object s-container s-account"
187 exit 1
188fi
189
Russell Bryant4a221452012-03-13 13:44:12 -0400190
Dean Troyerd3bf9bd2014-07-25 10:20:19 -0500191# Configure sudo
192# --------------
Dean Troyer9122e7b2011-10-17 14:07:11 -0500193
Dean Troyer23f69d82013-10-04 12:35:24 -0500194# We're not **root**, make sure ``sudo`` is available
195is_package_installed sudo || install_package sudo
196
197# UEC images ``/etc/sudoers`` does not have a ``#includedir``, add one
198sudo grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||
199 echo "#includedir /etc/sudoers.d" | sudo tee -a /etc/sudoers
200
201# Set up devstack sudoers
202TEMPFILE=`mktemp`
203echo "$STACK_USER ALL=(root) NOPASSWD:ALL" >$TEMPFILE
204# Some binaries might be under /sbin or /usr/sbin, so make sure sudo will
205# see them by forcing PATH
206echo "Defaults:$STACK_USER secure_path=/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin" >> $TEMPFILE
Adam Gandelmanea2fcb52014-03-17 16:37:56 -0700207echo "Defaults:$STACK_USER !requiretty" >> $TEMPFILE
Dean Troyer23f69d82013-10-04 12:35:24 -0500208chmod 0440 $TEMPFILE
209sudo chown root:root $TEMPFILE
210sudo mv $TEMPFILE /etc/sudoers.d/50_stack_sh
211
Ian Wienand531aeb72014-02-28 11:24:29 +1100212# Additional repos
213# ----------------
214
Sean Daguee83f7782014-06-23 08:11:05 -0400215# For debian/ubuntu make apt attempt to retry network ops on it's own
216if is_ubuntu; then
217 echo 'APT::Acquire::Retries "20";' | sudo tee /etc/apt/apt.conf.d/80retry
218fi
219
Ian Wienand531aeb72014-02-28 11:24:29 +1100220# Some distros need to add repos beyond the defaults provided by the vendor
221# to pick up required packages.
222
Attila Fazekas6d227a42014-04-09 14:42:42 +0200223if [[ is_fedora && $DISTRO =~ (rhel) ]]; then
224 # Installing Open vSwitch on RHEL requires enabling the RDO repo.
225 RHEL6_RDO_REPO_RPM=${RHEL6_RDO_REPO_RPM:-"http://rdo.fedorapeople.org/openstack-icehouse/rdo-release-icehouse.rpm"}
226 RHEL6_RDO_REPO_ID=${RHEL6_RDO_REPO_ID:-"openstack-icehouse"}
Ian Wienand531aeb72014-02-28 11:24:29 +1100227 if ! sudo yum repolist enabled $RHEL6_RDO_REPO_ID | grep -q $RHEL6_RDO_REPO_ID; then
228 echo "RDO repo not detected; installing"
229 yum_install $RHEL6_RDO_REPO_RPM || \
230 die $LINENO "Error installing RDO repo, cannot continue"
231 fi
Attila Fazekas6d227a42014-04-09 14:42:42 +0200232 # RHEL requires EPEL for many Open Stack dependencies
233 if [[ $DISTRO =~ (rhel7) ]]; then
Brad P. Crochete66da492014-06-23 08:16:56 -0400234 EPEL_RPM=${RHEL7_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm"}
Attila Fazekas6d227a42014-04-09 14:42:42 +0200235 else
236 EPEL_RPM=${RHEL6_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"}
237 fi
Ian Wienand531aeb72014-02-28 11:24:29 +1100238 if ! sudo yum repolist enabled epel | grep -q 'epel'; then
239 echo "EPEL not detected; installing"
Attila Fazekas6d227a42014-04-09 14:42:42 +0200240 yum_install ${EPEL_RPM} || \
Ian Wienand531aeb72014-02-28 11:24:29 +1100241 die $LINENO "Error installing EPEL repo, cannot continue"
242 fi
243
244 # ... and also optional to be enabled
245 is_package_installed yum-utils || install_package yum-utils
Brad P. Crochetc3599212014-06-16 10:27:19 -0400246 if [[ $DISTRO =~ (rhel7) ]]; then
247 OPTIONAL_REPO=rhel-7-server-optional-rpms
248 else
249 OPTIONAL_REPO=rhel-6-server-optional-rpms
250 fi
251 sudo yum-config-manager --enable ${OPTIONAL_REPO}
Ian Wienand531aeb72014-02-28 11:24:29 +1100252
253fi
254
255# Filesystem setup
256# ----------------
Dean Troyer23f69d82013-10-04 12:35:24 -0500257
Dean Troyere26232b2012-06-27 17:55:15 -0500258# Create the destination directory and ensure it is writable by the user
Bob Ball376b6312013-07-29 13:10:25 +0100259# and read/executable by everybody for daemons (e.g. apache run for horizon)
Dean Troyere26232b2012-06-27 17:55:15 -0500260sudo mkdir -p $DEST
Doug Hellmanne7002672013-09-05 08:10:07 -0400261safe_chown -R $STACK_USER $DEST
262safe_chmod 0755 $DEST
Dean Troyere26232b2012-06-27 17:55:15 -0500263
Ian Wienand0488edd2013-04-11 12:04:36 +1000264# a basic test for $DEST path permissions (fatal on error unless skipped)
265check_path_perm_sanity ${DEST}
266
Ben Nemec3ee52c82013-12-12 19:26:12 +0000267# Certain services such as rabbitmq require that the local hostname resolves
268# correctly. Make sure it exists in /etc/hosts so that is always true.
269LOCAL_HOSTNAME=`hostname -s`
270if [ -z "`grep ^127.0.0.1 /etc/hosts | grep $LOCAL_HOSTNAME`" ]; then
271 sudo sed -i "s/\(^127.0.0.1.*\)/\1 $LOCAL_HOSTNAME/" /etc/hosts
272fi
273
Ian Wienand531aeb72014-02-28 11:24:29 +1100274# Destination path for service data
275DATA_DIR=${DATA_DIR:-${DEST}/data}
276sudo mkdir -p $DATA_DIR
277safe_chown -R $STACK_USER $DATA_DIR
278
279
280# Common Configuration
281# --------------------
282
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500283# Set ``OFFLINE`` to ``True`` to configure ``stack.sh`` to run cleanly without
284# Internet access. ``stack.sh`` must have been previously run with Internet
285# access to install prerequisites and fetch repositories.
Dean Troyer25dab662011-12-16 22:40:46 -0600286OFFLINE=`trueorfalse False $OFFLINE`
287
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500288# Set ``ERROR_ON_CLONE`` to ``True`` to configure ``stack.sh`` to exit if
289# the destination git repository does not exist during the ``git_clone``
290# operation.
James E. Blair94cb9602012-06-22 15:28:29 -0700291ERROR_ON_CLONE=`trueorfalse False $ERROR_ON_CLONE`
292
Ben Nemec03997942013-08-10 09:56:16 -0500293# Whether to enable the debug log level in OpenStack services
294ENABLE_DEBUG_LOG_LEVEL=`trueorfalse True $ENABLE_DEBUG_LOG_LEVEL`
295
Vishvananda Ishayac9ad14b2012-07-03 20:29:01 +0000296# Set fixed and floating range here so we can make sure not to use addresses
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500297# from either range when attempting to guess the IP to use for the host.
298# Note that setting FIXED_RANGE may be necessary when running DevStack
Dean Troyerd81a0272012-08-31 18:04:55 -0500299# in an OpenStack cloud that uses either of these address ranges internally.
Salvatore Orlando90234ac2013-11-25 05:44:10 -0800300FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.0/24}
Dean Troyerd81a0272012-08-31 18:04:55 -0500301FIXED_RANGE=${FIXED_RANGE:-10.0.0.0/24}
302FIXED_NETWORK_SIZE=${FIXED_NETWORK_SIZE:-256}
Vishvananda Ishayac9ad14b2012-07-03 20:29:01 +0000303
Dean Troyerc892bde2013-03-13 14:06:13 -0500304HOST_IP=$(get_default_host_ip $FIXED_RANGE $FLOATING_RANGE "$HOST_IP_IFACE" "$HOST_IP")
305if [ "$HOST_IP" == "" ]; then
Newell Jensenccb3d102014-03-10 14:28:52 -0700306 die $LINENO "Could not determine host ip address. See local.conf for suggestions on setting HOST_IP."
Jesse Andrewsba23cc72011-09-11 03:22:13 -0700307fi
308
Anthony Young1097c7c2011-12-27 23:22:14 -0800309# Allow the use of an alternate hostname (such as localhost/127.0.0.1) for service endpoints.
310SERVICE_HOST=${SERVICE_HOST:-$HOST_IP}
Dean Troyercc6b4432013-04-08 15:38:03 -0500311
Dean Troyerdf0972c2012-03-07 17:31:03 -0600312# Configure services to use syslog instead of writing to individual log files
Dean Troyerff603ef2011-11-22 17:48:10 -0600313SYSLOG=`trueorfalse False $SYSLOG`
314SYSLOG_HOST=${SYSLOG_HOST:-$HOST_IP}
315SYSLOG_PORT=${SYSLOG_PORT:-516}
316
Sean Dague78096b52014-02-25 10:23:04 -0500317# for DSTAT logging
Sean Dague062cdaf2014-02-10 22:24:49 -0500318DSTAT_FILE=${DSTAT_FILE:-"dstat.txt"}
319
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500320# Use color for logging output (only available if syslog is not used)
Vishvananda Ishaya6f13ba32012-06-01 23:17:38 +0000321LOG_COLOR=`trueorfalse True $LOG_COLOR`
322
Dean Troyer2bbcd682011-11-05 16:19:03 -0500323# Service startup timeout
324SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60}
325
Jamie Lennoxbd24a8d2013-09-20 16:26:42 +1000326# Reset the bundle of CA certificates
327SSL_BUNDLE_FILE="$DATA_DIR/ca-bundle.pem"
328rm -f $SSL_BUNDLE_FILE
329
Dean Troyerd81a0272012-08-31 18:04:55 -0500330
331# Configure Projects
332# ==================
333
Brant Knudson0049c0c2014-01-16 18:16:48 -0600334# Import apache functions
zhang-hared98a5d02013-06-21 18:18:02 +0800335source $TOP_DIR/lib/apache
Brant Knudson0049c0c2014-01-16 18:16:48 -0600336
337# Import TLS functions
Dean Troyerc83a7e12012-11-29 11:47:58 -0600338source $TOP_DIR/lib/tls
Brant Knudson0049c0c2014-01-16 18:16:48 -0600339
340# Source project function libraries
Sean Dague0392a102013-07-31 13:07:45 -0400341source $TOP_DIR/lib/infra
Sean Dague1b6b5312013-07-31 06:46:34 -0400342source $TOP_DIR/lib/oslo
Sean Dague68322722013-10-21 18:11:40 -0400343source $TOP_DIR/lib/stackforge
Sean Dagueb562e6a2012-11-19 16:00:01 -0500344source $TOP_DIR/lib/horizon
Dean Troyerd81a0272012-08-31 18:04:55 -0500345source $TOP_DIR/lib/keystone
Dean Troyer73f6f252012-09-17 11:22:21 -0500346source $TOP_DIR/lib/glance
Dean Troyerbf67c192012-09-21 15:09:37 -0500347source $TOP_DIR/lib/nova
Dean Troyerd81a0272012-08-31 18:04:55 -0500348source $TOP_DIR/lib/cinder
Attila Fazekasece6a332012-11-29 14:19:41 +0100349source $TOP_DIR/lib/swift
Dean Troyerd81a0272012-08-31 18:04:55 -0500350source $TOP_DIR/lib/ceilometer
351source $TOP_DIR/lib/heat
Mark McClainb05c8762013-07-06 23:29:39 -0400352source $TOP_DIR/lib/neutron
Devananda van der Veenf35cf912012-11-12 17:58:38 -0800353source $TOP_DIR/lib/baremetal
Brad Topolf127e2f2013-01-22 10:17:50 -0600354source $TOP_DIR/lib/ldap
Dean Troyerd81a0272012-08-31 18:04:55 -0500355
Dean Troyercdf3d762013-10-15 09:42:43 -0500356# Extras Source
357# --------------
358
359# Phase: source
360if [[ -d $TOP_DIR/extras.d ]]; then
361 for i in $TOP_DIR/extras.d/*.sh; do
362 [[ -r $i ]] && source $i source
363 done
364fi
365
Dean Troyer1a6d4492013-06-03 16:47:36 -0500366# Set the destination directories for other OpenStack projects
Dean Troyer9f61d292012-11-26 18:56:20 +0000367OPENSTACKCLIENT_DIR=$DEST/python-openstackclient
Dean Troyerb7490da2013-03-18 16:07:56 -0500368
369# Interactive Configuration
370# -------------------------
371
372# Do all interactive config up front before the logging spew begins
James E. Blair213c4162012-11-06 09:38:36 +0100373
Anthony Young7a549f42011-10-12 07:13:13 +0000374# Generic helper to configure passwords
375function read_password {
Dean Troyer7903b792012-09-13 17:16:12 -0500376 XTRACE=$(set +o | grep xtrace)
Anthony Young7a549f42011-10-12 07:13:13 +0000377 set +o xtrace
378 var=$1; msg=$2
379 pw=${!var}
380
Sahid Orentino Ferdjaoui9e032c22014-02-10 11:36:25 +0100381 if [[ -f $RC_DIR/localrc ]]; then
382 localrc=$TOP_DIR/localrc
383 else
384 localrc=$TOP_DIR/.localrc.auto
385 fi
Anthony Young6015c822011-10-12 07:17:11 +0000386
Anthony Young7a549f42011-10-12 07:13:13 +0000387 # If the password is not defined yet, proceed to prompt user for a password.
388 if [ ! $pw ]; then
389 # If there is no localrc file, create one
Anthony Youngb4db2252011-10-12 14:08:08 -0700390 if [ ! -e $localrc ]; then
391 touch $localrc
Anthony Young7a549f42011-10-12 07:13:13 +0000392 fi
393
Vishvananda Ishaya9b353672011-10-20 10:07:10 -0700394 # Presumably if we got this far it can only be that our localrc is missing
Anthony Young7a549f42011-10-12 07:13:13 +0000395 # the required password. Prompt user for a password and write to localrc.
Anthony Youngb4db2252011-10-12 14:08:08 -0700396 echo ''
397 echo '################################################################################'
398 echo $msg
399 echo '################################################################################'
Dean Troyer4e6a2b72011-12-29 17:27:45 -0600400 echo "This value will be written to your localrc file so you don't have to enter it "
401 echo "again. Use only alphanumeric characters."
Anthony Youngb4db2252011-10-12 14:08:08 -0700402 echo "If you leave this blank, a random default value will be used."
Dean Troyer4e6a2b72011-12-29 17:27:45 -0600403 pw=" "
404 while true; do
405 echo "Enter a password now:"
406 read -e $var
407 pw=${!var}
408 [[ "$pw" = "`echo $pw | tr -cd [:alnum:]`" ]] && break
409 echo "Invalid chars in password. Try again:"
410 done
Anthony Youngb4db2252011-10-12 14:08:08 -0700411 if [ ! $pw ]; then
Ian Wienand26a28b42014-05-14 14:10:47 +1000412 pw=$(cat /dev/urandom | tr -cd 'a-f0-9' | head -c 20)
Anthony Young7a549f42011-10-12 07:13:13 +0000413 fi
Anthony Youngb4db2252011-10-12 14:08:08 -0700414 eval "$var=$pw"
415 echo "$var=$pw" >> $localrc
Anthony Young7a549f42011-10-12 07:13:13 +0000416 fi
Dean Troyer7903b792012-09-13 17:16:12 -0500417 $XTRACE
Anthony Young7a549f42011-10-12 07:13:13 +0000418}
419
Dean Troyer13dc5cc2012-03-27 14:50:45 -0500420
Dean Troyerb9182d62012-11-07 12:31:34 -0600421# Database Configuration
Dean Troyerb9182d62012-11-07 12:31:34 -0600422
Dean Troyerafc29fe2013-02-07 15:56:24 -0600423# To select between database backends, add the following to ``localrc``:
Terry Wilson428af5a2012-11-01 16:12:39 -0400424#
Dean Troyerafc29fe2013-02-07 15:56:24 -0600425# disable_service mysql
426# enable_service postgresql
Terry Wilson428af5a2012-11-01 16:12:39 -0400427#
Dean Troyerafc29fe2013-02-07 15:56:24 -0600428# The available database backends are listed in ``DATABASE_BACKENDS`` after
429# ``lib/database`` is sourced. ``mysql`` is the default.
Terry Wilson428af5a2012-11-01 16:12:39 -0400430
431initialize_database_backends && echo "Using $DATABASE_TYPE database backend" || echo "No database enabled"
432
Dean Troyerb9182d62012-11-07 12:31:34 -0600433
Dean Troyerb7490da2013-03-18 16:07:56 -0500434# Queue Configuration
Jesse Andrews782b9912011-10-02 16:53:21 -0400435
Anthony Younga8416442011-09-13 20:07:44 -0700436# Rabbit connection info
Russell Bryant4a221452012-03-13 13:44:12 -0400437if is_service_enabled rabbit; then
Bob Balle309e5a2014-04-01 16:28:36 +0100438 RABBIT_HOST=${RABBIT_HOST:-$SERVICE_HOST}
Russell Bryant4a221452012-03-13 13:44:12 -0400439 read_password RABBIT_PASSWORD "ENTER A PASSWORD TO USE FOR RABBIT."
440fi
Jesse Andrewsba23cc72011-09-11 03:22:13 -0700441
Dean Troyerb7490da2013-03-18 16:07:56 -0500442
443# Keystone
444
445if is_service_enabled key; then
446 # The ``SERVICE_TOKEN`` is used to bootstrap the Keystone database. It is
447 # just a string and is not a 'real' Keystone token.
448 read_password SERVICE_TOKEN "ENTER A SERVICE_TOKEN TO USE FOR THE SERVICE ADMIN TOKEN."
449 # Services authenticate to Identity with servicename/``SERVICE_PASSWORD``
450 read_password SERVICE_PASSWORD "ENTER A SERVICE_PASSWORD TO USE FOR THE SERVICE AUTHENTICATION."
451 # Horizon currently truncates usernames and passwords at 20 characters
452 read_password ADMIN_PASSWORD "ENTER A PASSWORD TO USE FOR HORIZON AND KEYSTONE (20 CHARS OR LESS)."
453
454 # Keystone can now optionally install OpenLDAP by enabling the ``ldap``
455 # service in ``localrc`` (e.g. ``enable_service ldap``).
456 # To clean out the Keystone contents in OpenLDAP set ``KEYSTONE_CLEAR_LDAP``
457 # to ``yes`` (e.g. ``KEYSTONE_CLEAR_LDAP=yes``) in ``localrc``. To enable the
458 # Keystone Identity Driver (``keystone.identity.backends.ldap.Identity``)
459 # set ``KEYSTONE_IDENTITY_BACKEND`` to ``ldap`` (e.g.
460 # ``KEYSTONE_IDENTITY_BACKEND=ldap``) in ``localrc``.
461
462 # only request ldap password if the service is enabled
463 if is_service_enabled ldap; then
464 read_password LDAP_PASSWORD "ENTER A PASSWORD TO USE FOR LDAP"
Chmouel Boudjnah6ae9ea52012-07-05 06:50:51 +0000465 fi
Dean Troyerb7490da2013-03-18 16:07:56 -0500466fi
467
468
469# Swift
470
471if is_service_enabled s-proxy; then
Chmouel Boudjnah77b0e1d2012-02-29 16:55:43 +0000472 # We only ask for Swift Hash if we have enabled swift service.
Dean Troyerb9182d62012-11-07 12:31:34 -0600473 # ``SWIFT_HASH`` is a random unique string for a swift cluster that
Chmouel Boudjnahb2857e42011-11-03 16:19:14 +0100474 # can never change.
475 read_password SWIFT_HASH "ENTER A RANDOM SWIFT HASH."
476fi
Vishvananda Ishaya5f039322011-11-05 16:12:20 -0700477
Dean Troyerdf0972c2012-03-07 17:31:03 -0600478
Dean Troyerb7490da2013-03-18 16:07:56 -0500479# Configure logging
480# -----------------
Dean Troyer471de7a2011-12-27 11:45:55 -0600481
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700482# Draw a spinner so the user knows something is happening
Ian Wienandaee18c72014-02-21 15:35:08 +1100483function spinner {
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700484 local delay=0.75
Dean Troyerb9182d62012-11-07 12:31:34 -0600485 local spinstr='/-\|'
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700486 printf "..." >&3
487 while [ true ]; do
488 local temp=${spinstr#?}
489 printf "[%c]" "$spinstr" >&3
490 local spinstr=$temp${spinstr%"$temp"}
491 sleep $delay
492 printf "\b\b\b" >&3
493 done
494}
495
Roger Luethide56ee12014-04-26 14:21:33 +0200496function kill_spinner {
497 if [ ! -z "$LAST_SPINNER_PID" ]; then
498 kill >/dev/null 2>&1 $LAST_SPINNER_PID
499 printf "\b\b\bdone\n" >&3
500 fi
501}
502
Dean Troyer7903b792012-09-13 17:16:12 -0500503# Echo text to the log file, summary log file and stdout
504# echo_summary "something to say"
Ian Wienandaee18c72014-02-21 15:35:08 +1100505function echo_summary {
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700506 if [[ -t 3 && "$VERBOSE" != "True" ]]; then
Roger Luethide56ee12014-04-26 14:21:33 +0200507 kill_spinner
Dean Troyerafc29fe2013-02-07 15:56:24 -0600508 echo -n -e $@ >&6
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700509 spinner &
510 LAST_SPINNER_PID=$!
511 else
Dean Troyerafc29fe2013-02-07 15:56:24 -0600512 echo -e $@ >&6
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700513 fi
Dean Troyer7903b792012-09-13 17:16:12 -0500514}
515
516# Echo text only to stdout, no log files
517# echo_nolog "something not for the logs"
Ian Wienandaee18c72014-02-21 15:35:08 +1100518function echo_nolog {
Dean Troyer7903b792012-09-13 17:16:12 -0500519 echo $@ >&3
520}
521
Ian Wienandf565bf22014-07-17 14:50:29 +1000522if [[ is_fedora && $DISTRO =~ (rhel) ]]; then
523 # poor old python2.6 doesn't have argparse by default, which
524 # outfilter.py uses
525 is_package_installed python-argparse || install_package python-argparse
526fi
527
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500528# Set up logging for ``stack.sh``
529# Set ``LOGFILE`` to turn on logging
530# Append '.xxxxxxxx' to the given name to maintain history
531# where 'xxxxxxxx' is a representation of the date the file was created
Dean Troyer33cb4302012-12-10 16:47:36 -0600532TIMESTAMP_FORMAT=${TIMESTAMP_FORMAT:-"%F-%H%M%S"}
Chmouel Boudjnahd966ed22012-03-05 12:42:48 +0000533if [[ -n "$LOGFILE" || -n "$SCREEN_LOGDIR" ]]; then
534 LOGDAYS=${LOGDAYS:-7}
Chmouel Boudjnahd966ed22012-03-05 12:42:48 +0000535 CURRENT_LOG_TIME=$(date "+$TIMESTAMP_FORMAT")
536fi
537
Dean Troyer471de7a2011-12-27 11:45:55 -0600538if [[ -n "$LOGFILE" ]]; then
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500539 # First clean up old log files. Use the user-specified ``LOGFILE``
Dean Troyer471de7a2011-12-27 11:45:55 -0600540 # as the template to search for, appending '.*' to match the date
541 # we added on earlier runs.
Dean Troyer471de7a2011-12-27 11:45:55 -0600542 LOGDIR=$(dirname "$LOGFILE")
David Ripton406019a2013-03-06 09:58:39 -0500543 LOGFILENAME=$(basename "$LOGFILE")
Chmouel Boudjnahfff6fec2012-03-09 15:37:56 +0000544 mkdir -p $LOGDIR
David Ripton406019a2013-03-06 09:58:39 -0500545 find $LOGDIR -maxdepth 1 -name $LOGFILENAME.\* -mtime +$LOGDAYS -exec rm {} \;
Chmouel Boudjnahd966ed22012-03-05 12:42:48 +0000546 LOGFILE=$LOGFILE.${CURRENT_LOG_TIME}
Dean Troyer7903b792012-09-13 17:16:12 -0500547 SUMFILE=$LOGFILE.${CURRENT_LOG_TIME}.summary
548
549 # Redirect output according to config
Dean Troyerb9182d62012-11-07 12:31:34 -0600550
Jun Wu8710b652014-04-28 20:36:08 +0800551 # Set fd 3 to a copy of stdout. So we can set fd 1 without losing
552 # stdout later.
Dean Troyer7903b792012-09-13 17:16:12 -0500553 exec 3>&1
554 if [[ "$VERBOSE" == "True" ]]; then
Jun Wu8710b652014-04-28 20:36:08 +0800555 # Set fd 1 and 2 to write the log file
Mauro S. M. Rodriguesdae11522014-06-17 01:10:54 +0000556 exec 1> >( $TOP_DIR/tools/outfilter.py -v -o "${LOGFILE}" ) 2>&1
Jun Wu8710b652014-04-28 20:36:08 +0800557 # Set fd 6 to summary log file
Mauro S. M. Rodriguesdae11522014-06-17 01:10:54 +0000558 exec 6> >( $TOP_DIR/tools/outfilter.py -o "${SUMFILE}" )
Dean Troyer7903b792012-09-13 17:16:12 -0500559 else
560 # Set fd 1 and 2 to primary logfile
Mauro S. M. Rodriguesdae11522014-06-17 01:10:54 +0000561 exec 1> >( $TOP_DIR/tools/outfilter.py -o "${LOGFILE}" ) 2>&1
Dean Troyer7903b792012-09-13 17:16:12 -0500562 # Set fd 6 to summary logfile and stdout
Mauro S. M. Rodriguesdae11522014-06-17 01:10:54 +0000563 exec 6> >( $TOP_DIR/tools/outfilter.py -v -o "${SUMFILE}" >&3 )
Dean Troyer7903b792012-09-13 17:16:12 -0500564 fi
565
566 echo_summary "stack.sh log $LOGFILE"
Dean Troyer471de7a2011-12-27 11:45:55 -0600567 # Specified logfile name always links to the most recent log
David Ripton406019a2013-03-06 09:58:39 -0500568 ln -sf $LOGFILE $LOGDIR/$LOGFILENAME
569 ln -sf $SUMFILE $LOGDIR/$LOGFILENAME.summary
Dean Troyer7903b792012-09-13 17:16:12 -0500570else
571 # Set up output redirection without log files
Jun Wu8710b652014-04-28 20:36:08 +0800572 # Set fd 3 to a copy of stdout. So we can set fd 1 without losing
573 # stdout later.
Dean Troyer7903b792012-09-13 17:16:12 -0500574 exec 3>&1
Eric Windischefdf3ff2012-09-24 12:47:44 -0400575 if [[ "$VERBOSE" != "True" ]]; then
Dean Troyer7903b792012-09-13 17:16:12 -0500576 # Throw away stdout and stderr
577 exec 1>/dev/null 2>&1
578 fi
579 # Always send summary fd to original stdout
Mauro S. M. Rodriguesdae11522014-06-17 01:10:54 +0000580 exec 6> >( $TOP_DIR/tools/outfilter.py -v >&3 )
Dean Troyer471de7a2011-12-27 11:45:55 -0600581fi
582
Chmouel Boudjnahd966ed22012-03-05 12:42:48 +0000583# Set up logging of screen windows
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500584# Set ``SCREEN_LOGDIR`` to turn on logging of screen windows to the
585# directory specified in ``SCREEN_LOGDIR``, we will log to the the file
586# ``screen-$SERVICE_NAME-$TIMESTAMP.log`` in that dir and have a link
587# ``screen-$SERVICE_NAME.log`` to the latest log file.
588# Logs are kept for as long specified in ``LOGDAYS``.
Chmouel Boudjnahd966ed22012-03-05 12:42:48 +0000589if [[ -n "$SCREEN_LOGDIR" ]]; then
590
591 # We make sure the directory is created.
592 if [[ -d "$SCREEN_LOGDIR" ]]; then
593 # We cleanup the old logs
594 find $SCREEN_LOGDIR -maxdepth 1 -name screen-\*.log -mtime +$LOGDAYS -exec rm {} \;
595 else
596 mkdir -p $SCREEN_LOGDIR
597 fi
598fi
599
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500600
601# Set Up Script Execution
602# -----------------------
603
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700604# Kill background processes on exit
Dean Troyera25a6f62014-02-24 16:03:41 -0600605trap exit_trap EXIT
606function exit_trap {
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700607 local r=$?
Dean Troyer94b9e822014-02-27 11:13:36 -0600608 jobs=$(jobs -p)
Dean Troyera3935fb2014-03-21 13:00:32 -0500609 # Only do the kill when we're logging through a process substitution,
610 # which currently is only to verbose logfile
611 if [[ -n $jobs && -n "$LOGFILE" && "$VERBOSE" == "True" ]]; then
Dean Troyer94b9e822014-02-27 11:13:36 -0600612 echo "exit_trap: cleaning up child processes"
613 kill 2>&1 $jobs
614 fi
Roger Luethide56ee12014-04-26 14:21:33 +0200615
616 # Kill the last spinner process
617 kill_spinner
618
Sean Dague97fcc7b2014-06-16 17:24:14 -0400619 if [[ $r -ne 0 ]]; then
620 echo "Error on exit"
621 ./tools/worlddump.py -d $LOGDIR
622 fi
623
Vishvananda Ishaya7879a3c2012-09-21 15:36:06 -0700624 exit $r
625}
626
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500627# Exit on any errors so that errors don't compound
Dean Troyera25a6f62014-02-24 16:03:41 -0600628trap err_trap ERR
629function err_trap {
Scott Moserf9da5082011-10-07 21:28:00 -0400630 local r=$?
631 set +o xtrace
Dean Troyera25a6f62014-02-24 16:03:41 -0600632 if [[ -n "$LOGFILE" ]]; then
633 echo "${0##*/} failed: full log in $LOGFILE"
634 else
635 echo "${0##*/} failed"
636 fi
Scott Moserf9da5082011-10-07 21:28:00 -0400637 exit $r
638}
639
Sean Dague09bd7c82014-02-03 08:35:26 +0900640
641set -o errexit
642
Scott Moserf9da5082011-10-07 21:28:00 -0400643# Print the commands being run so that we can see the command that triggers
644# an error. It is also useful for following along as the install occurs.
645set -o xtrace
646
Dean Troyer1a6d4492013-06-03 16:47:36 -0500647
Jesse Andrews30f68e92011-09-13 00:59:54 -0700648# Install Packages
Jesse Andrewsd74257d2011-09-13 01:24:50 -0700649# ================
Dean Troyer7d28a0e2012-06-27 17:55:52 -0500650
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500651# OpenStack uses a fair number of other projects.
Jesse Andrews30f68e92011-09-13 00:59:54 -0700652
Dean Troyer7d28a0e2012-06-27 17:55:52 -0500653# Install package requirements
Dean Troyer48352ee2012-12-12 12:50:38 -0600654# Source it so the entire environment is available
Dean Troyer7903b792012-09-13 17:16:12 -0500655echo_summary "Installing package prerequisites"
Dean Troyer48352ee2012-12-12 12:50:38 -0600656source $TOP_DIR/tools/install_prereqs.sh
Monty Taylor47f02062012-07-26 11:09:24 -0500657
Dean Troyer62d1d692013-08-01 17:40:40 -0500658# Configure an appropriate python environment
Arata Notsu8b5d3cf2013-10-17 21:42:49 +0900659if [[ "$OFFLINE" != "True" ]]; then
Franck Yelles683ff422014-06-19 02:14:42 -0700660 PYPI_ALTERNATIVE_URL=$PYPI_ALTERNATIVE_URL $TOP_DIR/tools/install_pip.sh
Arata Notsu8b5d3cf2013-10-17 21:42:49 +0900661fi
Dean Troyer1a6d4492013-06-03 16:47:36 -0500662
Gael Chamoulaudd3121f62014-07-24 23:53:02 +0200663# Do the ugly hacks for broken packages and distros
Dean Troyer9acc12a2013-08-09 15:09:31 -0500664$TOP_DIR/tools/fixup_stuff.sh
665
Dean Troyer5c3a63e2014-07-09 11:27:42 -0500666
667# Extras Pre-install
668# ------------------
669
670# Phase: pre-install
671if [[ -d $TOP_DIR/extras.d ]]; then
672 for i in $TOP_DIR/extras.d/*.sh; do
673 [[ -r $i ]] && source $i stack pre-install
674 done
675fi
676
677
Dean Troyer62d1d692013-08-01 17:40:40 -0500678install_rpc_backend
679
680if is_service_enabled $DATABASE_BACKENDS; then
681 install_database
682fi
683
684if is_service_enabled neutron; then
685 install_neutron_agent_packages
686fi
687
Monty Taylor47f02062012-07-26 11:09:24 -0500688TRACK_DEPENDS=${TRACK_DEPENDS:-False}
689
690# Install python packages into a virtualenv so that we can track them
Dean Troyercc6b4432013-04-08 15:38:03 -0500691if [[ $TRACK_DEPENDS = True ]]; then
Dean Troyer7903b792012-09-13 17:16:12 -0500692 echo_summary "Installing Python packages into a virtualenv $DEST/.venv"
Sean Dague6c844632013-07-31 06:50:14 -0400693 pip_install -U virtualenv
Monty Taylor47f02062012-07-26 11:09:24 -0500694
695 rm -rf $DEST/.venv
696 virtualenv --system-site-packages $DEST/.venv
697 source $DEST/.venv/bin/activate
698 $DEST/.venv/bin/pip freeze > $DEST/requires-pre-pip
699fi
700
Dean Troyerfe51a902013-04-01 15:48:44 -0500701# Check Out and Install Source
702# ----------------------------
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500703
Dean Troyer7903b792012-09-13 17:16:12 -0500704echo_summary "Installing OpenStack project source"
705
Sean Dague0392a102013-07-31 13:07:45 -0400706# Install required infra support libraries
707install_infra
Monty Taylor5e159492013-05-08 14:29:52 -0400708
Sean Dague1b6b5312013-07-31 06:46:34 -0400709# Install oslo libraries that have graduated
710install_oslo
711
Sean Dague68322722013-10-21 18:11:40 -0400712# Install stackforge libraries for testing
Sean Daguef7cfa0c2013-10-25 13:26:17 -0400713if is_service_enabled stackforge_libs; then
714 install_stackforge
715fi
Sean Dague68322722013-10-21 18:11:40 -0400716
Dean Troyerfe51a902013-04-01 15:48:44 -0500717# Install clients libraries
Dean Troyerd81a0272012-08-31 18:04:55 -0500718install_keystoneclient
Dean Troyer73f6f252012-09-17 11:22:21 -0500719install_glanceclient
Dean Troyer253a1a32013-04-01 18:23:22 -0500720install_cinderclient
Dean Troyerbf67c192012-09-21 15:09:37 -0500721install_novaclient
Sean Dague75195b52013-07-25 15:38:09 -0400722if is_service_enabled swift glance horizon; then
Dean Troyerfe51a902013-04-01 15:48:44 -0500723 install_swiftclient
724fi
Sean Dague75195b52013-07-25 15:38:09 -0400725if is_service_enabled neutron nova horizon; then
Mark McClainb05c8762013-07-06 23:29:39 -0400726 install_neutronclient
Dean Troyerfe51a902013-04-01 15:48:44 -0500727fi
Sean Dague75195b52013-07-25 15:38:09 -0400728if is_service_enabled heat horizon; then
729 install_heatclient
730fi
Dean Troyerfe51a902013-04-01 15:48:44 -0500731
Morgan Fainberg58936fd2014-06-24 12:26:07 -0700732# Install middleware
733install_keystonemiddleware
734
Dean Troyer9f61d292012-11-26 18:56:20 +0000735git_clone $OPENSTACKCLIENT_REPO $OPENSTACKCLIENT_DIR $OPENSTACKCLIENT_BRANCH
Dean Troyer253a1a32013-04-01 18:23:22 -0500736setup_develop $OPENSTACKCLIENT_DIR
Dean Troyer9f61d292012-11-26 18:56:20 +0000737
Dean Troyerfe51a902013-04-01 15:48:44 -0500738if is_service_enabled key; then
Bartosz Górski0abde392014-02-28 14:15:19 +0100739 if [ "$KEYSTONE_AUTH_HOST" == "$SERVICE_HOST" ]; then
740 install_keystone
741 configure_keystone
742 fi
Jesse Andrews38df1222011-11-20 09:55:44 -0800743fi
Attila Fazekasece6a332012-11-29 14:19:41 +0100744
Chmouel Boudjnah0c3a5582013-03-06 10:58:33 +0100745if is_service_enabled s-proxy; then
Attila Fazekasece6a332012-11-29 14:19:41 +0100746 install_swift
Dean Troyerfe51a902013-04-01 15:48:44 -0500747 configure_swift
748
rahmu9d2647a2013-04-24 10:40:07 +0200749 # swift3 middleware to provide S3 emulation to Swift
Chmouel Boudjnah6ae9ea52012-07-05 06:50:51 +0000750 if is_service_enabled swift3; then
rahmu9d2647a2013-04-24 10:40:07 +0200751 # replace the nova-objectstore port by the swift port
752 S3_SERVICE_PORT=8080
Chmouel Boudjnah6ae9ea52012-07-05 06:50:51 +0000753 git_clone $SWIFT3_REPO $SWIFT3_DIR $SWIFT3_BRANCH
Dean Troyerfe51a902013-04-01 15:48:44 -0500754 setup_develop $SWIFT3_DIR
Chmouel Boudjnah6ae9ea52012-07-05 06:50:51 +0000755 fi
James E. Blaire7ce24f2011-11-10 13:05:13 -0800756fi
Attila Fazekasece6a332012-11-29 14:19:41 +0100757
Chmouel Boudjnaha6651e92012-02-16 10:16:52 +0000758if is_service_enabled g-api n-api; then
James E. Blaire7ce24f2011-11-10 13:05:13 -0800759 # image catalog service
Dean Troyer73f6f252012-09-17 11:22:21 -0500760 install_glance
Dean Troyerfe51a902013-04-01 15:48:44 -0500761 configure_glance
James E. Blaire7ce24f2011-11-10 13:05:13 -0800762fi
Dean Troyerfe51a902013-04-01 15:48:44 -0500763
764if is_service_enabled cinder; then
765 install_cinder
766 configure_cinder
767fi
768
Mark McClainb05c8762013-07-06 23:29:39 -0400769if is_service_enabled neutron; then
770 install_neutron
771 install_neutron_third_party
Dean Troyerfe51a902013-04-01 15:48:44 -0500772fi
773
Dean Troyerbf67c192012-09-21 15:09:37 -0500774if is_service_enabled nova; then
775 # compute service
776 install_nova
Dean Troyerfe51a902013-04-01 15:48:44 -0500777 cleanup_nova
778 configure_nova
Dean Troyerbf67c192012-09-21 15:09:37 -0500779fi
Dean Troyerfe51a902013-04-01 15:48:44 -0500780
Chmouel Boudjnaha6651e92012-02-16 10:16:52 +0000781if is_service_enabled horizon; then
Zhenguo Niue385d1e2014-03-12 16:58:12 +0800782 # django openstack_auth
783 install_django_openstack_auth
Sean Dagueb562e6a2012-11-19 16:00:01 -0500784 # dashboard
785 install_horizon
Dean Troyerfe51a902013-04-01 15:48:44 -0500786 configure_horizon
James E. Blaire7ce24f2011-11-10 13:05:13 -0800787fi
Dean Troyerfe51a902013-04-01 15:48:44 -0500788
John H. Tran93361642012-07-26 11:22:05 -0700789if is_service_enabled ceilometer; then
Yunhong, Jiange583d9b2013-01-09 09:33:07 +0800790 install_ceilometerclient
John H. Tran93361642012-07-26 11:22:05 -0700791 install_ceilometer
Attila Fazekas12bb53b2013-07-25 23:02:48 +0200792 echo_summary "Configuring Ceilometer"
793 configure_ceilometer
John H. Tran93361642012-07-26 11:22:05 -0700794fi
Dean Troyer4a43b7b2012-08-28 17:43:40 -0500795
Steve Bakerbfdad752012-08-18 09:00:42 +1200796if is_service_enabled heat; then
Sean Dagued644e232013-07-25 15:34:48 -0400797 install_heat
Steve Bakerc3249082013-04-09 13:41:47 +1200798 cleanup_heat
Steve Bakerbfdad752012-08-18 09:00:42 +1200799 configure_heat
800fi
Dean Troyerb7490da2013-03-18 16:07:56 -0500801
Dean Troyerfe51a902013-04-01 15:48:44 -0500802if is_service_enabled tls-proxy; then
803 configure_CA
804 init_CA
805 init_cert
806 # Add name to /etc/hosts
807 # don't be naive and add to existing line!
Dean Troyer67787e62012-05-02 11:48:15 -0500808fi
Jesse Andrewsba23cc72011-09-11 03:22:13 -0700809
Roman Prykhodchenkoce696b62013-08-09 10:40:45 +0300810
Dean Troyercdf3d762013-10-15 09:42:43 -0500811# Extras Install
812# --------------
813
814# Phase: install
815if [[ -d $TOP_DIR/extras.d ]]; then
816 for i in $TOP_DIR/extras.d/*.sh; do
817 [[ -r $i ]] && source $i stack install
818 done
819fi
820
Dean Troyercc6b4432013-04-08 15:38:03 -0500821if [[ $TRACK_DEPENDS = True ]]; then
Monty Taylor47f02062012-07-26 11:09:24 -0500822 $DEST/.venv/bin/pip freeze > $DEST/requires-post-pip
Dean Troyercc6b4432013-04-08 15:38:03 -0500823 if ! diff -Nru $DEST/requires-pre-pip $DEST/requires-post-pip > $DEST/requires.diff; then
DennyZhange8fa8532013-11-03 12:22:04 -0600824 echo "Detect some changes for installed packages of pip, in depend tracking mode"
Monty Taylor47f02062012-07-26 11:09:24 -0500825 cat $DEST/requires.diff
826 fi
827 echo "Ran stack.sh in depend tracking mode, bailing out now"
828 exit 0
829fi
Dean Troyerdf0972c2012-03-07 17:31:03 -0600830
Dean Troyerb7490da2013-03-18 16:07:56 -0500831
Dean Troyerff603ef2011-11-22 17:48:10 -0600832# Syslog
Dean Troyerdf0972c2012-03-07 17:31:03 -0600833# ------
Dean Troyerff603ef2011-11-22 17:48:10 -0600834
835if [[ $SYSLOG != "False" ]]; then
Dean Troyerff603ef2011-11-22 17:48:10 -0600836 if [[ "$SYSLOG_HOST" = "$HOST_IP" ]]; then
837 # Configure the master host to receive
838 cat <<EOF >/tmp/90-stack-m.conf
839\$ModLoad imrelp
840\$InputRELPServerRun $SYSLOG_PORT
841EOF
842 sudo mv /tmp/90-stack-m.conf /etc/rsyslog.d
843 else
844 # Set rsyslog to send to remote host
845 cat <<EOF >/tmp/90-stack-s.conf
846*.* :omrelp:$SYSLOG_HOST:$SYSLOG_PORT
847EOF
848 sudo mv /tmp/90-stack-s.conf /etc/rsyslog.d
849 fi
cloudnulle4859f02013-05-28 14:10:58 -0500850
851 RSYSLOGCONF="/etc/rsyslog.conf"
852 if [ -f $RSYSLOGCONF ]; then
853 sudo cp -b $RSYSLOGCONF $RSYSLOGCONF.bak
854 if [[ $(grep '$SystemLogRateLimitBurst' $RSYSLOGCONF) ]]; then
855 sudo sed -i 's/$SystemLogRateLimitBurst\ .*/$SystemLogRateLimitBurst\ 0/' $RSYSLOGCONF
856 else
857 sudo sed -i '$ i $SystemLogRateLimitBurst\ 0' $RSYSLOGCONF
858 fi
859 if [[ $(grep '$SystemLogRateLimitInterval' $RSYSLOGCONF) ]]; then
860 sudo sed -i 's/$SystemLogRateLimitInterval\ .*/$SystemLogRateLimitInterval\ 0/' $RSYSLOGCONF
861 else
862 sudo sed -i '$ i $SystemLogRateLimitInterval\ 0' $RSYSLOGCONF
863 fi
864 fi
865
Dean Troyer7903b792012-09-13 17:16:12 -0500866 echo_summary "Starting rsyslog"
Dean Troyer13dc5cc2012-03-27 14:50:45 -0500867 restart_service rsyslog
Dean Troyerff603ef2011-11-22 17:48:10 -0600868fi
869
Dean Troyerdf0972c2012-03-07 17:31:03 -0600870
Joe Gordone5d92382012-09-13 17:19:03 -0700871# Finalize queue installation
872# ----------------------------
Akihiro MOTOKIb0f1c382013-01-13 17:58:12 +0900873restart_rpc_backend
Jesse Andrewsba23cc72011-09-11 03:22:13 -0700874
Dean Troyerdf0972c2012-03-07 17:31:03 -0600875
Jamie Lennoxbd24a8d2013-09-20 16:26:42 +1000876# Export Certicate Authority Bundle
877# ---------------------------------
878
879# If certificates were used and written to the SSL bundle file then these
880# should be exported so clients can validate their connections.
881
882if [ -f $SSL_BUNDLE_FILE ]; then
883 export OS_CACERT=$SSL_BUNDLE_FILE
884fi
885
886
Terry Wilson428af5a2012-11-01 16:12:39 -0400887# Configure database
888# ------------------
Dean Troyerb9182d62012-11-07 12:31:34 -0600889
Terry Wilson428af5a2012-11-01 16:12:39 -0400890if is_service_enabled $DATABASE_BACKENDS; then
891 configure_database
Jesse Andrews24859062011-09-15 21:28:23 -0700892fi
893
Dean Troyerb9182d62012-11-07 12:31:34 -0600894
895# Configure screen
896# ----------------
897
Dean Troyer681f3fd2013-02-27 19:00:39 -0600898USE_SCREEN=$(trueorfalse True $USE_SCREEN)
899if [[ "$USE_SCREEN" == "True" ]]; then
900 # Create a new named screen to run processes in
901 screen -d -m -S $SCREEN_NAME -t shell -s /bin/bash
902 sleep 1
903
904 # Set a reasonable status bar
905 if [ -z "$SCREEN_HARDSTATUS" ]; then
906 SCREEN_HARDSTATUS='%{= .} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
907 fi
908 screen -r $SCREEN_NAME -X hardstatus alwayslastline "$SCREEN_HARDSTATUS"
Steven Dake30396572013-06-30 16:11:54 -0700909 screen -r $SCREEN_NAME -X setenv PROMPT_COMMAND /bin/true
Josh Kearney0a7a41e2012-04-04 17:47:56 -0500910fi
911
Jiajun Liu61bb2c12012-10-19 09:48:30 +0800912# Clear screen rc file
913SCREENRC=$TOP_DIR/$SCREEN_NAME-screenrc
914if [[ -e $SCREENRC ]]; then
Jiajun Liu8e58c072013-07-17 06:41:50 +0000915 rm -f $SCREENRC
Jiajun Liu61bb2c12012-10-19 09:48:30 +0800916fi
Dean Troyerb9182d62012-11-07 12:31:34 -0600917
jiajun xua9414242012-12-06 16:30:57 +0800918# Initialize the directory for service status check
919init_service_check
Dean Troyer7d28a0e2012-06-27 17:55:52 -0500920
Sean Dague78096b52014-02-25 10:23:04 -0500921# Dstat
Dean Troyer1a6d4492013-06-03 16:47:36 -0500922# -------
923
Sean Daguef1eb0472014-02-11 17:28:56 -0500924# A better kind of sysstat, with the top process per time slice
James E. Blaire8d84062014-03-26 08:19:37 -0700925DSTAT_OPTS="-tcmndrylp --top-cpu-adv"
Sean Daguef1eb0472014-02-11 17:28:56 -0500926if [[ -n ${SCREEN_LOGDIR} ]]; then
927 screen_it dstat "cd $TOP_DIR; dstat $DSTAT_OPTS | tee $SCREEN_LOGDIR/$DSTAT_FILE"
928else
929 screen_it dstat "dstat $DSTAT_OPTS"
Sean Dague062cdaf2014-02-10 22:24:49 -0500930fi
931
Dean Troyer893e6632013-09-13 15:05:51 -0500932# Start Services
933# ==============
934
Dean Troyerd81a0272012-08-31 18:04:55 -0500935# Keystone
936# --------
937
938if is_service_enabled key; then
Dean Troyer7903b792012-09-13 17:16:12 -0500939 echo_summary "Starting Keystone"
Bartosz Górski0abde392014-02-28 14:15:19 +0100940
941 if [ "$KEYSTONE_AUTH_HOST" == "$SERVICE_HOST" ]; then
942 init_keystone
943 start_keystone
944 fi
Dean Troyerd81a0272012-08-31 18:04:55 -0500945
Dean Troyerd835de82012-11-29 17:11:35 -0600946 # Set up a temporary admin URI for Keystone
Jamie Lennox3561d7f2014-05-21 17:18:43 +1000947 SERVICE_ENDPOINT=$KEYSTONE_AUTH_URI/v2.0
Dean Troyerc83a7e12012-11-29 11:47:58 -0600948
949 if is_service_enabled tls-proxy; then
950 export OS_CACERT=$INT_CA_DIR/ca-chain.pem
951 # Until the client support is fixed, just use the internal endpoint
952 SERVICE_ENDPOINT=http://$KEYSTONE_AUTH_HOST:$KEYSTONE_AUTH_PORT_INT/v2.0
953 fi
Dean Troyerd81a0272012-08-31 18:04:55 -0500954
Dean Troyer42a59c22014-03-03 14:31:29 -0600955 # Setup OpenStackclient token-flow auth
Steve Martinelli19685422014-01-24 13:02:26 -0600956 export OS_TOKEN=$SERVICE_TOKEN
957 export OS_URL=$SERVICE_ENDPOINT
Dean Troyer42a59c22014-03-03 14:31:29 -0600958
Dean Troyerd835de82012-11-29 17:11:35 -0600959 create_keystone_accounts
Dean Troyera0dce262012-12-11 16:52:37 -0600960 create_nova_accounts
Dean Troyer42a59c22014-03-03 14:31:29 -0600961 create_glance_accounts
Dean Troyer671c16e2012-12-13 16:22:38 -0600962 create_cinder_accounts
Mark McClainb05c8762013-07-06 23:29:39 -0400963 create_neutron_accounts
Dean Troyerd835de82012-11-29 17:11:35 -0600964
Dirk Muellerfa5ccff2014-01-09 13:27:35 +0100965 if is_service_enabled ceilometer; then
966 create_ceilometer_accounts
967 fi
968
Dean Troyer42a59c22014-03-03 14:31:29 -0600969 if is_service_enabled swift; then
Ian Wienand0ff314c2013-07-17 16:30:19 +1000970 create_swift_accounts
971 fi
972
Steven Hardy33d1f862014-02-13 15:00:33 +0000973 if is_service_enabled heat; then
974 create_heat_accounts
975 fi
976
Dean Troyer42a59c22014-03-03 14:31:29 -0600977 # Begone token-flow auth
Steve Martinelli19685422014-01-24 13:02:26 -0600978 unset OS_TOKEN OS_URL
Dean Troyer42a59c22014-03-03 14:31:29 -0600979
980 # Set up password-flow auth creds now that keystone is bootstrapped
Dean Troyerd81a0272012-08-31 18:04:55 -0500981 export OS_AUTH_URL=$SERVICE_ENDPOINT
982 export OS_TENANT_NAME=admin
983 export OS_USERNAME=admin
984 export OS_PASSWORD=$ADMIN_PASSWORD
Bartosz Górski0abde392014-02-28 14:15:19 +0100985 export OS_REGION_NAME=$REGION_NAME
Dean Troyerd81a0272012-08-31 18:04:55 -0500986fi
987
988
Tres Henryca85b792011-10-28 14:00:21 -0700989# Horizon
Dean Troyerdf0972c2012-03-07 17:31:03 -0600990# -------
Jesse Andrewscbe98d52011-10-02 17:47:32 -0400991
Dean Troyer7d28a0e2012-06-27 17:55:52 -0500992# Set up the django horizon application to serve via apache/wsgi
Jesse Andrews75a37652011-09-12 17:09:08 -0700993
Chmouel Boudjnaha6651e92012-02-16 10:16:52 +0000994if is_service_enabled horizon; then
Dean Troyer7903b792012-09-13 17:16:12 -0500995 echo_summary "Configuring and starting Horizon"
Sean Dagueb562e6a2012-11-19 16:00:01 -0500996 init_horizon
997 start_horizon
Anthony Young70dc5e02011-09-15 16:52:43 -0700998fi
Jesse Andrews75a37652011-09-12 17:09:08 -0700999
Anthony Young3859f732011-09-14 02:33:43 -07001000
Jesse Andrewsd74257d2011-09-13 01:24:50 -07001001# Glance
1002# ------
1003
Chmouel Boudjnaha6651e92012-02-16 10:16:52 +00001004if is_service_enabled g-reg; then
Dean Troyer7903b792012-09-13 17:16:12 -05001005 echo_summary "Configuring Glance"
Dean Troyer73f6f252012-09-17 11:22:21 -05001006 init_glance
Anthony Young70dc5e02011-09-15 16:52:43 -07001007fi
Jesse Andrews75a37652011-09-12 17:09:08 -07001008
Dean Troyer8c032d12013-09-23 13:53:13 -05001009
Mark McClainb05c8762013-07-06 23:29:39 -04001010# Neutron
Anthony Young60df29a2012-03-28 09:40:17 -07001011# -------
Dean Troyer7d28a0e2012-06-27 17:55:52 -05001012
Mark McClainb05c8762013-07-06 23:29:39 -04001013if is_service_enabled neutron; then
1014 echo_summary "Configuring Neutron"
Dean Troyerb9182d62012-11-07 12:31:34 -06001015
Mark McClainb05c8762013-07-06 23:29:39 -04001016 configure_neutron
Salvatore Orlandodd649882013-08-05 08:56:17 -07001017 # Run init_neutron only on the node hosting the neutron API server
1018 if is_service_enabled $DATABASE_BACKENDS && is_service_enabled q-svc; then
1019 init_neutron
1020 fi
Dan Wendlandt0007f3a2012-05-18 13:37:47 -07001021fi
1022
Mark McClainb05c8762013-07-06 23:29:39 -04001023# Some Neutron plugins require network controllers which are not
Akihiro MOTOKI66afb472012-12-21 15:34:13 +09001024# a part of the OpenStack project. Configure and start them.
Mark McClainb05c8762013-07-06 23:29:39 -04001025if is_service_enabled neutron; then
1026 configure_neutron_third_party
1027 init_neutron_third_party
1028 start_neutron_third_party
Gary Kotton396a0142012-07-29 04:28:47 -04001029fi
1030
Dean Troyerb9182d62012-11-07 12:31:34 -06001031
Jesse Andrewsd74257d2011-09-13 01:24:50 -07001032# Nova
1033# ----
Dean Troyerbd13b702012-02-13 11:22:36 -06001034
Isaku Yamahata6f85ab32012-08-06 16:56:10 +09001035if is_service_enabled n-net q-dhcp; then
Anthony Young55458452011-12-17 00:21:49 +00001036 # Delete traces of nova networks from prior runs
Davanum Srinivasd71d6e72013-01-28 19:15:57 -05001037 # Do not kill any dnsmasq instance spawned by NetworkManager
1038 netman_pid=$(pidof NetworkManager || true)
1039 if [ -z "$netman_pid" ]; then
1040 sudo killall dnsmasq || true
1041 else
1042 sudo ps h -o pid,ppid -C dnsmasq | grep -v $netman_pid | awk '{print $1}' | sudo xargs kill || true
1043 fi
1044
Anthony Young55458452011-12-17 00:21:49 +00001045 clean_iptables
Christian Berendt7a7fb492014-04-07 13:31:07 +00001046
1047 if is_service_enabled n-net; then
1048 rm -rf ${NOVA_STATE_PATH}/networks
1049 sudo mkdir -p ${NOVA_STATE_PATH}/networks
Chris Denta0ced4d2014-05-27 22:08:46 +01001050 safe_chown -R ${STACK_USER} ${NOVA_STATE_PATH}/networks
Christian Berendt7a7fb492014-04-07 13:31:07 +00001051 fi
1052
Dean Troyer1a6d4492013-06-03 16:47:36 -05001053 # Force IP forwarding on, just in case
Dean Troyer0b31e862012-03-07 16:47:56 -06001054 sudo sysctl -w net.ipv4.ip_forward=1
Anthony Young70dc5e02011-09-15 16:52:43 -07001055fi
Jesse Andrews75a37652011-09-12 17:09:08 -07001056
Dean Troyer7d28a0e2012-06-27 17:55:52 -05001057
Chmouel Boudjnah28fa4e82011-11-01 12:30:55 +01001058# Storage Service
Dean Troyer7d28a0e2012-06-27 17:55:52 -05001059# ---------------
1060
Chmouel Boudjnah0c3a5582013-03-06 10:58:33 +01001061if is_service_enabled s-proxy; then
Dean Troyer7903b792012-09-13 17:16:12 -05001062 echo_summary "Configuring Swift"
Attila Fazekasece6a332012-11-29 14:19:41 +01001063 init_swift
Chmouel Boudjnah28fa4e82011-11-01 12:30:55 +01001064fi
1065
Dean Troyerdf0972c2012-03-07 17:31:03 -06001066
Anthony Youngacff87a2011-10-20 10:12:58 -07001067# Volume Service
1068# --------------
1069
Dean Troyer67787e62012-05-02 11:48:15 -05001070if is_service_enabled cinder; then
Dean Troyer7903b792012-09-13 17:16:12 -05001071 echo_summary "Configuring Cinder"
Dean Troyer67787e62012-05-02 11:48:15 -05001072 init_cinder
Anthony Youngacff87a2011-10-20 10:12:58 -07001073fi
1074
Dean Troyer2aa2a892013-08-04 19:53:19 -05001075
1076# Compute Service
1077# ---------------
1078
Dean Troyerbf67c192012-09-21 15:09:37 -05001079if is_service_enabled nova; then
1080 echo_summary "Configuring Nova"
1081 init_nova
Jesse Andrewsd1879c52011-09-16 16:28:13 -07001082
Dean Troyer86a79692012-10-22 15:24:46 -05001083 # Additional Nova configuration that is dependent on other services
Mark McClainb05c8762013-07-06 23:29:39 -04001084 if is_service_enabled neutron; then
1085 create_nova_conf_neutron
Dean Troyer86a79692012-10-22 15:24:46 -05001086 elif is_service_enabled n-net; then
Akihiro MOTOKI66afb472012-12-21 15:34:13 +09001087 create_nova_conf_nova_network
Brad Hall1bfa3d52011-10-27 18:18:20 -07001088 fi
Dean Troyerdf0972c2012-03-07 17:31:03 -06001089
Kieran Spearfb2a3ae2013-03-11 23:55:49 +00001090 init_nova_cells
Anthony Youngb62b4ca2011-10-26 22:29:08 -07001091fi
1092
Devananda van der Veenf35cf912012-11-12 17:58:38 -08001093# Extra things to prepare nova for baremetal, before nova starts
1094if is_service_enabled nova && is_baremetal; then
1095 echo_summary "Preparing for nova baremetal"
1096 prepare_baremetal_toolchain
1097 configure_baremetal_nova_dirs
1098fi
Dean Troyerdf0972c2012-03-07 17:31:03 -06001099
Dean Troyerb7490da2013-03-18 16:07:56 -05001100
Dean Troyercdf3d762013-10-15 09:42:43 -05001101# Extras Configuration
1102# ====================
1103
1104# Phase: post-config
1105if [[ -d $TOP_DIR/extras.d ]]; then
1106 for i in $TOP_DIR/extras.d/*.sh; do
1107 [[ -r $i ]] && source $i stack post-config
1108 done
1109fi
1110
1111
Dean Troyer893e6632013-09-13 15:05:51 -05001112# Local Configuration
1113# ===================
1114
1115# Apply configuration from local.conf if it exists for layer 2 services
1116# Phase: post-config
1117merge_config_group $TOP_DIR/local.conf post-config
1118
1119
Jesse Andrewsd74257d2011-09-13 01:24:50 -07001120# Launch Services
1121# ===============
Jesse Andrews30f68e92011-09-13 00:59:54 -07001122
Jesse Andrewsdfcd2002011-09-13 13:17:22 -07001123# Only run the services specified in ``ENABLED_SERVICES``
1124
Attila Fazekasece6a332012-11-29 14:19:41 +01001125# Launch Swift Services
Chmouel Boudjnah0c3a5582013-03-06 10:58:33 +01001126if is_service_enabled s-proxy; then
Attila Fazekasece6a332012-11-29 14:19:41 +01001127 echo_summary "Starting Swift"
1128 start_swift
1129fi
1130
Dean Troyer73f6f252012-09-17 11:22:21 -05001131# Launch the Glance services
Dean Troyere4fa7212014-01-15 15:04:49 -06001132if is_service_enabled glance; then
Dean Troyer7903b792012-09-13 17:16:12 -05001133 echo_summary "Starting Glance"
Dean Troyer73f6f252012-09-17 11:22:21 -05001134 start_glance
Anthony Youngd000b222011-09-19 14:46:53 -07001135fi
1136
Eric Windisch0b9776d2014-01-28 11:20:53 -05001137# Install Images
1138# ==============
1139
1140# Upload an image to glance.
1141#
1142# The default image is cirros, a small testing image which lets you login as **root**
1143# cirros has a ``cloud-init`` analog supporting login via keypair and sending
1144# scripts as userdata.
1145# See https://help.ubuntu.com/community/CloudInit for more on cloud-init
1146#
1147# Override ``IMAGE_URLS`` with a comma-separated list of UEC images.
1148# * **precise**: http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64.tar.gz
1149
1150if is_service_enabled g-reg; then
1151 TOKEN=$(keystone token-get | grep ' id ' | get_field 2)
1152 die_if_not_set $LINENO TOKEN "Keystone fail to get token"
1153
1154 if is_baremetal; then
1155 echo_summary "Creating and uploading baremetal images"
1156
1157 # build and upload separate deploy kernel & ramdisk
1158 upload_baremetal_deploy $TOKEN
1159
1160 # upload images, separating out the kernel & ramdisk for PXE boot
1161 for image_url in ${IMAGE_URLS//,/ }; do
1162 upload_baremetal_image $image_url $TOKEN
1163 done
1164 else
1165 echo_summary "Uploading images"
1166
1167 # Option to upload legacy ami-tty, which works with xenserver
1168 if [[ -n "$UPLOAD_LEGACY_TTY" ]]; then
1169 IMAGE_URLS="${IMAGE_URLS:+${IMAGE_URLS},}https://github.com/downloads/citrix-openstack/warehouse/tty.tgz"
1170 fi
1171
1172 for image_url in ${IMAGE_URLS//,/ }; do
1173 upload_image $image_url $TOKEN
1174 done
1175 fi
1176fi
1177
Dean Troyerd81a0272012-08-31 18:04:55 -05001178# Create an access key and secret key for nova ec2 register image
1179if is_service_enabled key && is_service_enabled swift3 && is_service_enabled nova; then
Steve Martinellidf6793a2014-03-13 23:38:11 -05001180 eval $(openstack ec2 credentials create --user nova --project $SERVICE_TENANT_NAME -f shell -c access -c secret)
1181 iniset $NOVA_CONF DEFAULT s3_access_key "$access"
1182 iniset $NOVA_CONF DEFAULT s3_secret_key "$secret"
Devananda van der Veen9bc47db2012-12-12 16:52:55 -08001183 iniset $NOVA_CONF DEFAULT s3_affix_tenant "True"
Anthony Youngd000b222011-09-19 14:46:53 -07001184fi
1185
Kaitlin Farrdef4c142014-01-06 08:52:49 -05001186# Create a randomized default value for the keymgr's fixed_key
1187if is_service_enabled nova; then
1188 FIXED_KEY=""
Sean Dague16dd8b32014-02-03 09:10:54 +09001189 for i in $(seq 1 64); do
1190 FIXED_KEY+=$(echo "obase=16; $(($RANDOM % 16))" | bc);
Kaitlin Farrdef4c142014-01-06 08:52:49 -05001191 done;
1192 iniset $NOVA_CONF keymgr fixed_key "$FIXED_KEY"
1193fi
1194
Monty Taylore5428832013-03-27 23:40:59 +01001195if is_service_enabled zeromq; then
1196 echo_summary "Starting zermomq receiver"
Elena Ezhova2d451962014-06-19 12:49:32 +04001197 screen_it zeromq "cd $NOVA_DIR && $OSLO_BIN_DIR/oslo-messaging-zmq-receiver"
Monty Taylore5428832013-03-27 23:40:59 +01001198fi
ewindisch3bae7c22012-01-18 11:18:35 -05001199
Dean Troyer7d28a0e2012-06-27 17:55:52 -05001200# Launch the nova-api and wait for it to answer before continuing
Chmouel Boudjnaha6651e92012-02-16 10:16:52 +00001201if is_service_enabled n-api; then
Dean Troyer7903b792012-09-13 17:16:12 -05001202 echo_summary "Starting Nova API"
Dean Troyer3a3a2ba2012-12-11 15:26:24 -06001203 start_nova_api
Anthony Youngd000b222011-09-19 14:46:53 -07001204fi
Brad Hall1bfa3d52011-10-27 18:18:20 -07001205
Gary Kotton37dda8d2012-08-08 03:46:33 -04001206if is_service_enabled q-svc; then
Mark McClainb05c8762013-07-06 23:29:39 -04001207 echo_summary "Starting Neutron"
Mark McClainb05c8762013-07-06 23:29:39 -04001208 start_neutron_service_and_check
armando-migliaccioef1e0802014-01-02 16:33:53 -08001209 check_neutron_third_party_integration
Aaron Rosen8ec719b2012-10-30 12:57:47 -07001210elif is_service_enabled $DATABASE_BACKENDS && is_service_enabled n-net; then
Kieran Spearfb2a3ae2013-03-11 23:55:49 +00001211 NM_CONF=${NOVA_CONF}
1212 if is_service_enabled n-cell; then
1213 NM_CONF=${NOVA_CELLS_CONF}
1214 fi
1215
Gary Kotton37dda8d2012-08-08 03:46:33 -04001216 # Create a small network
Kieran Spearfb2a3ae2013-03-11 23:55:49 +00001217 $NOVA_BIN_DIR/nova-manage --config-file $NM_CONF network create "$PRIVATE_NETWORK_NAME" $FIXED_RANGE 1 $FIXED_NETWORK_SIZE $NETWORK_CREATE_ARGS
Dean Troyer696ad332012-01-10 15:34:34 -06001218
Gary Kotton37dda8d2012-08-08 03:46:33 -04001219 # Create some floating ips
Kieran Spearfb2a3ae2013-03-11 23:55:49 +00001220 $NOVA_BIN_DIR/nova-manage --config-file $NM_CONF floating create $FLOATING_RANGE --pool=$PUBLIC_NETWORK_NAME
Aaron Rosen9313dfa2012-07-06 16:08:49 -04001221
Gary Kotton37dda8d2012-08-08 03:46:33 -04001222 # Create a second pool
Kieran Spearfb2a3ae2013-03-11 23:55:49 +00001223 $NOVA_BIN_DIR/nova-manage --config-file $NM_CONF floating create --ip_range=$TEST_FLOATING_RANGE --pool=$TEST_FLOATING_POOL
Brad Hall1bfa3d52011-10-27 18:18:20 -07001224fi
1225
Mark McClainb05c8762013-07-06 23:29:39 -04001226if is_service_enabled neutron; then
1227 start_neutron_agents
Akihiro MOTOKI66afb472012-12-21 15:34:13 +09001228fi
Salvatore Orlando6fbb28d2013-12-22 07:59:37 -08001229# Once neutron agents are started setup initial network elements
1230if is_service_enabled q-svc; then
1231 echo_summary "Creating initial neutron network elements"
1232 create_neutron_initial_network
1233 setup_neutron_debug
1234fi
Dean Troyerbf67c192012-09-21 15:09:37 -05001235if is_service_enabled nova; then
1236 echo_summary "Starting Nova"
1237 start_nova
1238fi
Dean Troyer67787e62012-05-02 11:48:15 -05001239if is_service_enabled cinder; then
Dean Troyer7903b792012-09-13 17:16:12 -05001240 echo_summary "Starting Cinder"
Dean Troyer67787e62012-05-02 11:48:15 -05001241 start_cinder
Dean Troyer09718332014-07-03 10:46:57 -05001242 create_volume_types
Dean Troyer67787e62012-05-02 11:48:15 -05001243fi
John H. Tran93361642012-07-26 11:22:05 -07001244if is_service_enabled ceilometer; then
Doug Hellmannc5259b42012-09-22 10:52:31 -04001245 echo_summary "Starting Ceilometer"
Lianhao Lu8c548492013-01-09 10:41:54 +08001246 init_ceilometer
John H. Tran93361642012-07-26 11:22:05 -07001247 start_ceilometer
1248fi
Sean Dagueb562e6a2012-11-19 16:00:01 -05001249
Steve Bakerbad9d892012-10-25 14:49:47 +13001250# Configure and launch heat engine, api and metadata
Steve Bakerbfdad752012-08-18 09:00:42 +12001251if is_service_enabled heat; then
Steven Hardy1bcd2802014-02-13 15:14:41 +00001252 # Initialize heat
Steve Bakerbad9d892012-10-25 14:49:47 +13001253 echo_summary "Configuring Heat"
1254 init_heat
Dean Troyer7903b792012-09-13 17:16:12 -05001255 echo_summary "Starting Heat"
Steve Bakerbfdad752012-08-18 09:00:42 +12001256 start_heat
1257fi
Dean Troyer7d28a0e2012-06-27 17:55:52 -05001258
Jamie Lennoxbd24a8d2013-09-20 16:26:42 +10001259
Attila Fazekas22ef5732012-12-16 14:03:06 +01001260# Create account rc files
1261# =======================
1262
1263# Creates source able script files for easier user switching.
1264# This step also creates certificates for tenants and users,
1265# which is helpful in image bundle steps.
1266
1267if is_service_enabled nova && is_service_enabled key; then
Jamie Lennoxbd24a8d2013-09-20 16:26:42 +10001268 USERRC_PARAMS="-PA --target-dir $TOP_DIR/accrc"
1269
1270 if [ -f $SSL_BUNDLE_FILE ]; then
1271 USERRC_PARAMS="$USERRC_PARAMS --os-cacert $SSL_BUNDLE_FILE"
1272 fi
1273
1274 $TOP_DIR/tools/create_userrc.sh $USERRC_PARAMS
Attila Fazekas22ef5732012-12-16 14:03:06 +01001275fi
1276
Dean Troyer4a43b7b2012-08-28 17:43:40 -05001277
Devananda van der Veenf35cf912012-11-12 17:58:38 -08001278# If we are running nova with baremetal driver, there are a few
1279# last-mile configuration bits to attend to, which must happen
1280# after n-api and n-sch have started.
1281# Also, creating the baremetal flavor must happen after images
1282# are loaded into glance, though just knowing the IDs is sufficient here
1283if is_service_enabled nova && is_baremetal; then
1284 # create special flavor for baremetal if we know what images to associate
1285 [[ -n "$BM_DEPLOY_KERNEL_ID" ]] && [[ -n "$BM_DEPLOY_RAMDISK_ID" ]] && \
Sean Dagueb83c3652013-10-22 10:08:04 -04001286 create_baremetal_flavor $BM_DEPLOY_KERNEL_ID $BM_DEPLOY_RAMDISK_ID
Devananda van der Veenf35cf912012-11-12 17:58:38 -08001287
1288 # otherwise user can manually add it later by calling nova-baremetal-manage
Devananda van der Veenf35cf912012-11-12 17:58:38 -08001289 [[ -n "$BM_FIRST_MAC" ]] && add_baremetal_node
1290
Arata Notsubbf06452013-07-26 20:26:07 +09001291 if [[ "$BM_DNSMASQ_FROM_NOVA_NETWORK" = "False" ]]; then
1292 # NOTE: we do this here to ensure that our copy of dnsmasq is running
1293 sudo pkill dnsmasq || true
1294 sudo dnsmasq --conf-file= --port=0 --enable-tftp --tftp-root=/tftpboot \
1295 --dhcp-boot=pxelinux.0 --bind-interfaces --pid-file=/var/run/dnsmasq.pid \
1296 --interface=$BM_DNSMASQ_IFACE --dhcp-range=$BM_DNSMASQ_RANGE \
1297 ${BM_DNSMASQ_DNS:+--dhcp-option=option:dns-server,$BM_DNSMASQ_DNS}
1298 fi
Devananda van der Veenf35cf912012-11-12 17:58:38 -08001299 # ensure callback daemon is running
1300 sudo pkill nova-baremetal-deploy-helper || true
Mehdi Abaakoukc01e6a72013-10-14 16:26:02 +02001301 screen_it baremetal "cd ; nova-baremetal-deploy-helper"
Devananda van der Veenf35cf912012-11-12 17:58:38 -08001302fi
Dean Troyerdf0972c2012-03-07 17:31:03 -06001303
Dean Troyer33cb4302012-12-10 16:47:36 -06001304# Save some values we generated for later use
1305CURRENT_RUN_TIME=$(date "+$TIMESTAMP_FORMAT")
1306echo "# $CURRENT_RUN_TIME" >$TOP_DIR/.stackenv
1307for i in BASE_SQL_CONN ENABLED_SERVICES HOST_IP LOGFILE \
Jamie Lennoxbd24a8d2013-09-20 16:26:42 +10001308 SERVICE_HOST SERVICE_PROTOCOL STACK_USER TLS_IP KEYSTONE_AUTH_PROTOCOL OS_CACERT; do
Dean Troyer33cb4302012-12-10 16:47:36 -06001309 echo $i=${!i} >>$TOP_DIR/.stackenv
1310done
1311
Maru Newbyec086512012-11-01 23:44:57 +00001312
Dean Troyer893e6632013-09-13 15:05:51 -05001313# Local Configuration
1314# ===================
1315
1316# Apply configuration from local.conf if it exists for layer 2 services
1317# Phase: extra
1318merge_config_group $TOP_DIR/local.conf extra
1319
1320
Dean Troyer768295e2013-01-09 13:42:03 -06001321# Run extras
1322# ==========
1323
Dean Troyercdf3d762013-10-15 09:42:43 -05001324# Phase: extra
Dean Troyer768295e2013-01-09 13:42:03 -06001325if [[ -d $TOP_DIR/extras.d ]]; then
1326 for i in $TOP_DIR/extras.d/*.sh; do
Dean Troyercdf3d762013-10-15 09:42:43 -05001327 [[ -r $i ]] && source $i stack extra
Dean Troyer768295e2013-01-09 13:42:03 -06001328 done
1329fi
1330
Ryan Hsufeb28832013-11-07 12:12:35 -08001331# Local Configuration
1332# ===================
1333
1334# Apply configuration from local.conf if it exists for layer 2 services
1335# Phase: post-extra
1336merge_config_group $TOP_DIR/local.conf post-extra
1337
Dean Troyer768295e2013-01-09 13:42:03 -06001338
Dean Troyerf5633dd2012-03-28 11:21:40 -05001339# Run local script
1340# ================
1341
1342# Run ``local.sh`` if it exists to perform user-managed tasks
1343if [[ -x $TOP_DIR/local.sh ]]; then
1344 echo "Running user script $TOP_DIR/local.sh"
1345 $TOP_DIR/local.sh
1346fi
1347
jiajun xua9414242012-12-06 16:30:57 +08001348# Check the status of running services
1349service_check
Dean Troyerf5633dd2012-03-28 11:21:40 -05001350
Dean Troyerb7490da2013-03-18 16:07:56 -05001351
Scott Moserb94f4bf2011-10-07 14:51:07 +00001352# Fin
1353# ===
1354
Dean Troyer471de7a2011-12-27 11:45:55 -06001355set +o xtrace
Scott Moserb94f4bf2011-10-07 14:51:07 +00001356
Dean Troyer7903b792012-09-13 17:16:12 -05001357if [[ -n "$LOGFILE" ]]; then
1358 exec 1>&3
1359 # Force all output to stdout and logs now
Dean Troyerbaa8b422012-09-24 15:02:05 -05001360 exec 1> >( tee -a "${LOGFILE}" ) 2>&1
Dean Troyer7903b792012-09-13 17:16:12 -05001361else
1362 # Force all output to stdout now
1363 exec 1>&3
1364fi
1365
Dean Troyerdf0972c2012-03-07 17:31:03 -06001366
Jesse Andrews24859062011-09-15 21:28:23 -07001367# Using the cloud
Dean Troyer4a43b7b2012-08-28 17:43:40 -05001368# ---------------
Jesse Andrews24859062011-09-15 21:28:23 -07001369
Jesse Andrewse19d8842011-11-01 20:06:55 -07001370echo ""
1371echo ""
1372echo ""
1373
Dean Troyerdf0972c2012-03-07 17:31:03 -06001374# If you installed Horizon on this server you should be able
root40a37002011-09-20 18:06:14 +00001375# to access the site using your browser.
Chmouel Boudjnaha6651e92012-02-16 10:16:52 +00001376if is_service_enabled horizon; then
Dean Troyerdf0972c2012-03-07 17:31:03 -06001377 echo "Horizon is now available at http://$SERVICE_HOST/"
Jesse Andrews24859062011-09-15 21:28:23 -07001378fi
1379
Dean Troyerdf0972c2012-03-07 17:31:03 -06001380# If Keystone is present you can point ``nova`` cli to this server
Chmouel Boudjnaha6651e92012-02-16 10:16:52 +00001381if is_service_enabled key; then
Jamie Lennox3561d7f2014-05-21 17:18:43 +10001382 echo "Keystone is serving at $KEYSTONE_SERVICE_URI/v2.0/"
Dean Troyerdf0972c2012-03-07 17:31:03 -06001383 echo "Examples on using novaclient command line is in exercise.sh"
1384 echo "The default users are: admin and demo"
1385 echo "The password: $ADMIN_PASSWORD"
Jesse Andrews24859062011-09-15 21:28:23 -07001386fi
termie523c4052011-09-28 19:49:40 -05001387
Dean Troyer4a43b7b2012-08-28 17:43:40 -05001388# Echo ``HOST_IP`` - useful for ``build_uec.sh``, which uses dhcp to give the instance an address
Anthony Young1097c7c2011-12-27 23:22:14 -08001389echo "This is your host ip: $HOST_IP"
1390
Dean Troyerafc29fe2013-02-07 15:56:24 -06001391# Warn that a deprecated feature was used
1392if [[ -n "$DEPRECATED_TEXT" ]]; then
1393 echo_summary "WARNING: $DEPRECATED_TEXT"
Dean Troyerced65172012-03-02 16:36:16 -06001394fi
1395
Dean Troyer91baef32014-02-28 11:11:45 -06001396# TODO(dtroyer): Remove Q_AGENT_EXTRA_AGENT_OPTS after stable/juno branch is cut
1397if [[ -n "$Q_AGENT_EXTRA_AGENT_OPTS" ]]; then
1398 echo ""
1399 echo_summary "WARNING: Q_AGENT_EXTRA_AGENT_OPTS is used"
1400 echo "You are using Q_AGENT_EXTRA_AGENT_OPTS to pass configuration into $NEUTRON_CONF."
1401 echo "Please convert that configuration in localrc to a $NEUTRON_CONF section in local.conf:"
1402 echo "Q_AGENT_EXTRA_AGENT_OPTS will be removed early in the 'K' development cycle"
1403 echo "
1404[[post-config|/\$Q_PLUGIN_CONF_FILE]]
1405[DEFAULT]
1406"
1407 for I in "${Q_AGENT_EXTRA_AGENT_OPTS[@]}"; do
1408 # Replace the first '=' with ' ' for iniset syntax
1409 echo ${I}
1410 done
1411fi
1412
1413# TODO(dtroyer): Remove Q_AGENT_EXTRA_SRV_OPTS after stable/juno branch is cut
1414if [[ -n "$Q_AGENT_EXTRA_SRV_OPTS" ]]; then
1415 echo ""
1416 echo_summary "WARNING: Q_AGENT_EXTRA_SRV_OPTS is used"
1417 echo "You are using Q_AGENT_EXTRA_SRV_OPTS to pass configuration into $NEUTRON_CONF."
1418 echo "Please convert that configuration in localrc to a $NEUTRON_CONF section in local.conf:"
1419 echo "Q_AGENT_EXTRA_AGENT_OPTS will be removed early in the 'K' development cycle"
1420 echo "
1421[[post-config|/\$Q_PLUGIN_CONF_FILE]]
1422[DEFAULT]
1423"
1424 for I in "${Q_AGENT_EXTRA_SRV_OPTS[@]}"; do
1425 # Replace the first '=' with ' ' for iniset syntax
1426 echo ${I}
1427 done
1428fi
1429
Dean Troyer09718332014-07-03 10:46:57 -05001430# TODO(dtroyer): Remove CINDER_MULTI_LVM_BACKEND after stable/juno branch is cut
1431if [[ "$CINDER_MULTI_LVM_BACKEND" = "True" ]]; then
1432 echo ""
1433 echo_summary "WARNING: CINDER_MULTI_LVM_BACKEND is used"
1434 echo "You are using CINDER_MULTI_LVM_BACKEND to configure Cinder's multiple LVM backends"
1435 echo "Please convert that configuration in local.conf to use CINDER_ENABLED_BACKENDS."
1436 echo "CINDER_ENABLED_BACKENDS will be removed early in the 'K' development cycle"
1437 echo "
1438[[local|localrc]]
1439CINDER_ENABLED_BACKENDS=lvm:lvmdriver-1,lvm:lvmdriver-2
1440"
1441fi
1442
Dean Troyer4a43b7b2012-08-28 17:43:40 -05001443# Indicate how long this took to run (bash maintained variable ``SECONDS``)
Dean Troyer7903b792012-09-13 17:16:12 -05001444echo_summary "stack.sh completed in $SECONDS seconds."
Dean Troyer80684552014-03-05 11:50:23 -06001445
1446# Restore/close logging file descriptors
1447exec 1>&3
1448exec 2>&3
1449exec 3>&-
1450exec 6>&-