From 1a6d4492e25365ec2947e93d5d69507088281415 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Mon, 3 Jun 2013 16:47:36 -0500 Subject: [PATCH] Periodic formatting cleanup This is the semi-irregular comment and docs cleanup. No functional changes should be here although some code is moved in a small attempt to sort functions and get things where they need to be. Change-Id: Ib4a3e2590c6fbd016c391acc7aef6421e91c0dca --- functions | 136 ++++++++++++++++++++---------------- lib/horizon | 12 +++- lib/keystone | 21 +----- lib/nova | 4 +- lib/quantum | 52 +++++++------- stack.sh | 189 +++++++++++++++++++++++++-------------------------- stackrc | 134 +++++++++++++++++++----------------- 7 files changed, 277 insertions(+), 271 deletions(-) diff --git a/functions b/functions index dfde7dc551..1257024838 100644 --- a/functions +++ b/functions @@ -200,6 +200,7 @@ function _get_package_dir() { echo "$pkg_dir" } + # get_packages() collects a list of package names of any type from the # prerequisite files in ``files/{apts|rpms}``. The list is intended # to be passed to a package installer such as apt or yum. @@ -390,42 +391,6 @@ GetOSVersion() { export os_VENDOR os_RELEASE os_UPDATE os_PACKAGE os_CODENAME } -# git update using reference as a branch. -# git_update_branch ref -function git_update_branch() { - - GIT_BRANCH=$1 - - git checkout -f origin/$GIT_BRANCH - # a local branch might not exist - git branch -D $GIT_BRANCH || true - git checkout -b $GIT_BRANCH -} - - -# git update using reference as a tag. Be careful editing source at that repo -# as working copy will be in a detached mode -# git_update_tag ref -function git_update_tag() { - - GIT_TAG=$1 - - git tag -d $GIT_TAG - # fetching given tag only - git fetch origin tag $GIT_TAG - git checkout -f $GIT_TAG -} - - -# git update using reference as a branch. -# git_update_remote_branch ref -function git_update_remote_branch() { - - GIT_BRANCH=$1 - - git checkout -b $GIT_BRANCH -t origin/$GIT_BRANCH -} - # Translate the OS version values into common nomenclature # Sets ``DISTRO`` from the ``os_*`` values @@ -457,19 +422,8 @@ function GetDistro() { } -# Determine if current distribution is an Ubuntu-based distribution. -# It will also detect non-Ubuntu but Debian-based distros; this is not an issue -# since Debian and Ubuntu should be compatible. -# is_ubuntu -function is_ubuntu { - if [[ -z "$os_PACKAGE" ]]; then - GetOSVersion - fi - [ "$os_PACKAGE" = "deb" ] -} - # Determine if current distribution is a Fedora-based distribution -# (Fedora, RHEL, CentOS). +# (Fedora, RHEL, CentOS, etc). # is_fedora function is_fedora { if [[ -z "$os_VENDOR" ]]; then @@ -479,6 +433,7 @@ function is_fedora { [ "$os_VENDOR" = "Fedora" ] || [ "$os_VENDOR" = "Red Hat" ] || [ "$os_VENDOR" = "CentOS" ] } + # Determine if current distribution is a SUSE-based distribution # (openSUSE, SLE). # is_suse @@ -491,6 +446,17 @@ function is_suse { } +# Determine if current distribution is an Ubuntu-based distribution +# It will also detect non-Ubuntu but Debian-based distros +# is_ubuntu +function is_ubuntu { + if [[ -z "$os_PACKAGE" ]]; then + GetOSVersion + fi + [ "$os_PACKAGE" = "deb" ] +} + + # Exit after outputting a message about the distribution not being supported. # exit_distro_not_supported [optional-string-telling-what-is-missing] function exit_distro_not_supported { @@ -565,6 +531,43 @@ function git_clone { } +# git update using reference as a branch. +# git_update_branch ref +function git_update_branch() { + + GIT_BRANCH=$1 + + git checkout -f origin/$GIT_BRANCH + # a local branch might not exist + git branch -D $GIT_BRANCH || true + git checkout -b $GIT_BRANCH +} + + +# git update using reference as a branch. +# git_update_remote_branch ref +function git_update_remote_branch() { + + GIT_BRANCH=$1 + + git checkout -b $GIT_BRANCH -t origin/$GIT_BRANCH +} + + +# git update using reference as a tag. Be careful editing source at that repo +# as working copy will be in a detached mode +# git_update_tag ref +function git_update_tag() { + + GIT_TAG=$1 + + git tag -d $GIT_TAG + # fetching given tag only + git fetch origin tag $GIT_TAG + git checkout -f $GIT_TAG +} + + # Comment an option in an INI file # inicomment config-file section option function inicomment() { @@ -1020,6 +1023,7 @@ function screen_rc { fi } + # Helper to remove the *.failure files under $SERVICE_DIR/$SCREEN_NAME # This is used for service_check when all the screen_it are called finished # init_service_check @@ -1034,6 +1038,7 @@ function init_service_check() { rm -f "$SERVICE_DIR/$SCREEN_NAME"/*.failure } + # Helper to get the status of each running service # service_check function service_check() { @@ -1062,6 +1067,7 @@ function service_check() { fi } + # ``pip install`` the dependencies of the package before ``setup.py develop`` # so pip and not distutils processes the dependency chain # Uses globals ``TRACK_DEPENDES``, ``*_proxy` @@ -1242,6 +1248,7 @@ function upload_image() { fi } + # Set the database backend to use # When called from stackrc/localrc DATABASE_BACKENDS has not been # initialized yet, just save the configuration selection and call back later @@ -1259,6 +1266,7 @@ function use_database { fi } + # Toggle enable/disable_service for services that must run exclusive of each other # $1 The name of a variable containing a space-separated list of services # $2 The name of a variable in which to store the enabled service's name @@ -1275,6 +1283,7 @@ function use_exclusive_service { return 0 } + # Wait for an HTTP server to start answering requests # wait_for_service timeout url function wait_for_service() { @@ -1283,6 +1292,7 @@ function wait_for_service() { timeout $timeout sh -c "while ! http_proxy= https_proxy= curl -s $url >/dev/null; do sleep 1; done" } + # Wrapper for ``yum`` to set proxy environment variables # Uses globals ``OFFLINE``, ``*_proxy` # yum_install package [package ...] @@ -1295,8 +1305,21 @@ function yum_install() { yum install -y "$@" } + +# zypper wrapper to set arguments correctly +# zypper_install package [package ...] +function zypper_install() { + [[ "$OFFLINE" = "True" ]] && return + local sudo="sudo" + [[ "$(id -u)" = "0" ]] && sudo="env" + $sudo http_proxy=$http_proxy https_proxy=$https_proxy \ + zypper --non-interactive install --auto-agree-with-licenses "$@" +} + + # ping check # Uses globals ``ENABLED_SERVICES`` +# ping_check from-net ip boot-timeout expected function ping_check() { if is_service_enabled quantum; then _ping_check_quantum "$1" $2 $3 $4 @@ -1333,8 +1356,10 @@ function _ping_check_novanet() { fi } + # ssh check +# ssh_check net-name key-file floating-ip default-user active-timeout function ssh_check() { if is_service_enabled quantum; then _ssh_check_quantum "$1" $2 $3 $4 $5 @@ -1356,17 +1381,6 @@ function _ssh_check_novanet() { } -# zypper wrapper to set arguments correctly -# zypper_install package [package ...] -function zypper_install() { - [[ "$OFFLINE" = "True" ]] && return - local sudo="sudo" - [[ "$(id -u)" = "0" ]] && sudo="env" - $sudo http_proxy=$http_proxy https_proxy=$https_proxy \ - zypper --non-interactive install --auto-agree-with-licenses "$@" -} - - # Add a user to a group. # add_user_to_group user group function add_user_to_group() { @@ -1396,6 +1410,7 @@ function get_python_exec_prefix() { fi } + # Get the location of the $module-rootwrap executables, where module is cinder # or nova. # get_rootwrap_location module @@ -1405,6 +1420,7 @@ function get_rootwrap_location() { echo "$(get_python_exec_prefix)/$module-rootwrap" } + # Get the path to the pip command. # get_pip_command function get_pip_command() { @@ -1419,6 +1435,7 @@ function get_pip_command() { fi } + # Path permissions sanity check # check_path_perm_sanity path function check_path_perm_sanity() { @@ -1448,6 +1465,7 @@ function check_path_perm_sanity() { done } + # Restore xtrace $XTRACE diff --git a/lib/horizon b/lib/horizon index ab1139996a..0cc250ed6f 100644 --- a/lib/horizon +++ b/lib/horizon @@ -74,13 +74,20 @@ function _horizon_config_set() { } + # Entry Points # ------------ # cleanup_horizon() - Remove residual data files, anything left over from previous # runs that a clean run would need to clean up function cleanup_horizon() { - : + if [[ is_fedora && $DISTRO =~ (rhel6) ]]; then + # If ``/usr/bin/node`` points into ``$DEST`` + # we installed it via ``install_nodejs`` + if [[ $(readlink -f /usr/bin/node) =~ ($DEST) ]]; then + sudo rm /usr/bin/node + fi + fi } # configure_horizon() - Set config files, create data dirs, etc @@ -111,7 +118,6 @@ function init_horizon() { # Create an empty directory that apache uses as docroot sudo mkdir -p $HORIZON_DIR/.blackhole - HORIZON_REQUIRE='' if is_ubuntu; then # Clean up the old config name @@ -148,7 +154,6 @@ function init_horizon() { s,%DEST%,$DEST,g; s,%HORIZON_REQUIRE%,$HORIZON_REQUIRE,g; \" $FILES/apache-horizon.template >/etc/$APACHE_NAME/$APACHE_CONF" - } # install_horizon() - Collect source and prepare @@ -193,6 +198,7 @@ function stop_horizon() { fi } + # Restore xtrace $XTRACE diff --git a/lib/keystone b/lib/keystone index 6bf4d9fde4..2edd137dbb 100644 --- a/lib/keystone +++ b/lib/keystone @@ -178,7 +178,6 @@ function configure_keystone() { cp $KEYSTONE_DIR/etc/logging.conf.sample $KEYSTONE_CONF_DIR/logging.conf iniset $KEYSTONE_CONF_DIR/logging.conf logger_root level "DEBUG" iniset $KEYSTONE_CONF_DIR/logging.conf logger_root handlers "devel,production" - } # create_keystone_accounts() - Sets up common required keystone accounts @@ -254,25 +253,6 @@ create_keystone_accounts() { --adminurl "$KEYSTONE_AUTH_PROTOCOL://$KEYSTONE_AUTH_HOST:$KEYSTONE_AUTH_PORT/v2.0" \ --internalurl "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0" fi - - # TODO(dtroyer): This is part of a series of changes...remove these when - # complete if they are really unused -# KEYSTONEADMIN_ROLE=$(keystone role-create \ -# --name KeystoneAdmin \ -# | grep " id " | get_field 2) -# KEYSTONESERVICE_ROLE=$(keystone role-create \ -# --name KeystoneServiceAdmin \ -# | grep " id " | get_field 2) - - # TODO(termie): these two might be dubious -# keystone user-role-add \ -# --user_id $ADMIN_USER \ -# --role_id $KEYSTONEADMIN_ROLE \ -# --tenant_id $ADMIN_TENANT -# keystone user-role-add \ -# --user_id $ADMIN_USER \ -# --role_id $KEYSTONESERVICE_ROLE \ -# --tenant_id $ADMIN_TENANT } # init_keystone() - Initialize databases, etc. @@ -339,6 +319,7 @@ function stop_keystone() { screen -S $SCREEN_NAME -p key -X kill } + # Restore xtrace $XTRACE diff --git a/lib/nova b/lib/nova index 508ed7838c..cac6330cc2 100644 --- a/lib/nova +++ b/lib/nova @@ -300,7 +300,7 @@ EOF fi if is_fedora || is_suse; then - if is_fedora && [[ $DISTRO =~ (rhel6) || "$os_RELEASE" -le "17" ]]; then + if is_fedora && [[ $DISTRO =~ (rhel6) || "$os_RELEASE" -le "17" ]]; then sudo bash -c "cat </etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla [libvirt Management Access] Identity=unix-group:$LIBVIRT_GROUP @@ -352,7 +352,6 @@ EOF" restart_service $LIBVIRT_DAEMON fi - # Instance Storage # ---------------- @@ -494,7 +493,6 @@ function create_nova_conf() { iniset_multiline $NOVA_CONF DEFAULT notification_driver "nova.openstack.common.notifier.rpc_notifier" "ceilometer.compute.nova_notifier" fi - # Provide some transition from ``EXTRA_FLAGS`` to ``EXTRA_OPTS`` if [[ -z "$EXTRA_OPTS" && -n "$EXTRA_FLAGS" ]]; then EXTRA_OPTS=$EXTRA_FLAGS diff --git a/lib/quantum b/lib/quantum index d85c6483aa..15c8f19179 100644 --- a/lib/quantum +++ b/lib/quantum @@ -112,18 +112,18 @@ if is_service_enabled quantum; then # The following variables control the Quantum openvswitch and # linuxbridge plugins' allocation of tenant networks and # availability of provider networks. If these are not configured - # in localrc, tenant networks will be local to the host (with no + # in ``localrc``, tenant networks will be local to the host (with no # remote connectivity), and no physical resources will be # available for the allocation of provider networks. # To use GRE tunnels for tenant networks, set to True in - # localrc. GRE tunnels are only supported by the openvswitch + # ``localrc``. GRE tunnels are only supported by the openvswitch # plugin, and currently only on Ubuntu. ENABLE_TENANT_TUNNELS=${ENABLE_TENANT_TUNNELS:-False} # If using GRE tunnels for tenant networks, specify the range of # tunnel IDs from which tenant networks are allocated. Can be - # overriden in localrc in necesssary. + # overriden in ``localrc`` in necesssary. TENANT_TUNNEL_RANGES=${TENANT_TUNNEL_RANGE:-1:1000} # To use VLANs for tenant networks, set to True in localrc. VLANs @@ -131,7 +131,7 @@ if is_service_enabled quantum; then # requiring additional configuration described below. ENABLE_TENANT_VLANS=${ENABLE_TENANT_VLANS:-False} - # If using VLANs for tenant networks, set in localrc to specify + # If using VLANs for tenant networks, set in ``localrc`` to specify # the range of VLAN VIDs from which tenant networks are # allocated. An external network switch must be configured to # trunk these VLANs between hosts for multi-host connectivity. @@ -140,16 +140,16 @@ if is_service_enabled quantum; then TENANT_VLAN_RANGE=${TENANT_VLAN_RANGE:-} # If using VLANs for tenant networks, or if using flat or VLAN - # provider networks, set in localrc to the name of the physical - # network, and also configure OVS_PHYSICAL_BRIDGE for the - # openvswitch agent or LB_PHYSICAL_INTERFACE for the linuxbridge + # provider networks, set in ``localrc`` to the name of the physical + # network, and also configure ``OVS_PHYSICAL_BRIDGE`` for the + # openvswitch agent or ``LB_PHYSICAL_INTERFACE`` for the linuxbridge # agent, as described below. # # Example: ``PHYSICAL_NETWORK=default`` PHYSICAL_NETWORK=${PHYSICAL_NETWORK:-} # With the openvswitch plugin, if using VLANs for tenant networks, - # or if using flat or VLAN provider networks, set in localrc to + # or if using flat or VLAN provider networks, set in ``localrc`` to # the name of the OVS bridge to use for the physical network. The # bridge will be created if it does not already exist, but a # physical interface must be manually added to the bridge as a @@ -159,28 +159,29 @@ if is_service_enabled quantum; then OVS_PHYSICAL_BRIDGE=${OVS_PHYSICAL_BRIDGE:-} # With the linuxbridge plugin, if using VLANs for tenant networks, - # or if using flat or VLAN provider networks, set in localrc to + # or if using flat or VLAN provider networks, set in ``localrc`` to # the name of the network interface to use for the physical # network. # # Example: ``LB_PHYSICAL_INTERFACE=eth1`` LB_PHYSICAL_INTERFACE=${LB_PHYSICAL_INTERFACE:-} - # With the openvswitch plugin, set to True in localrc to enable + # With the openvswitch plugin, set to True in ``localrc`` to enable # provider GRE tunnels when ``ENABLE_TENANT_TUNNELS`` is False. # # Example: ``OVS_ENABLE_TUNNELING=True`` OVS_ENABLE_TUNNELING=${OVS_ENABLE_TUNNELING:-$ENABLE_TENANT_TUNNELS} fi - # Quantum plugin specific functions # --------------------------------- -# Please refer to lib/quantum_plugins/README.md for details. + +# Please refer to ``lib/quantum_plugins/README.md`` for details. source $TOP_DIR/lib/quantum_plugins/$Q_PLUGIN # Agent loadbalancer service plugin functions # ------------------------------------------- + # Hardcoding for 1 service plugin for now source $TOP_DIR/lib/quantum_plugins/services/agent_loadbalancer @@ -191,7 +192,6 @@ else Q_USE_SECGROUP=False fi - # Functions # --------- @@ -423,7 +423,7 @@ function cleanup_quantum() { # _configure_quantum_common() # Set common config for all quantum server and agents. -# This MUST be called before other _configure_quantum_* functions. +# This MUST be called before other ``_configure_quantum_*`` functions. function _configure_quantum_common() { # Put config files in ``QUANTUM_CONF_DIR`` for everyone to find if [[ ! -d $QUANTUM_CONF_DIR ]]; then @@ -433,11 +433,11 @@ function _configure_quantum_common() { cp $QUANTUM_DIR/etc/quantum.conf $QUANTUM_CONF - # Set plugin-specific variables Q_DB_NAME, Q_PLUGIN_CLASS. - # For main plugin config file, set Q_PLUGIN_CONF_PATH, Q_PLUGIN_CONF_FILENAME. - # For addition plugin config files, set Q_PLUGIN_EXTRA_CONF_PATH, - # Q_PLUGIN_EXTRA_CONF_FILES. For example: - # Q_PLUGIN_EXTRA_CONF_FILES=(file1, file2) + # Set plugin-specific variables ``Q_DB_NAME``, ``Q_PLUGIN_CLASS``. + # For main plugin config file, set ``Q_PLUGIN_CONF_PATH``, ``Q_PLUGIN_CONF_FILENAME``. + # For addition plugin config files, set ``Q_PLUGIN_EXTRA_CONF_PATH``, + # ``Q_PLUGIN_EXTRA_CONF_FILES``. For example: + # ``Q_PLUGIN_EXTRA_CONF_FILES=(file1, file2)`` quantum_plugin_configure_common if [[ $Q_PLUGIN_CONF_PATH == '' || $Q_PLUGIN_CONF_FILENAME == '' || $Q_PLUGIN_CLASS == '' ]]; then @@ -543,8 +543,7 @@ function _configure_quantum_metadata_agent() { _quantum_setup_keystone $Q_META_CONF_FILE DEFAULT set_auth_url } -function _configure_quantum_lbaas() -{ +function _configure_quantum_lbaas() { quantum_agent_lbaas_install_agent_packages quantum_agent_lbaas_configure_common quantum_agent_lbaas_configure_agent @@ -606,17 +605,17 @@ function _quantum_setup_rootwrap() { return fi # Deploy new rootwrap filters files (owned by root). - # Wipe any existing rootwrap.d files first + # Wipe any existing ``rootwrap.d`` files first Q_CONF_ROOTWRAP_D=$QUANTUM_CONF_DIR/rootwrap.d if [[ -d $Q_CONF_ROOTWRAP_D ]]; then sudo rm -rf $Q_CONF_ROOTWRAP_D fi - # Deploy filters to $QUANTUM_CONF_DIR/rootwrap.d + # Deploy filters to ``$QUANTUM_CONF_DIR/rootwrap.d`` mkdir -p -m 755 $Q_CONF_ROOTWRAP_D cp -pr $QUANTUM_DIR/etc/quantum/rootwrap.d/* $Q_CONF_ROOTWRAP_D/ sudo chown -R root:root $Q_CONF_ROOTWRAP_D sudo chmod 644 $Q_CONF_ROOTWRAP_D/* - # Set up rootwrap.conf, pointing to $QUANTUM_CONF_DIR/rootwrap.d + # Set up ``rootwrap.conf``, pointing to ``$QUANTUM_CONF_DIR/rootwrap.d`` # location moved in newer versions, prefer new location if test -r $QUANTUM_DIR/etc/quantum/rootwrap.conf; then sudo cp -p $QUANTUM_DIR/etc/quantum/rootwrap.conf $Q_RR_CONF_FILE @@ -626,7 +625,7 @@ function _quantum_setup_rootwrap() { sudo sed -e "s:^filters_path=.*$:filters_path=$Q_CONF_ROOTWRAP_D:" -i $Q_RR_CONF_FILE sudo chown root:root $Q_RR_CONF_FILE sudo chmod 0644 $Q_RR_CONF_FILE - # Specify rootwrap.conf as first parameter to quantum-rootwrap + # Specify ``rootwrap.conf`` as first parameter to quantum-rootwrap ROOTWRAP_SUDOER_CMD="$QUANTUM_ROOTWRAP $Q_RR_CONF_FILE *" # Set up the rootwrap sudoers for quantum @@ -743,7 +742,8 @@ function _ssh_check_quantum() { # Quantum 3rd party programs #--------------------------- -# please refer to lib/quantum_thirdparty/README.md for details + +# please refer to ``lib/quantum_thirdparty/README.md`` for details QUANTUM_THIRD_PARTIES="" for f in $TOP_DIR/lib/quantum_thirdparty/*; do third_party=$(basename $f) diff --git a/stack.sh b/stack.sh index 1e61a3f19a..24a3d5f32c 100755 --- a/stack.sh +++ b/stack.sh @@ -3,7 +3,7 @@ # ``stack.sh`` is an opinionated OpenStack developer installation. It # installs and configures various combinations of **Ceilometer**, **Cinder**, # **Glance**, **Heat**, **Horizon**, **Keystone**, **Nova**, **Quantum** -# and **Swift** +# and **Swift**. # This script allows you to specify configuration options of what git # repositories to use, enabled services, network configuration and various @@ -12,9 +12,11 @@ # developer install. # To keep this script simple we assume you are running on a recent **Ubuntu** -# (12.04 Precise or newer) or **Fedora** (F16 or newer) machine. It -# should work in a VM or physical server. Additionally we put the list of -# ``apt`` and ``rpm`` dependencies and other configuration files in this repo. +# (12.04 Precise or newer) or **Fedora** (F16 or newer) machine. (It may work +# on other platforms but support for those platforms is left to those who added +# them to DevStack.) It should work in a VM or physical server. Additionally +# we maintain a list of ``apt`` and ``rpm`` dependencies and other configuration +# files in this repo. # Learn more and get the most recent version at http://devstack.org @@ -33,55 +35,20 @@ source $TOP_DIR/functions GetDistro -# Configure non-default repos -# =========================== - -# Repo configuration needs to occur before package installation. - -# Some dependencies are not available in Debian Wheezy official -# repositories. However, it's possible to run OpenStack from gplhost -# repository. -if [[ "$os_VENDOR" =~ (Debian) ]]; then - echo 'deb http://archive.gplhost.com/debian grizzly main' | sudo tee /etc/apt/sources.list.d/gplhost_wheezy-backports.list - echo 'deb http://archive.gplhost.com/debian grizzly-backports main' | sudo tee -a /etc/apt/sources.list.d/gplhost_wheezy-backports.list - apt_get update - apt_get install --force-yes gplhost-archive-keyring -fi - -# Installing Open vSwitch on RHEL6 requires enabling the RDO repo. -RHEL6_RDO_REPO_RPM=${RHEL6_RDO_REPO_RPM:-"http://rdo.fedorapeople.org/openstack/openstack-grizzly/rdo-release-grizzly-3.noarch.rpm"} -RHEL6_RDO_REPO_ID=${RHEL6_RDO_REPO_ID:-"openstack-grizzly"} -# RHEL6 requires EPEL for many Open Stack dependencies -RHEL6_EPEL_RPM=${RHEL6_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"} - -if [[ is_fedora && $DISTRO =~ (rhel6) ]]; then - - if ! yum repolist enabled $RHEL6_RDO_REPO_ID | grep -q $RHEL6_RDO_REPO_ID; then - echo "RDO repo not detected; installing" - yum_install $RHEL6_RDO_REPO_RPM || \ - die $LINENO "Error installing RDO repo, cannot continue" - fi - - if ! yum repolist enabled epel | grep -q 'epel'; then - echo "EPEL not detected; installing" - yum_install ${RHEL6_EPEL_RPM} || \ - die $LINENO "Error installing EPEL repo, cannot continue" - fi - -fi - # Global Settings # =============== -# ``stack.sh`` is customizable through setting environment variables. If you -# want to override a setting you can set and export it:: +# ``stack.sh`` is customizable by setting environment variables. Override a +# default setting via export:: # # export DATABASE_PASSWORD=anothersecret # ./stack.sh # -# You can also pass options on a single line ``DATABASE_PASSWORD=simple ./stack.sh`` +# or by setting the variable on the command line:: # -# Additionally, you can put any local variables into a ``localrc`` file:: +# DATABASE_PASSWORD=simple ./stack.sh +# +# Persistent variables can be placed in a ``localrc`` file:: # # DATABASE_PASSWORD=anothersecret # DATABASE_USER=hellaroot @@ -166,6 +133,41 @@ fi VERBOSE=$(trueorfalse True $VERBOSE) +# Additional repos +# ================ + +# Some distros need to add repos beyond the defaults provided by the vendor +# to pick up required packages. + +# The Debian Wheezy official repositories do not contain all required packages, +# add gplhost repository. +if [[ "$os_VENDOR" =~ (Debian) ]]; then + echo 'deb http://archive.gplhost.com/debian grizzly main' | sudo tee /etc/apt/sources.list.d/gplhost_wheezy-backports.list + echo 'deb http://archive.gplhost.com/debian grizzly-backports main' | sudo tee -a /etc/apt/sources.list.d/gplhost_wheezy-backports.list + apt_get update + apt_get install --force-yes gplhost-archive-keyring +fi + +if [[ is_fedora && $DISTRO =~ (rhel6) ]]; then + # Installing Open vSwitch on RHEL6 requires enabling the RDO repo. + RHEL6_RDO_REPO_RPM=${RHEL6_RDO_REPO_RPM:-"http://rdo.fedorapeople.org/openstack/openstack-grizzly/rdo-release-grizzly-3.noarch.rpm"} + RHEL6_RDO_REPO_ID=${RHEL6_RDO_REPO_ID:-"openstack-grizzly"} + if ! yum repolist enabled $RHEL6_RDO_REPO_ID | grep -q $RHEL6_RDO_REPO_ID; then + echo "RDO repo not detected; installing" + yum_install $RHEL6_RDO_REPO_RPM || \ + die $LINENO "Error installing RDO repo, cannot continue" + fi + + # RHEL6 requires EPEL for many Open Stack dependencies + RHEL6_EPEL_RPM=${RHEL6_EPEL_RPM:-"http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"} + if ! yum repolist enabled epel | grep -q 'epel'; then + echo "EPEL not detected; installing" + yum_install ${RHEL6_EPEL_RPM} || \ + die $LINENO "Error installing EPEL repo, cannot continue" + fi +fi + + # root Access # ----------- @@ -296,7 +298,7 @@ SERVICE_TIMEOUT=${SERVICE_TIMEOUT:-60} # Configure Projects # ================== -# Get project function libraries +# Source project function libraries source $TOP_DIR/lib/tls source $TOP_DIR/lib/horizon source $TOP_DIR/lib/keystone @@ -310,7 +312,7 @@ source $TOP_DIR/lib/quantum source $TOP_DIR/lib/baremetal source $TOP_DIR/lib/ldap -# Set the destination directories for OpenStack projects +# Set the destination directories for other OpenStack projects OPENSTACKCLIENT_DIR=$DEST/python-openstackclient PBR_DIR=$DEST/pbr @@ -565,6 +567,7 @@ failed() { # an error. It is also useful for following along as the install occurs. set -o xtrace + # Install Packages # ================ @@ -585,61 +588,51 @@ if is_service_enabled q-agt; then install_quantum_agent_packages fi -# + # System-specific preconfigure # ============================ if [[ is_fedora && $DISTRO =~ (rhel6) ]]; then - # Avoid having to configure selinux to allow things like httpd to - # access horizion files or run binaries like nodejs (LP#1175444) + # Disable selinux to avoid configuring to allow Apache access + # to Horizon files or run nodejs (LP#1175444) if selinuxenabled; then sudo setenforce 0 fi - # An old version (2.0.1) of python-crypto is probably installed on - # a fresh system, via the dependency chain - # cas->python-paramiko->python-crypto (related to anaconda). - # Unfortunately, "pip uninstall pycrypto" will remove the - # .egg-info file for this rpm-installed version, but leave most of - # the actual library files behind in /usr/lib64/python2.6/Crypto. - # When later "pip install pycrypto" happens, the built library - # will be installed over these existing files; the result is a - # useless mess of old, rpm-packaged files and pip-installed files. - # Unsurprisingly, the end result is it doesn't work. Thus we have - # to get rid of it now so that any packages that pip-install - # pycrypto get a "clean slate". - # (note, we have to be careful about other RPM packages specified - # pulling in python-crypto as well. That's why RHEL6 doesn't - # install python-paramiko packages for example...) + # An old version of ``python-crypto`` (2.0.1) may be installed on a + # fresh system via Anaconda and the dependency chain + # ``cas`` -> ``python-paramiko`` -> ``python-crypto``. + # ``pip uninstall pycrypto`` will remove the packaged ``.egg-info`` file + # but leave most of the actual library files behind in ``/usr/lib64/python2.6/Crypto``. + # Later ``pip install pycrypto`` will install over the packaged files resulting + # in a useless mess of old, rpm-packaged files and pip-installed files. + # Remove the package so that ``pip install python-crypto`` installs cleanly. + # Note: other RPM packages may require ``python-crypto`` as well. For example, + # RHEL6 does not install ``python-paramiko packages``. uninstall_package python-crypto - # A similar thing happens for python-lxml (a dependency of - # ipa-client, an auditing thing we don't care about). We have the - # build-dependencies the lxml pip-install will need (gcc, - # libxml2-dev & libxslt-dev) in the "general" rpm lists + # A similar situation occurs with ``python-lxml``, which is required by + # ``ipa-client``, an auditing package we don't care about. The + # build-dependencies needed for ``pip install lxml`` (``gcc``, + # ``libxml2-dev`` and ``libxslt-dev``) are present in ``files/rpms/general``. uninstall_package python-lxml - # If the dbus rpm was installed by the devstack rpm dependencies - # then you may hit a bug where the uuid isn't generated because - # the service was never started (PR#598200), causing issues for - # Nova stopping later on complaining that - # '/var/lib/dbus/machine-id' doesn't exist. + # If the ``dbus`` package was installed by DevStack dependencies the + # uuid may not be generated because the service was never started (PR#598200), + # causing Nova to stop later on complaining that ``/var/lib/dbus/machine-id`` + # does not exist. sudo service messagebus restart - # In setup.py, a "setup_requires" package is supposed to - # transient. However there is a bug with rhel6 distribute where - # setup_requires packages can register entry points that aren't - # cleared out properly after the setup-phase; the end result is - # installation failures (bz#924038). Thus we pre-install the - # problem package here; this way the setup_requires dependency is - # already satisfied and it will not need to be installed - # transiently, meaning we avoid the issue of it not being cleaned - # out properly. Note we do this before the track-depends below. + # ``setup.py`` contains a ``setup_requires`` package that is supposed + # to be transient. However, RHEL6 distribute has a bug where + # ``setup_requires`` registers entry points that are not cleaned + # out properly after the setup-phase resulting in installation failures + # (bz#924038). Pre-install the problem package so the ``setup_requires`` + # dependency is satisfied and it will not be installed transiently. + # Note we do this before the track-depends below. pip_install hgtools - # The version of python-nose in the RHEL6 repo is incompatible - # with Tempest. As a workaround: - + # RHEL6's version of ``python-nose`` is incompatible with Tempest. # Install nose 1.1 (Tempest-compatible) from EPEL install_package python-nose1.1 # Add a symlink for the new nosetests to allow tox for Tempest to @@ -850,10 +843,10 @@ fi init_service_check -# Kick off Sysstat -# ------------------------ -# run sysstat if it is enabled, this has to be early as daemon -# startup is one of the things to track. +# Sysstat +# ------- + +# If enabled, systat has to start early to track OpenStack service startup. if is_service_enabled sysstat;then if [[ -n ${SCREEN_LOGDIR} ]]; then screen_it sysstat "sar -o $SCREEN_LOGDIR/$SYSSTAT_FILE $SYSSTAT_INTERVAL" @@ -967,7 +960,7 @@ if is_service_enabled n-net q-dhcp; then rm -rf ${NOVA_STATE_PATH}/networks sudo mkdir -p ${NOVA_STATE_PATH}/networks sudo chown -R ${USER} ${NOVA_STATE_PATH}/networks - # Force IP forwarding on, just on case + # Force IP forwarding on, just in case sudo sysctl -w net.ipv4.ip_forward=1 fi @@ -1018,6 +1011,7 @@ if is_service_enabled nova; then XEN_FIREWALL_DRIVER=${XEN_FIREWALL_DRIVER:-"nova.virt.firewall.IptablesFirewallDriver"} iniset $NOVA_CONF DEFAULT firewall_driver "$XEN_FIREWALL_DRIVER" + # OpenVZ # ------ @@ -1028,6 +1022,7 @@ if is_service_enabled nova; then LIBVIRT_FIREWALL_DRIVER=${LIBVIRT_FIREWALL_DRIVER:-"nova.virt.libvirt.firewall.IptablesFirewallDriver"} iniset $NOVA_CONF DEFAULT firewall_driver "$LIBVIRT_FIREWALL_DRIVER" + # Bare Metal # ---------- @@ -1050,6 +1045,7 @@ if is_service_enabled nova; then iniset $NOVA_CONF baremetal ${I/=/ } done + # PowerVM # ------- @@ -1069,8 +1065,9 @@ if is_service_enabled nova; then iniset $NOVA_CONF DEFAULT powervm_img_remote_path $POWERVM_IMG_REMOTE_PATH iniset $NOVA_CONF DEFAULT powervm_img_local_path $POWERVM_IMG_LOCAL_PATH + # vSphere API - # ------- + # ----------- elif [ "$VIRT_DRIVER" = 'vsphere' ]; then echo_summary "Using VMware vCenter driver" @@ -1081,8 +1078,9 @@ if is_service_enabled nova; then iniset $NOVA_CONF DEFAULT vmwareapi_host_password "$VMWAREAPI_PASSWORD" iniset $NOVA_CONF DEFAULT vmwareapi_cluster_name "$VMWAREAPI_CLUSTER" + # fake - # ----- + # ---- elif [ "$VIRT_DRIVER" = 'fake' ]; then echo_summary "Using fake Virt driver" @@ -1102,8 +1100,8 @@ if is_service_enabled nova; then iniset $NOVA_CONF DEFAULT scheduler_default_filters "RetryFilter,AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter" - # Default - # ------- + # Default libvirt + # --------------- else echo_summary "Using libvirt virtualization driver" @@ -1296,7 +1294,6 @@ if is_service_enabled nova && is_baremetal; then screen_it baremetal "nova-baremetal-deploy-helper" fi - # Save some values we generated for later use CURRENT_RUN_TIME=$(date "+$TIMESTAMP_FORMAT") echo "# $CURRENT_RUN_TIME" >$TOP_DIR/.stackenv diff --git a/stackrc b/stackrc index 2ac564cb8e..ef39710035 100644 --- a/stackrc +++ b/stackrc @@ -73,10 +73,58 @@ CINDER_BRANCH=${CINDER_BRANCH:-master} CINDERCLIENT_REPO=${CINDERCLIENT_REPO:-${GIT_BASE}/openstack/python-cinderclient.git} CINDERCLIENT_BRANCH=${CINDERCLIENT_BRANCH:-master} +# image catalog service +GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git} +GLANCE_BRANCH=${GLANCE_BRANCH:-master} + +# python glance client library +GLANCECLIENT_REPO=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git} +GLANCECLIENT_BRANCH=${GLANCECLIENT_BRANCH:-master} + +# heat service +HEAT_REPO=${HEAT_REPO:-${GIT_BASE}/openstack/heat.git} +HEAT_BRANCH=${HEAT_BRANCH:-master} + +# python heat client library +HEATCLIENT_REPO=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git} +HEATCLIENT_BRANCH=${HEATCLIENT_BRANCH:-master} + +# django powered web control panel for openstack +HORIZON_REPO=${HORIZON_REPO:-${GIT_BASE}/openstack/horizon.git} +HORIZON_BRANCH=${HORIZON_BRANCH:-master} + +# unified auth system (manages accounts/tokens) +KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git} +KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-master} + +# python keystone client library to nova that horizon uses +KEYSTONECLIENT_REPO=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git} +KEYSTONECLIENT_BRANCH=${KEYSTONECLIENT_BRANCH:-master} + # compute service NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git} NOVA_BRANCH=${NOVA_BRANCH:-master} +# python client library to nova that horizon (and others) use +NOVACLIENT_REPO=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git} +NOVACLIENT_BRANCH=${NOVACLIENT_BRANCH:-master} + +# consolidated openstack python client +OPENSTACKCLIENT_REPO=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git} +OPENSTACKCLIENT_BRANCH=${OPENSTACKCLIENT_BRANCH:-master} + +# pbr drives the setuptools configs +PBR_REPO=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git} +PBR_BRANCH=${PBR_BRANCH:-master} + +# quantum service +QUANTUM_REPO=${QUANTUM_REPO:-${GIT_BASE}/openstack/quantum.git} +QUANTUM_BRANCH=${QUANTUM_BRANCH:-master} + +# quantum client +QUANTUMCLIENT_REPO=${QUANTUMCLIENT_REPO:-${GIT_BASE}/openstack/python-quantumclient.git} +QUANTUMCLIENT_BRANCH=${QUANTUMCLIENT_BRANCH:-master} + # storage service SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git} SWIFT_BRANCH=${SWIFT_BRANCH:-master} @@ -87,65 +135,10 @@ SWIFT3_BRANCH=${SWIFT3_BRANCH:-master} SWIFTCLIENT_REPO=${SWIFTCLIENT_REPO:-${GIT_BASE}/openstack/python-swiftclient.git} SWIFTCLIENT_BRANCH=${SWIFTCLIENT_BRANCH:-master} -# image catalog service -GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git} -GLANCE_BRANCH=${GLANCE_BRANCH:-master} - -# python glance client library -GLANCECLIENT_REPO=${GLANCECLIENT_REPO:-${GIT_BASE}/openstack/python-glanceclient.git} -GLANCECLIENT_BRANCH=${GLANCECLIENT_BRANCH:-master} - -# unified auth system (manages accounts/tokens) -KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git} -KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-master} - -# a websockets/html5 or flash powered VNC console for vm instances -NOVNC_REPO=${NOVNC_REPO:-${GIT_BASE}/kanaka/noVNC.git} -NOVNC_BRANCH=${NOVNC_BRANCH:-master} - -# a websockets/html5 or flash powered SPICE console for vm instances -SPICE_REPO=${SPICE_REPO:-http://anongit.freedesktop.org/git/spice/spice-html5.git} -SPICE_BRANCH=${SPICE_BRANCH:-master} - -# django powered web control panel for openstack -HORIZON_REPO=${HORIZON_REPO:-${GIT_BASE}/openstack/horizon.git} -HORIZON_BRANCH=${HORIZON_BRANCH:-master} - -# python client library to nova that horizon (and others) use -NOVACLIENT_REPO=${NOVACLIENT_REPO:-${GIT_BASE}/openstack/python-novaclient.git} -NOVACLIENT_BRANCH=${NOVACLIENT_BRANCH:-master} - -# consolidated openstack python client -OPENSTACKCLIENT_REPO=${OPENSTACKCLIENT_REPO:-${GIT_BASE}/openstack/python-openstackclient.git} -OPENSTACKCLIENT_BRANCH=${OPENSTACKCLIENT_BRANCH:-master} - -# python keystone client library to nova that horizon uses -KEYSTONECLIENT_REPO=${KEYSTONECLIENT_REPO:-${GIT_BASE}/openstack/python-keystoneclient.git} -KEYSTONECLIENT_BRANCH=${KEYSTONECLIENT_BRANCH:-master} - -# quantum service -QUANTUM_REPO=${QUANTUM_REPO:-${GIT_BASE}/openstack/quantum.git} -QUANTUM_BRANCH=${QUANTUM_BRANCH:-master} - -# quantum client -QUANTUMCLIENT_REPO=${QUANTUMCLIENT_REPO:-${GIT_BASE}/openstack/python-quantumclient.git} -QUANTUMCLIENT_BRANCH=${QUANTUMCLIENT_BRANCH:-master} - # Tempest test suite TEMPEST_REPO=${TEMPEST_REPO:-${GIT_BASE}/openstack/tempest.git} TEMPEST_BRANCH=${TEMPEST_BRANCH:-master} -# heat service -HEAT_REPO=${HEAT_REPO:-${GIT_BASE}/openstack/heat.git} -HEAT_BRANCH=${HEAT_BRANCH:-master} - -# python heat client library -HEATCLIENT_REPO=${HEATCLIENT_REPO:-${GIT_BASE}/openstack/python-heatclient.git} -HEATCLIENT_BRANCH=${HEATCLIENT_BRANCH:-master} - -# ryu service -RYU_REPO=${RYU_REPO:-${GIT_BASE}/osrg/ryu.git} -RYU_BRANCH=${RYU_BRANCH:-master} # diskimage-builder BM_IMAGE_BUILD_REPO=${BM_IMAGE_BUILD_REPO:-${GIT_BASE}/stackforge/diskimage-builder.git} @@ -157,10 +150,18 @@ BM_IMAGE_BUILD_BRANCH=${BM_IMAGE_BUILD_BRANCH:-master} BM_POSEUR_REPO=${BM_POSEUR_REPO:-${GIT_BASE}/tripleo/bm_poseur.git} BM_POSEUR_BRANCH=${BM_POSEUR_BRANCH:-master} -# pbr -# Used to drive the setuptools configs -PBR_REPO=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git} -PBR_BRANCH=${PBR_BRANCH:-master} +# a websockets/html5 or flash powered VNC console for vm instances +NOVNC_REPO=${NOVNC_REPO:-${GIT_BASE}/kanaka/noVNC.git} +NOVNC_BRANCH=${NOVNC_BRANCH:-master} + +# ryu service +RYU_REPO=${RYU_REPO:-${GIT_BASE}/osrg/ryu.git} +RYU_BRANCH=${RYU_BRANCH:-master} + +# a websockets/html5 or flash powered SPICE console for vm instances +SPICE_REPO=${SPICE_REPO:-http://anongit.freedesktop.org/git/spice/spice-html5.git} +SPICE_BRANCH=${SPICE_BRANCH:-master} + # Nova hypervisor configuration. We default to libvirt with **kvm** but will # drop back to **qemu** if we are unable to load the kvm module. ``stack.sh`` can @@ -184,18 +185,22 @@ case "$VIRT_DRIVER" in ;; esac -# Specify a comma-separated list of UEC images to download and install into glance. -# supported urls here are: + +# Images +# ------ + +# Specify a comma-separated list of images to download and install into glance. +# Supported urls here are: # * "uec-style" images: # If the file ends in .tar.gz, uncompress the tarball and and select the first # .img file inside it as the image. If present, use "*-vmlinuz*" as the kernel # and "*-initrd*" as the ramdisk -# example: http://cloud-images.ubuntu.com/releases/oneiric/release/ubuntu-11.10-server-cloudimg-amd64.tar.gz +# example: http://cloud-images.ubuntu.com/releases/precise/release/ubuntu-12.04-server-cloudimg-amd64.tar.gz # * disk image (*.img,*.img.gz) # if file ends in .img, then it will be uploaded and registered as a to # glance as a disk image. If it ends in .gz, it is uncompressed first. # example: -# http://cloud-images.ubuntu.com/releases/oneiric/release/ubuntu-11.10-server-cloudimg-armel-disk1.img +# http://cloud-images.ubuntu.com/releases/precise/release/ubuntu-12.04-server-cloudimg-armel-disk1.img # http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-rootfs.img.gz # * OpenVZ image: # OpenVZ uses its own format of image, and does not support UEC style images @@ -222,11 +227,12 @@ case "$VIRT_DRIVER" in ;; vsphere) IMAGE_URLS="";; - *) # otherwise, use the uec style image (with kernel, ramdisk, disk) + *) # Default to Cirros with kernel, ramdisk and disk image DEFAULT_IMAGE_NAME=${DEFAULT_IMAGE_NAME:-cirros-0.3.1-x86_64-uec} IMAGE_URLS=${IMAGE_URLS:-"http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-uec.tar.gz"};; esac + # 5Gb default volume backing file size VOLUME_BACKING_FILE_SIZE=${VOLUME_BACKING_FILE_SIZE:-5130M}