Merge "Creates SWIFT_DATA_DIR if it does not exist"
diff --git a/HACKING.rst b/HACKING.rst
index 4971db2..a40af54 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -320,3 +320,48 @@
- function names should_have_underscores, NotCamelCase.
- functions should be declared as per the regex ^function foo {$
with code starting on the next line
+
+
+Review Criteria
+===============
+
+There are some broad criteria that will be followed when reviewing
+your change
+
+* **Is it passing tests** -- your change will not be reviewed
+ throughly unless the official CI has run successfully against it.
+
+* **Does this belong in DevStack** -- DevStack reviewers have a
+ default position of "no" but are ready to be convinced by your
+ change.
+
+ For very large changes, you should consider :doc:`the plugins system
+ <plugins>` to see if your code is better abstracted from the main
+ repository.
+
+ For smaller changes, you should always consider if the change can be
+ encapsulated by per-user settings in ``local.conf``. A common example
+ is adding a simple config-option to an ``ini`` file. Specific flags
+ are not usually required for this, although adding documentation
+ about how to achieve a larger goal (which might include turning on
+ various settings, etc) is always welcome.
+
+* **Work-arounds** -- often things get broken and DevStack can be in a
+ position to fix them. Work-arounds are fine, but should be
+ presented in the context of fixing the root-cause of the problem.
+ This means it is well-commented in the code and the change-log and
+ mostly likely includes links to changes or bugs that fix the
+ underlying problem.
+
+* **Should this be upstream** -- DevStack generally does not override
+ default choices provided by projects and attempts to not
+ unexpectedly modify behaviour.
+
+* **Context in commit messages** -- DevStack touches many different
+ areas and reviewers need context around changes to make good
+ decisions. We also always want it to be clear to someone -- perhaps
+ even years from now -- why we were motivated to make a change at the
+ time.
+
+* **Reviewers** -- please see ``MAINTAINERS.rst`` for a list of people
+ that should be added to reviews of various sub-systems.
diff --git a/MAINTAINERS.rst b/MAINTAINERS.rst
index a376eb0..20e8655 100644
--- a/MAINTAINERS.rst
+++ b/MAINTAINERS.rst
@@ -90,3 +90,7 @@
* Flavio Percoco <flaper87@gmail.com>
* Malini Kamalambal <malini.kamalambal@rackspace.com>
+
+Oracle Linux
+~~~~~~~~~~~~
+* Wiekus Beukes <wiekus.beukes@oracle.com>
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..082aff2
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,104 @@
+# DevStack Makefile of Sanity
+
+# Interesting targets:
+# ds-remote - Create a Git remote for use by ds-push and ds-pull targets
+# DS_REMOTE_URL must be set on the command line
+#
+# ds-push - Merge a list of branches taken from .ds-test and push them
+# to the ds-remote repo in ds-test branch
+#
+# ds-pull - Pull the remote ds-test branch into a fresh local branch
+#
+# refresh - Performs a sequence of unstack, refresh and stack
+
+# Duplicated from stackrc for now
+DEST=/opt/stack
+WHEELHOUSE=$(DEST)/.wheelhouse
+
+all:
+ echo "This just saved you from a terrible mistake!"
+
+# Do Some Work
+stack:
+ ./stack.sh
+
+unstack:
+ ./unstack.sh
+
+wheels:
+ WHEELHOUSE=$(WHEELHOUSE) tools/build-wheels.sh
+
+docs:
+ tox -edocs
+
+# Just run the shocco source formatting build
+docs-build:
+ INSTALL_SHOCCO=True tools/build_docs.sh
+
+# Just run the Sphinx docs build
+docs-rst:
+ python setup.py build_sphinx
+
+# Run the bashate test
+bashate:
+ tox -ebashate
+
+# Run the function tests
+test:
+ tests/test_ini_config.sh
+ tests/test_meta_config.sh
+ tests/test_ip.sh
+ tests/test_refs.sh
+
+# Spiff up the place a bit
+clean:
+ ./clean.sh
+ rm -rf accrc doc/build test*-e *.egg-info
+
+# Clean out the cache too
+realclean: clean
+ rm -rf files/cirros*.tar.gz files/Fedora*.qcow2 $(WHEELHOUSE)
+
+# Repo stuffs
+
+pull:
+ git pull
+
+
+# These repo targets are used to maintain a branch in a remote repo that
+# consists of one or more local branches merged and pushed to the remote.
+# This is most useful for iterative testing on multiple or remote servers
+# while keeping the working repo local.
+#
+# It requires:
+# * a remote pointing to a remote repo, often GitHub is used for this
+# * a branch name to be used on the remote
+# * a local file containing the list of local branches to be merged into
+# the remote branch
+
+GIT_REMOTE_NAME=ds-test
+GIT_REMOTE_BRANCH=ds-test
+
+# Push the current branch to a remote named ds-test
+ds-push:
+ git checkout master
+ git branch -D $(GIT_REMOTE_BRANCH) || true
+ git checkout -b $(GIT_REMOTE_BRANCH)
+ for i in $(shell cat .$(GIT_REMOTE_BRANCH) | grep -v "^#" | grep "[^ ]"); do \
+ git merge --no-edit $$i; \
+ done
+ git push -f $(GIT_REMOTE_NAME) HEAD:$(GIT_REMOTE_BRANCH)
+
+# Pull the ds-test branch
+ds-pull:
+ git checkout master
+ git branch -D $(GIT_REMOTE_BRANCH) || true
+ git pull $(GIT_REMOTE_NAME) $(GIT_REMOTE_BRANCH)
+ git checkout $(GIT_REMOTE_BRANCH)
+
+# Add the remote - set DS_REMOTE_URL=htps://example.com/ on the command line
+ds-remote:
+ git remote add $(GIT_REMOTE_NAME) $(DS_REMOTE_URL)
+
+# Refresh the current DevStack checkout nd re-initialize
+refresh: unstack ds-pull stack
diff --git a/clean.sh b/clean.sh
index ad4525b..035489c 100755
--- a/clean.sh
+++ b/clean.sh
@@ -49,7 +49,7 @@
source $TOP_DIR/lib/swift
source $TOP_DIR/lib/ceilometer
source $TOP_DIR/lib/heat
-source $TOP_DIR/lib/neutron
+source $TOP_DIR/lib/neutron-legacy
source $TOP_DIR/lib/ironic
source $TOP_DIR/lib/trove
diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst
index 7d06658..1cc7083 100644
--- a/doc/source/configuration.rst
+++ b/doc/source/configuration.rst
@@ -95,6 +95,8 @@
fragment and MUST conform to the shell requirements, specifically no
whitespace around ``=`` (equals).
+.. _minimal-configuration:
+
Minimal Configuration
=====================
@@ -170,6 +172,30 @@
LIBS_FROM_GIT=python-keystoneclient,oslo.config
+Virtual Environments
+--------------------
+
+ | *Default: ``USE_VENV=False``*
+ | Enable the use of Python virtual environments by setting ``USE_VENV``
+ to ``True``. This will enable the creation of venvs for each project
+ that is defined in the ``PROJECT_VENV`` array.
+
+ | *Default: ``PROJECT_VENV['<project>']='<project-dir>.venv'*
+ | Each entry in the ``PROJECT_VENV`` array contains the directory name
+ of a venv to be used for the project. The array index is the project
+ name. Multiple projects can use the same venv if desired.
+
+ ::
+
+ PROJECT_VENV["glance"]=${GLANCE_DIR}.venv
+
+ | *Default: ``ADDITIONAL_VENV_PACKAGES=""``*
+ | A comma-separated list of additional packages to be installed into each
+ venv. Often projects will not have certain packages listed in its
+ ``requirements.txt`` file because they are 'optional' requirements,
+ i.e. only needed for certain configurations. By default, the enabled
+ databases will have their Python bindings added when they are enabled.
+
Enable Logging
--------------
@@ -247,6 +273,21 @@
RECLONE=yes
+Upgrade packages installed by pip
+---------------------------------
+
+ | *Default: ``PIP_UPGRADE=""``*
+ | By default ``stack.sh`` only installs Python packages if no version
+ is currently installed or the current version does not match a specified
+ requirement. If ``PIP_UPGRADE`` is set to ``True`` then existing required
+ Python packages will be upgraded to the most recent version that
+ matches requirements.
+ |
+
+ ::
+
+ PIP_UPGRADE=True
+
Swift
-----
@@ -378,18 +419,6 @@
can be configured with any valid IPv6 prefix. The default values make
use of an auto-generated ``IPV6_GLOBAL_ID`` to comply with RFC 4193.*
-Unit tests dependencies install
--------------------------------
-
- | *Default: ``INSTALL_TESTONLY_PACKAGES=False``*
- | In order to be able to run unit tests with script ``run_test.sh``,
- the required package dependencies need to be installed.
- Setting this option as below does the work.
-
- ::
-
- INSTALL_TESTONLY_PACKAGES=True
-
Examples
========
diff --git a/doc/source/guides/devstack-with-lbaas-v2.rst b/doc/source/guides/devstack-with-lbaas-v2.rst
new file mode 100644
index 0000000..f679783
--- /dev/null
+++ b/doc/source/guides/devstack-with-lbaas-v2.rst
@@ -0,0 +1,99 @@
+Configure Load-Balancer in Kilo
+=================================
+
+The Kilo release of OpenStack will support Version 2 of the neutron load balancer. Until now, using OpenStack `LBaaS V2 <http://docs.openstack.org/api/openstack-network/2.0/content/lbaas_ext.html>`_ has required a good understanding of neutron and LBaaS architecture and several manual steps.
+
+
+Phase 1: Create DevStack + 2 nova instances
+--------------------------------------------
+
+First, set up a vm of your choice with at least 8 GB RAM and 16 GB disk space, make sure it is updated. Install git and any other developer tools you find useful.
+
+Install devstack
+
+ ::
+
+ git clone https://git.openstack.org/openstack-dev/devstack
+ cd devstack
+
+
+Edit your `local.conf` to look like
+
+ ::
+
+ [[local|localrc]]
+ # Load the external LBaaS plugin.
+ enable_plugin neutron-lbaas https://git.openstack.org/openstack/neutron-lbaas
+
+ # ===== BEGIN localrc =====
+ DATABASE_PASSWORD=password
+ ADMIN_PASSWORD=password
+ SERVICE_PASSWORD=password
+ SERVICE_TOKEN=password
+ RABBIT_PASSWORD=password
+ # Enable Logging
+ LOGFILE=$DEST/logs/stack.sh.log
+ VERBOSE=True
+ LOG_COLOR=True
+ SCREEN_LOGDIR=$DEST/logs
+ # Pre-requisite
+ ENABLED_SERVICES=rabbit,mysql,key
+ # Horizon
+ ENABLED_SERVICES+=,horizon
+ # Nova
+ ENABLED_SERVICES+=,n-api,n-crt,n-obj,n-cpu,n-cond,n-sch
+ IMAGE_URLS+=",https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img"
+ # Glance
+ ENABLED_SERVICES+=,g-api,g-reg
+ # Neutron
+ ENABLED_SERVICES+=,q-svc,q-agt,q-dhcp,q-l3,q-meta
+ # Enable LBaaS V2
+ ENABLED_SERVICES+=,q-lbaasv2
+ # Cinder
+ ENABLED_SERVICES+=,c-api,c-vol,c-sch
+ # Tempest
+ ENABLED_SERVICES+=,tempest
+ # ===== END localrc =====
+
+Run stack.sh and do some sanity checks
+
+ ::
+
+ ./stack.sh
+ . ./openrc
+
+ neutron net-list # should show public and private networks
+
+Create two nova instances that we can use as test http servers:
+
+ ::
+
+ #create nova instances on private network
+ nova boot --image $(nova image-list | awk '/ cirros-0.3.0-x86_64-disk / {print $2}') --flavor 1 --nic net-id=$(neutron net-list | awk '/ private / {print $2}') node1
+ nova boot --image $(nova image-list | awk '/ cirros-0.3.0-x86_64-disk / {print $2}') --flavor 1 --nic net-id=$(neutron net-list | awk '/ private / {print $2}') node2
+ nova list # should show the nova instances just created
+
+ #add secgroup rule to allow ssh etc..
+ neutron security-group-rule-create default --protocol icmp
+ neutron security-group-rule-create default --protocol tcp --port-range-min 22 --port-range-max 22
+ neutron security-group-rule-create default --protocol tcp --port-range-min 80 --port-range-max 80
+
+Set up a simple web server on each of these instances. ssh into each instance (username 'cirros', password 'cubswin:)') and run
+
+ ::
+
+ MYIP=$(ifconfig eth0|grep 'inet addr'|awk -F: '{print $2}'| awk '{print $1}')
+ while true; do echo -e "HTTP/1.0 200 OK\r\n\r\nWelcome to $MYIP" | sudo nc -l -p 80 ; done&
+
+Phase 2: Create your load balancers
+------------------------------------
+
+ ::
+
+ neutron lbaas-loadbalancer-create --name lb1 private-subnet
+ neutron lbaas-listener-create --loadbalancer lb1 --protocol HTTP --protocol-port 80 --name listener1
+ neutron lbaas-pool-create --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP --name pool1
+ neutron lbaas-member-create --subnet private-subnet --address 10.0.0.3 --protocol-port 80 pool1
+ neutron lbaas-member-create --subnet private-subnet --address 10.0.0.5 --protocol-port 80 pool1
+
+Please note here that the "10.0.0.3" and "10.0.0.5" in the above commands are the IPs of the nodes (in my test run-thru, they were actually 10.2 and 10.4), and the address of the created LB will be reported as "vip_address" from the lbaas-loadbalancer-create, and a quick test of that LB is "curl that-lb-ip", which should alternate between showing the IPs of the two nodes.
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 0ffb15c..4435b49 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -41,8 +41,7 @@
#. Configure
- We recommend at least a :doc:`minimal
- configuration <configuration>` be set up.
+ We recommend at least a :ref:`minimal-configuration` be set up.
#. Start the install
@@ -68,6 +67,7 @@
guides/neutron
guides/devstack-with-nested-kvm
guides/nova
+ guides/devstack-with-lbaas-v2
All-In-One Single VM
--------------------
@@ -165,7 +165,7 @@
* `lib/ironic <lib/ironic.html>`__
* `lib/keystone <lib/keystone.html>`__
* `lib/ldap <lib/ldap.html>`__
-* `lib/neutron <lib/neutron.html>`__
+* `lib/neutron-legacy <lib/neutron-legacy.html>`__
* `lib/nova <lib/nova.html>`__
* `lib/oslo <lib/oslo.html>`__
* `lib/rpc\_backend <lib/rpc_backend.html>`__
@@ -210,6 +210,8 @@
-----
* `tools/build\_docs.sh <tools/build_docs.sh.html>`__
+* `tools/build\_venv.sh <tools/build_venv.sh.html>`__
+* `tools/build\_wheels.sh <tools/build_wheels.sh.html>`__
* `tools/create-stack-user.sh <tools/create-stack-user.sh.html>`__
* `tools/create\_userrc.sh <tools/create_userrc.sh.html>`__
* `tools/fixup\_stuff.sh <tools/fixup_stuff.sh.html>`__
diff --git a/doc/source/plugins.rst b/doc/source/plugins.rst
index 5a61063..c4ed228 100644
--- a/doc/source/plugins.rst
+++ b/doc/source/plugins.rst
@@ -113,6 +113,11 @@
services using ``run_process`` as it only works with enabled
services.
+ Be careful to allow users to override global-variables for
+ customizing their environment. Usually it is best to provide a
+ default value only if the variable is unset or empty; e.g. in bash
+ syntax ``FOO=${FOO:-default}``.
+
- ``plugin.sh`` - the actual plugin. It will be executed by devstack
during it's run. The run order will be done in the registration
order for these plugins, and will occur immediately after all in
diff --git a/exercise.sh b/exercise.sh
index ce694fb..19c9d80 100755
--- a/exercise.sh
+++ b/exercise.sh
@@ -2,7 +2,7 @@
# **exercise.sh**
-# Keep track of the current devstack directory.
+# Keep track of the current DevStack directory.
TOP_DIR=$(cd $(dirname "$0") && pwd)
# Import common functions
@@ -14,11 +14,11 @@
# Run everything in the exercises/ directory that isn't explicitly disabled
# comma separated list of script basenames to skip
-# to refrain from exercising euca.sh use SKIP_EXERCISES=euca
+# to refrain from exercising euca.sh use ``SKIP_EXERCISES=euca``
SKIP_EXERCISES=${SKIP_EXERCISES:-""}
# comma separated list of script basenames to run
-# to run only euca.sh use RUN_EXERCISES=euca
+# to run only euca.sh use ``RUN_EXERCISES=euca``
basenames=${RUN_EXERCISES:-""}
EXERCISE_DIR=$TOP_DIR/exercises
@@ -27,7 +27,7 @@
# Locate the scripts we should run
basenames=$(for b in `ls $EXERCISE_DIR/*.sh`; do basename $b .sh; done)
else
- # If RUN_EXERCISES was specified, ignore SKIP_EXERCISES.
+ # If ``RUN_EXERCISES`` was specified, ignore ``SKIP_EXERCISES``.
SKIP_EXERCISES=
fi
@@ -56,7 +56,7 @@
fi
done
-# output status of exercise run
+# Output status of exercise run
echo "====================================================================="
for script in $skips; do
echo SKIP $script
diff --git a/exercises/boot_from_volume.sh b/exercises/boot_from_volume.sh
index a2ae275..aa34830 100755
--- a/exercises/boot_from_volume.sh
+++ b/exercises/boot_from_volume.sh
@@ -32,7 +32,7 @@
# Import project functions
source $TOP_DIR/lib/cinder
-source $TOP_DIR/lib/neutron
+source $TOP_DIR/lib/neutron-legacy
# Import configuration
source $TOP_DIR/openrc
diff --git a/exercises/euca.sh b/exercises/euca.sh
index f9c4752..df5e233 100755
--- a/exercises/euca.sh
+++ b/exercises/euca.sh
@@ -37,7 +37,7 @@
source $TOP_DIR/exerciserc
# Import project functions
-source $TOP_DIR/lib/neutron
+source $TOP_DIR/lib/neutron-legacy
# If nova api is not enabled we exit with exitcode 55 so that
# the exercise is skipped
diff --git a/exercises/floating_ips.sh b/exercises/floating_ips.sh
index 57f48e0..59444e1 100755
--- a/exercises/floating_ips.sh
+++ b/exercises/floating_ips.sh
@@ -31,7 +31,7 @@
source $TOP_DIR/openrc
# Import project functions
-source $TOP_DIR/lib/neutron
+source $TOP_DIR/lib/neutron-legacy
# Import exercise configuration
source $TOP_DIR/exerciserc
diff --git a/exercises/neutron-adv-test.sh b/exercises/neutron-adv-test.sh
index 5b3281b..9230587 100755
--- a/exercises/neutron-adv-test.sh
+++ b/exercises/neutron-adv-test.sh
@@ -49,7 +49,7 @@
source $TOP_DIR/openrc
# Import neutron functions
-source $TOP_DIR/lib/neutron
+source $TOP_DIR/lib/neutron-legacy
# If neutron is not enabled we exit with exitcode 55, which means exercise is skipped.
neutron_plugin_check_adv_test_requirements || exit 55
diff --git a/exercises/volumes.sh b/exercises/volumes.sh
index 504fba1..3ac2016 100755
--- a/exercises/volumes.sh
+++ b/exercises/volumes.sh
@@ -32,7 +32,7 @@
# Import project functions
source $TOP_DIR/lib/cinder
-source $TOP_DIR/lib/neutron
+source $TOP_DIR/lib/neutron-legacy
# Import exercise configuration
source $TOP_DIR/exerciserc
diff --git a/files/apache-keystone.template b/files/apache-keystone.template
index 504dc01..1d20af7 100644
--- a/files/apache-keystone.template
+++ b/files/apache-keystone.template
@@ -2,7 +2,7 @@
Listen %ADMINPORT%
<VirtualHost *:%PUBLICPORT%>
- WSGIDaemonProcess keystone-public processes=5 threads=1 user=%USER% display-name=%{GROUP}
+ WSGIDaemonProcess keystone-public processes=5 threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV%
WSGIProcessGroup keystone-public
WSGIScriptAlias / %PUBLICWSGI%
WSGIApplicationGroup %{GLOBAL}
@@ -18,7 +18,7 @@
</VirtualHost>
<VirtualHost *:%ADMINPORT%>
- WSGIDaemonProcess keystone-admin processes=5 threads=1 user=%USER% display-name=%{GROUP}
+ WSGIDaemonProcess keystone-admin processes=5 threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV%
WSGIProcessGroup keystone-admin
WSGIScriptAlias / %ADMINWSGI%
WSGIApplicationGroup %{GLOBAL}
diff --git a/files/debs/cinder b/files/debs/cinder
index 7819c31..51908eb 100644
--- a/files/debs/cinder
+++ b/files/debs/cinder
@@ -1,4 +1,4 @@
-tgt
+tgt # NOPRIME
lvm2
qemu-utils
libpq-dev
diff --git a/files/debs/general b/files/debs/general
index 84d4302..c27b77d 100644
--- a/files/debs/general
+++ b/files/debs/general
@@ -6,7 +6,7 @@
gcc
g++
git
-graphviz # testonly - docs
+graphviz # needed for docs
lsof # useful when debugging
openssh-server
openssl
@@ -23,3 +23,4 @@
libssl-dev # for pyOpenSSL
gettext # used for compiling message catalogs
openjdk-7-jre-headless # NOPRIME
+pkg-config
diff --git a/files/debs/glance b/files/debs/glance
index 9fda6a6..37877a8 100644
--- a/files/debs/glance
+++ b/files/debs/glance
@@ -1,6 +1,6 @@
-libmysqlclient-dev # testonly
-libpq-dev # testonly
-libssl-dev # testonly
+libmysqlclient-dev
+libpq-dev
+libssl-dev
libxml2-dev
-libxslt1-dev # testonly
-zlib1g-dev # testonly
+libxslt1-dev
+zlib1g-dev
diff --git a/files/debs/neutron b/files/debs/neutron
index aa3d709..2d69a71 100644
--- a/files/debs/neutron
+++ b/files/debs/neutron
@@ -1,12 +1,12 @@
-acl # testonly
+acl
ebtables
iptables
iputils-ping
iputils-arping
-libmysqlclient-dev # testonly
+libmysqlclient-dev
mysql-server #NOPRIME
sudo
-postgresql-server-dev-all # testonly
+postgresql-server-dev-all
python-mysqldb
python-mysql.connector
python-qpid # NOPRIME
diff --git a/files/debs/nova b/files/debs/nova
index 0c31385..9d9acde 100644
--- a/files/debs/nova
+++ b/files/debs/nova
@@ -4,7 +4,7 @@
kpartx
parted
iputils-arping
-libmysqlclient-dev # testonly
+libmysqlclient-dev
mysql-server # NOPRIME
python-mysqldb
python-mysql.connector
diff --git a/files/debs/swift b/files/debs/swift
index b32b439..0089d27 100644
--- a/files/debs/swift
+++ b/files/debs/swift
@@ -1,4 +1,5 @@
curl
+make
memcached
# NOTE python-nose only exists because of swift functional job, we should probably
# figure out a more consistent way of installing this from test-requirements.txt instead
diff --git a/files/debs/trove b/files/debs/trove
index 09dcee8..96f8f29 100644
--- a/files/debs/trove
+++ b/files/debs/trove
@@ -1 +1 @@
-libxslt1-dev # testonly
+libxslt1-dev
diff --git a/files/rpms-suse/cinder b/files/rpms-suse/cinder
index 55078da..3fd03cc 100644
--- a/files/rpms-suse/cinder
+++ b/files/rpms-suse/cinder
@@ -1,5 +1,5 @@
lvm2
-tgt
+tgt # NOPRIME
qemu-tools
python-devel
postgresql-devel
diff --git a/files/rpms-suse/general b/files/rpms-suse/general
index 63cf14b..2219426 100644
--- a/files/rpms-suse/general
+++ b/files/rpms-suse/general
@@ -6,7 +6,7 @@
gcc
gcc-c++
git-core
-graphviz # testonly - docs
+graphviz # docs
iputils
libopenssl-devel # to rebuild pyOpenSSL if needed
lsof # useful when debugging
diff --git a/files/rpms-suse/neutron b/files/rpms-suse/neutron
index 66d6e4c..d278363 100644
--- a/files/rpms-suse/neutron
+++ b/files/rpms-suse/neutron
@@ -1,11 +1,11 @@
-acl # testonly
+acl
dnsmasq
dnsmasq-utils # dist:opensuse-12.3,opensuse-13.1
ebtables
iptables
iputils
mariadb # NOPRIME
-postgresql-devel # testonly
+postgresql-devel
python-eventlet
python-greenlet
python-iso8601
diff --git a/files/rpms-suse/trove b/files/rpms-suse/trove
index 09dcee8..96f8f29 100644
--- a/files/rpms-suse/trove
+++ b/files/rpms-suse/trove
@@ -1 +1 @@
-libxslt1-dev # testonly
+libxslt1-dev
diff --git a/files/rpms/cinder b/files/rpms/cinder
index 9f1359f..a88503b 100644
--- a/files/rpms/cinder
+++ b/files/rpms/cinder
@@ -1,5 +1,5 @@
lvm2
-scsi-target-utils
+scsi-target-utils # NOPRIME
qemu-img
postgresql-devel
iscsi-initiator-utils
diff --git a/files/rpms/general b/files/rpms/general
index eac4ec3..e17d6d6 100644
--- a/files/rpms/general
+++ b/files/rpms/general
@@ -5,13 +5,14 @@
gcc
gcc-c++
git-core
-graphviz # testonly - docs
+graphviz # needed only for docs
openssh-server
openssl
openssl-devel # to rebuild pyOpenSSL if needed
libffi-devel
libxml2-devel
libxslt-devel
+pkgconfig
psmisc
pylint
python-devel
@@ -27,3 +28,4 @@
net-tools
java-1.7.0-openjdk-headless # NOPRIME rhel7,f20
java-1.8.0-openjdk-headless # NOPRIME f21,f22
+pyOpenSSL # version in pip uses too much memory
diff --git a/files/rpms/glance b/files/rpms/glance
index 119492a..479194f 100644
--- a/files/rpms/glance
+++ b/files/rpms/glance
@@ -1,6 +1,6 @@
-libxml2-devel # testonly
-libxslt-devel # testonly
-mysql-devel # testonly
-openssl-devel # testonly
-postgresql-devel # testonly
-zlib-devel # testonly
+libxml2-devel
+libxslt-devel
+mysql-devel
+openssl-devel
+postgresql-devel
+zlib-devel
diff --git a/files/rpms/neutron b/files/rpms/neutron
index c0dee78..8292e7b 100644
--- a/files/rpms/neutron
+++ b/files/rpms/neutron
@@ -1,15 +1,15 @@
MySQL-python
-acl # testonly
+acl
dnsmasq # for q-dhcp
dnsmasq-utils # for dhcp_release
ebtables
iptables
iputils
mysql-connector-python
-mysql-devel # testonly
+mysql-devel
mysql-server # NOPRIME
openvswitch # NOPRIME
-postgresql-devel # testonly
+postgresql-devel
rabbitmq-server # NOPRIME
qpid-cpp-server # NOPRIME
sqlite
diff --git a/files/rpms/nova b/files/rpms/nova
index 527928a..ebd6674 100644
--- a/files/rpms/nova
+++ b/files/rpms/nova
@@ -17,7 +17,7 @@
numpy # needed by websockify for spice console
m2crypto
mysql-connector-python
-mysql-devel # testonly
+mysql-devel
mysql-server # NOPRIME
parted
polkit
diff --git a/files/rpms/trove b/files/rpms/trove
index c5cbdea..e7bbd43 100644
--- a/files/rpms/trove
+++ b/files/rpms/trove
@@ -1 +1 @@
-libxslt-devel # testonly
+libxslt-devel
diff --git a/files/venv-requirements.txt b/files/venv-requirements.txt
index e473a2f..73d0579 100644
--- a/files/venv-requirements.txt
+++ b/files/venv-requirements.txt
@@ -1,10 +1,11 @@
+# Once we can prebuild wheels before a devstack run, uncomment the skipped libraries
cryptography
-lxml
+# lxml # still install from from packages
MySQL-python
-netifaces
+# netifaces # still install from packages
#numpy # slowest wheel by far, stop building until we are actually using the output
posix-ipc
-psycopg2
+# psycopg # still install from packages
pycrypto
pyOpenSSL
PyYAML
diff --git a/functions b/functions
index 9adbfe7..4dc20e7 100644
--- a/functions
+++ b/functions
@@ -15,6 +15,7 @@
source ${FUNC_DIR}/functions-common
source ${FUNC_DIR}/inc/ini-config
source ${FUNC_DIR}/inc/python
+source ${FUNC_DIR}/inc/rootwrap
# Save trace setting
XTRACE=$(set +o | grep xtrace)
@@ -439,7 +440,7 @@
echo "*** DEST path element"
echo "*** ${rebuilt_path}"
echo "*** appears to have 0700 permissions."
- echo "*** This is very likely to cause fatal issues for devstack daemons."
+ echo "*** This is very likely to cause fatal issues for DevStack daemons."
if [[ -n "$SKIP_PATH_SANITY" ]]; then
return
@@ -526,8 +527,8 @@
}
# These functions are provided for basic fall-back functionality for
-# projects that include parts of devstack (grenade). stack.sh will
-# override these with more specific versions for devstack (with fancy
+# projects that include parts of DevStack (Grenade). stack.sh will
+# override these with more specific versions for DevStack (with fancy
# spinners, etc). We never override an existing version
if ! function_exists echo_summary; then
function echo_summary {
diff --git a/functions-common b/functions-common
index b94e134..f442211 100644
--- a/functions-common
+++ b/functions-common
@@ -62,6 +62,9 @@
$xtrace
}
+function isset {
+ [[ -v "$1" ]]
+}
# Control Functions
# =================
@@ -246,6 +249,7 @@
# CentOS Linux release 6.0 (Final)
# Fedora release 16 (Verne)
# XenServer release 6.2.0-70446c (xenenterprise)
+ # Oracle Linux release 7
os_CODENAME=""
for r in "Red Hat" CentOS Fedora XenServer; do
os_VENDOR=$r
@@ -259,6 +263,9 @@
fi
os_VENDOR=""
done
+ if [ "$os_VENDOR" = "Red Hat" ] && [[ -r /etc/oracle-release ]]; then
+ os_VENDOR=OracleLinux
+ fi
os_PACKAGE="rpm"
elif [[ -r /etc/SuSE-release ]]; then
for r in openSUSE "SUSE Linux"; do
@@ -310,7 +317,7 @@
fi
elif [[ "$os_VENDOR" =~ (Red Hat) || \
"$os_VENDOR" =~ (CentOS) || \
- "$os_VENDOR" =~ (OracleServer) ]]; then
+ "$os_VENDOR" =~ (OracleLinux) ]]; then
# Drop the . release as we assume it's compatible
DISTRO="rhel${os_RELEASE::1}"
elif [[ "$os_VENDOR" =~ (XenServer) ]]; then
@@ -328,6 +335,17 @@
[[ "$(uname -m)" == "$1" ]]
}
+# Determine if current distribution is an Oracle distribution
+# is_oraclelinux
+function is_oraclelinux {
+ if [[ -z "$os_VENDOR" ]]; then
+ GetOSVersion
+ fi
+
+ [ "$os_VENDOR" = "OracleLinux" ]
+}
+
+
# Determine if current distribution is a Fedora-based distribution
# (Fedora, RHEL, CentOS, etc).
# is_fedora
@@ -337,7 +355,7 @@
fi
[ "$os_VENDOR" = "Fedora" ] || [ "$os_VENDOR" = "Red Hat" ] || \
- [ "$os_VENDOR" = "CentOS" ] || [ "$os_VENDOR" = "OracleServer" ]
+ [ "$os_VENDOR" = "CentOS" ] || [ "$os_VENDOR" = "OracleLinux" ]
}
@@ -750,6 +768,27 @@
echo $user_role_id
}
+# Gets or adds group role to project
+# Usage: get_or_add_group_project_role <role> <group> <project>
+function get_or_add_group_project_role {
+ # Gets group role id
+ local group_role_id=$(openstack role list \
+ --group $2 \
+ --project $3 \
+ --column "ID" \
+ --column "Name" \
+ | grep " $1 " | get_field 1)
+ if [[ -z "$group_role_id" ]]; then
+ # Adds role to group
+ group_role_id=$(openstack role add \
+ $1 \
+ --group $2 \
+ --project $3 \
+ | grep " id " | get_field 2)
+ fi
+ echo $group_role_id
+}
+
# Gets or creates service
# Usage: get_or_create_service <name> <type> <description>
function get_or_create_service {
@@ -868,16 +907,6 @@
fi
fi
- # Look for # testonly in comment
- if [[ $line =~ (.*)#.*testonly.* ]]; then
- package=${BASH_REMATCH[1]}
- # Are we installing test packages? (test for the default value)
- if [[ $INSTALL_TESTONLY_PACKAGES = "False" ]]; then
- # If not installing test packages the skip this package
- inst_pkg=0
- fi
- fi
-
if [[ $inst_pkg = 1 ]]; then
echo $package
fi
@@ -904,8 +933,6 @@
local file_to_parse=""
local service=""
- INSTALL_TESTONLY_PACKAGES=$(trueorfalse False INSTALL_TESTONLY_PACKAGES)
-
if [[ -z "$package_dir" ]]; then
echo "No package directory supplied"
return 1
@@ -968,7 +995,7 @@
#
# Only packages required for enabled and collected plugins will included.
#
-# The same metadata used in the main devstack prerequisite files may be used
+# The same metadata used in the main DevStack prerequisite files may be used
# in these prerequisite files, see get_packages() for more info.
function get_plugin_packages {
local xtrace=$(set +o | grep xtrace)
@@ -1468,7 +1495,7 @@
return
fi
- echo "Fetching devstack plugins"
+ echo "Fetching DevStack plugins"
for plugin in ${plugins//,/ }; do
git_clone_by_name $plugin
done
@@ -1496,6 +1523,33 @@
done
}
+# plugin_override_defaults
+#
+# Run an extremely early setting phase for plugins that allows default
+# overriding of services.
+function plugin_override_defaults {
+ local plugins="${DEVSTACK_PLUGINS}"
+ local plugin
+
+ # short circuit if nothing to do
+ if [[ -z $plugins ]]; then
+ return
+ fi
+
+ echo "Overriding Configuration Defaults"
+ for plugin in ${plugins//,/ }; do
+ local dir=${GITDIR[$plugin]}
+ # source any overrides
+ if [[ -f $dir/devstack/override-defaults ]]; then
+ # be really verbose that an override is happening, as it
+ # may not be obvious if things fail later.
+ echo "$plugin has overriden the following defaults"
+ cat $dir/devstack/override-defaults
+ source $dir/devstack/override-defaults
+ fi
+ done
+}
+
# run_plugins
#
# Run the devstack/plugin.sh in all the plugin directories. These are
@@ -1525,6 +1579,8 @@
# the source phase corresponds to settings loading in plugins
if [[ "$mode" == "source" ]]; then
load_plugin_settings
+ elif [[ "$mode" == "override_defaults" ]]; then
+ plugin_override_defaults
else
run_plugins $mode $phase
fi
diff --git a/gate/updown.sh b/gate/updown.sh
index d2d7351..f46385c 100755
--- a/gate/updown.sh
+++ b/gate/updown.sh
@@ -4,7 +4,7 @@
#
# Note: this is expected to start running as jenkins
-# Step 1: give back sudoers permissions to devstack
+# Step 1: give back sudoers permissions to DevStack
TEMPFILE=`mktemp`
echo "stack ALL=(root) NOPASSWD:ALL" >$TEMPFILE
chmod 0440 $TEMPFILE
diff --git a/inc/ini-config b/inc/ini-config
index 0d6d169..26401f3 100644
--- a/inc/ini-config
+++ b/inc/ini-config
@@ -205,16 +205,6 @@
$xtrace
}
-function isset {
- nounset=$(set +o | grep nounset)
- set +o nounset
- [[ -n "${!1+x}" ]]
- result=$?
- $nounset
- return $result
-}
-
-
# Restore xtrace
$INC_CONF_TRACE
diff --git a/inc/python b/inc/python
index 229c540..39684b6 100644
--- a/inc/python
+++ b/inc/python
@@ -53,18 +53,24 @@
}
# Wrapper for ``pip install`` to set cache and proxy environment variables
-# Uses globals ``INSTALL_TESTONLY_PACKAGES``, ``OFFLINE``, ``PIP_VIRTUAL_ENV``,
-# ``TRACK_DEPENDS``, ``*_proxy``
+# Uses globals ``OFFLINE``, ``PIP_VIRTUAL_ENV``,
+# ``PIP_UPGRADE``, ``TRACK_DEPENDS``, ``*_proxy``
# pip_install package [package ...]
function pip_install {
local xtrace=$(set +o | grep xtrace)
set +o xtrace
+ local upgrade=""
local offline=${OFFLINE:-False}
if [[ "$offline" == "True" || -z "$@" ]]; then
$xtrace
return
fi
+ PIP_UPGRADE=$(trueorfalse False PIP_UPGRADE)
+ if [[ "$PIP_UPGRADE" = "True" ]] ; then
+ upgrade="--upgrade"
+ fi
+
if [[ -z "$os_PACKAGE" ]]; then
GetOSVersion
fi
@@ -98,21 +104,20 @@
https_proxy="${https_proxy:-}" \
no_proxy="${no_proxy:-}" \
PIP_FIND_LINKS=$PIP_FIND_LINKS \
- $cmd_pip install \
+ $cmd_pip install $upgrade \
$@
- INSTALL_TESTONLY_PACKAGES=$(trueorfalse False INSTALL_TESTONLY_PACKAGES)
- if [[ "$INSTALL_TESTONLY_PACKAGES" == "True" ]]; then
- local test_req="$@/test-requirements.txt"
- if [[ -e "$test_req" ]]; then
- $sudo_pip \
- http_proxy=${http_proxy:-} \
- https_proxy=${https_proxy:-} \
- no_proxy=${no_proxy:-} \
- PIP_FIND_LINKS=$PIP_FIND_LINKS \
- $cmd_pip install \
- -r $test_req
- fi
+ # Also install test requirements
+ local test_req="$@/test-requirements.txt"
+ if [[ -e "$test_req" ]]; then
+ echo "Installing test-requirements for $test_req"
+ $sudo_pip \
+ http_proxy=${http_proxy:-} \
+ https_proxy=${https_proxy:-} \
+ no_proxy=${no_proxy:-} \
+ PIP_FIND_LINKS=$PIP_FIND_LINKS \
+ $cmd_pip install $upgrade \
+ -r $test_req
fi
}
diff --git a/inc/rootwrap b/inc/rootwrap
new file mode 100644
index 0000000..bac8e1e
--- /dev/null
+++ b/inc/rootwrap
@@ -0,0 +1,77 @@
+#!/bin/bash
+#
+# **inc/rootwrap** - Rootwrap functions
+#
+# Handle rootwrap's foibles
+
+# Uses: ``STACK_USER``
+# Defines: ``SUDO_SECURE_PATH_FILE``
+
+# Save trace setting
+INC_ROOT_TRACE=$(set +o | grep xtrace)
+set +o xtrace
+
+# Accumulate all additions to sudo's ``secure_path`` in one file read last
+# so they all work in a venv configuration
+SUDO_SECURE_PATH_FILE=${SUDO_SECURE_PATH_FILE:-/etc/sudoers.d/zz-secure-path}
+
+# Add a directory to the common sudo ``secure_path``
+# add_sudo_secure_path dir
+function add_sudo_secure_path {
+ local dir=$1
+ local line
+
+ # This is pretty simplistic for now - assume only the first line is used
+ if [[ -r SUDO_SECURE_PATH_FILE ]]; then
+ line=$(head -1 $SUDO_SECURE_PATH_FILE)
+ else
+ line="Defaults:$STACK_USER secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin"
+ fi
+
+ # Only add ``dir`` if it is not already present
+ if [[ $line =~ $dir ]]; then
+ echo "${line}:$dir" | sudo tee $SUDO_SECURE_PATH_FILE
+ sudo chmod 400 $SUDO_SECURE_PATH_FILE
+ sudo chown root:root $SUDO_SECURE_PATH_FILE
+ fi
+}
+
+# Configure rootwrap
+# Make a load of assumptions otherwise we'll have 6 arguments
+# configure_rootwrap project bin conf-src-dir
+function configure_rootwrap {
+ local project=$1 # xx
+ local rootwrap_bin=$2 # /opt/stack/xx.venv/bin/xx-rootwrap
+ local rootwrap_conf_src_dir=$3 # /opt/stack/xx/etc/xx
+
+ # Start fresh with rootwrap filters
+ sudo rm -rf /etc/${project}/rootwrap.d
+ sudo install -d -o root -g root -m 755 /etc/${project}/rootwrap.d
+ sudo install -o root -g root -m 644 $rootwrap_conf_src_dir/rootwrap.d/*.filters /etc/${project}/rootwrap.d
+
+ # Set up rootwrap.conf, pointing to /etc/*/rootwrap.d
+ sudo install -o root -g root -m 644 $rootwrap_conf_src_dir/rootwrap.conf /etc/${project}/rootwrap.conf
+ sudo sed -e "s:^filters_path=.*$:filters_path=/etc/${project}/rootwrap.d:" -i /etc/${project}/rootwrap.conf
+
+ # Specify rootwrap.conf as first parameter to rootwrap
+ rootwrap_sudo_cmd="$rootwrap_bin /etc/${project}/rootwrap.conf *"
+
+ # Set up the rootwrap sudoers
+ local tempfile=$(mktemp)
+ echo "$STACK_USER ALL=(root) NOPASSWD: $rootwrap_sudo_cmd" >$tempfile
+ chmod 0440 $tempfile
+ sudo chown root:root $tempfile
+ sudo mv $tempfile /etc/sudoers.d/${project}-rootwrap
+
+ # Add bin dir to sudo's secure_path because rootwrap is being called
+ # without a path because BROKEN.
+ add_sudo_secure_path $(dirname $rootwrap_bin)
+}
+
+
+# Restore xtrace
+$INC_ROOT_TRACE
+
+# Local variables:
+# mode: shell-script
+# End:
diff --git a/lib/ceilometer b/lib/ceilometer
index 83cffe6..8135309 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -4,7 +4,7 @@
# Install and start **Ceilometer** service
# To enable a minimal set of Ceilometer services, add the following to the
-# localrc section of local.conf:
+# ``localrc`` section of ``local.conf``:
#
# enable_service ceilometer-acompute ceilometer-acentral ceilometer-anotification ceilometer-collector ceilometer-api
#
@@ -17,14 +17,11 @@
# of Ceilometer (see within for additional settings):
#
# CEILOMETER_USE_MOD_WSGI: When True, run the api under mod_wsgi.
-# CEILOMETER_PIPELINE_INTERVAL: The number of seconds between pipeline processing
-# runs. Default 600.
-# CEILOMETER_BACKEND: The database backend (e.g. 'mysql', 'mongodb', 'es')
-# CEILOMETER_COORDINATION_URL: The URL for a group membership service provided
-# by tooz.
+# CEILOMETER_PIPELINE_INTERVAL: Seconds between pipeline processing runs. Default 600.
+# CEILOMETER_BACKEND: Database backend (e.g. 'mysql', 'mongodb', 'es')
+# CEILOMETER_COORDINATION_URL: URL for group membership service provided by tooz.
# CEILOMETER_EVENTS: Enable event collection
-
# Dependencies:
#
# - functions
@@ -94,7 +91,7 @@
return 1
}
-# create_ceilometer_accounts() - Set up common required ceilometer accounts
+# create_ceilometer_accounts() - Set up common required Ceilometer accounts
#
# Project User Roles
# ------------------------------------------------------------------
@@ -117,14 +114,14 @@
"$CEILOMETER_SERVICE_PROTOCOL://$CEILOMETER_SERVICE_HOST:$CEILOMETER_SERVICE_PORT/"
fi
if is_service_enabled swift; then
- # Ceilometer needs ResellerAdmin role to access swift account stats.
+ # Ceilometer needs ResellerAdmin role to access Swift account stats.
get_or_add_user_project_role "ResellerAdmin" "ceilometer" $SERVICE_TENANT_NAME
fi
fi
}
-# _cleanup_keystone_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
+# _cleanup_keystone_apache_wsgi() - Remove WSGI files, disable and remove Apache vhost file
function _cleanup_ceilometer_apache_wsgi {
sudo rm -f $CEILOMETER_WSGI_DIR/*
sudo rm -f $(apache_site_config_for ceilometer)
@@ -149,7 +146,7 @@
local ceilometer_apache_conf=$(apache_site_config_for ceilometer)
local apache_version=$(get_apache_version)
- # copy proxy vhost and wsgi file
+ # Copy proxy vhost and wsgi file
sudo cp $CEILOMETER_DIR/ceilometer/api/app.wsgi $CEILOMETER_WSGI_DIR/app
sudo cp $FILES/apache-ceilometer.template $ceilometer_apache_conf
@@ -165,7 +162,7 @@
function configure_ceilometer {
sudo install -d -o $STACK_USER -m 755 $CEILOMETER_CONF_DIR $CEILOMETER_API_LOG_DIR
- iniset_rpc_backend ceilometer $CEILOMETER_CONF DEFAULT
+ iniset_rpc_backend ceilometer $CEILOMETER_CONF
iniset $CEILOMETER_CONF DEFAULT notification_topics "$CEILOMETER_NOTIFICATION_TOPICS"
iniset $CEILOMETER_CONF DEFAULT verbose True
@@ -189,9 +186,9 @@
sed -i "s/interval:.*/interval: ${CEILOMETER_PIPELINE_INTERVAL}/" $CEILOMETER_CONF_DIR/pipeline.yaml
fi
- # the compute and central agents need these credentials in order to
- # call out to other services' public APIs
- # the alarm evaluator needs these options to call ceilometer APIs
+ # The compute and central agents need these credentials in order to
+ # call out to other services' public APIs.
+ # The alarm evaluator needs these options to call ceilometer APIs
iniset $CEILOMETER_CONF service_credentials os_username ceilometer
iniset $CEILOMETER_CONF service_credentials os_password $SERVICE_PASSWORD
iniset $CEILOMETER_CONF service_credentials os_tenant_name $SERVICE_TENANT_NAME
@@ -237,7 +234,7 @@
}
function configure_mongodb {
- # server package is the same on all
+ # Server package is the same on all
local packages=mongodb-server
if is_fedora; then
@@ -250,13 +247,13 @@
install_package ${packages}
if is_fedora; then
- # ensure smallfiles selected to minimize freespace requirements
+ # Ensure smallfiles is selected to minimize freespace requirements
sudo sed -i '/--smallfiles/!s/OPTIONS=\"/OPTIONS=\"--smallfiles /' /etc/sysconfig/mongod
restart_service mongod
fi
- # give mongodb time to start-up
+ # Give mongodb time to start-up
sleep 5
}
@@ -347,7 +344,7 @@
run_process ceilometer-acompute "ceilometer-agent-compute --config-file $CEILOMETER_CONF"
fi
- # only die on API if it was actually intended to be turned on
+ # Only die on API if it was actually intended to be turned on
if is_service_enabled ceilometer-api; then
echo "Waiting for ceilometer-api to start..."
if ! wait_for_service $SERVICE_TIMEOUT $CEILOMETER_SERVICE_PROTOCOL://$CEILOMETER_SERVICE_HOST:$CEILOMETER_SERVICE_PORT/v2/; then
diff --git a/lib/cinder b/lib/cinder
index 3c3fff3..de41bc5 100644
--- a/lib/cinder
+++ b/lib/cinder
@@ -39,8 +39,16 @@
# set up default directories
GITDIR["python-cinderclient"]=$DEST/python-cinderclient
-
CINDER_DIR=$DEST/cinder
+
+# Cinder virtual environment
+if [[ ${USE_VENV} = True ]]; then
+ PROJECT_VENV["cinder"]=${CINDER_DIR}.venv
+ CINDER_BIN_DIR=${PROJECT_VENV["cinder"]}/bin
+else
+ CINDER_BIN_DIR=$(get_python_exec_prefix)
+fi
+
CINDER_STATE_PATH=${CINDER_STATE_PATH:=$DATA_DIR/cinder}
CINDER_AUTH_CACHE_DIR=${CINDER_AUTH_CACHE_DIR:-/var/cache/cinder}
@@ -57,13 +65,6 @@
CINDER_SERVICE_PORT_INT=${CINDER_SERVICE_PORT_INT:-18776}
CINDER_SERVICE_PROTOCOL=${CINDER_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
-# Support entry points installation of console scripts
-if [[ -d $CINDER_DIR/bin ]]; then
- CINDER_BIN_DIR=$CINDER_DIR/bin
-else
- CINDER_BIN_DIR=$(get_python_exec_prefix)
-fi
-
# Default backends
# The backend format is type:name where type is one of the supported backend
@@ -88,6 +89,8 @@
# https://bugs.launchpad.net/cinder/+bug/1180976
CINDER_PERIODIC_INTERVAL=${CINDER_PERIODIC_INTERVAL:-60}
+CINDER_ISCSI_HELPER=${CINDER_ISCSI_HELPER:-tgtadm}
+
# Tell Tempest this project is present
TEMPEST_SERVICES+=,cinder
@@ -125,31 +128,35 @@
function cleanup_cinder {
# ensure the volume group is cleared up because fails might
# leave dead volumes in the group
- local targets=$(sudo tgtadm --op show --mode target)
- if [ $? -ne 0 ]; then
- # If tgt driver isn't running this won't work obviously
- # So check the response and restart if need be
- echo "tgtd seems to be in a bad state, restarting..."
- if is_ubuntu; then
- restart_service tgt
- else
- restart_service tgtd
+ if [ "$CINDER_ISCSI_HELPER" = "tgtadm" ]; then
+ local targets=$(sudo tgtadm --op show --mode target)
+ if [ $? -ne 0 ]; then
+ # If tgt driver isn't running this won't work obviously
+ # So check the response and restart if need be
+ echo "tgtd seems to be in a bad state, restarting..."
+ if is_ubuntu; then
+ restart_service tgt
+ else
+ restart_service tgtd
+ fi
+ targets=$(sudo tgtadm --op show --mode target)
fi
- targets=$(sudo tgtadm --op show --mode target)
- fi
- if [[ -n "$targets" ]]; then
- local iqn_list=( $(grep --no-filename -r iqn $SCSI_PERSIST_DIR | sed 's/<target //' | sed 's/>//') )
- for i in "${iqn_list[@]}"; do
- echo removing iSCSI target: $i
- sudo tgt-admin --delete $i
- done
- fi
+ if [[ -n "$targets" ]]; then
+ local iqn_list=( $(grep --no-filename -r iqn $SCSI_PERSIST_DIR | sed 's/<target //' | sed 's/>//') )
+ for i in "${iqn_list[@]}"; do
+ echo removing iSCSI target: $i
+ sudo tgt-admin --delete $i
+ done
+ fi
- if is_ubuntu; then
- stop_service tgt
+ if is_ubuntu; then
+ stop_service tgt
+ else
+ stop_service tgtd
+ fi
else
- stop_service tgtd
+ sudo cinder-rtstool get-targets | sudo xargs -rn 1 cinder-rtstool delete
fi
if is_service_enabled c-vol && [[ -n "$CINDER_ENABLED_BACKENDS" ]]; then
@@ -164,36 +171,6 @@
fi
}
-# configure_cinder_rootwrap() - configure Cinder's rootwrap
-function configure_cinder_rootwrap {
- # Set the paths of certain binaries
- local cinder_rootwrap=$(get_rootwrap_location cinder)
-
- # Deploy new rootwrap filters files (owned by root).
- # Wipe any existing rootwrap.d files first
- if [[ -d $CINDER_CONF_DIR/rootwrap.d ]]; then
- sudo rm -rf $CINDER_CONF_DIR/rootwrap.d
- fi
-
- # Deploy filters to /etc/cinder/rootwrap.d
- sudo install -d -o root -g root -m 755 $CINDER_CONF_DIR/rootwrap.d
- sudo install -o root -g root -m 644 $CINDER_DIR/etc/cinder/rootwrap.d/*.filters $CINDER_CONF_DIR/rootwrap.d
-
- # Set up rootwrap.conf, pointing to /etc/cinder/rootwrap.d
- sudo install -o root -g root -m 644 $CINDER_DIR/etc/cinder/rootwrap.conf $CINDER_CONF_DIR
- sudo sed -e "s:^filters_path=.*$:filters_path=$CINDER_CONF_DIR/rootwrap.d:" -i $CINDER_CONF_DIR/rootwrap.conf
-
- # Specify rootwrap.conf as first parameter to rootwrap
- ROOTWRAP_CSUDOER_CMD="$cinder_rootwrap $CINDER_CONF_DIR/rootwrap.conf *"
-
- # Set up the rootwrap sudoers for cinder
- local tempfile=`mktemp`
- echo "$STACK_USER ALL=(root) NOPASSWD: $ROOTWRAP_CSUDOER_CMD" >$tempfile
- chmod 0440 $tempfile
- sudo chown root:root $tempfile
- sudo mv $tempfile /etc/sudoers.d/cinder-rootwrap
-}
-
# configure_cinder() - Set config files, create data dirs, etc
function configure_cinder {
sudo install -d -o $STACK_USER -m 755 $CINDER_CONF_DIR
@@ -202,7 +179,7 @@
rm -f $CINDER_CONF
- configure_cinder_rootwrap
+ configure_rootwrap cinder $CINDER_BIN_DIR/cinder-rootwrap $CINDER_DIR/etc/cinder
cp $CINDER_DIR/etc/cinder/api-paste.ini $CINDER_API_PASTE_INI
@@ -224,7 +201,7 @@
iniset $CINDER_CONF DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL
iniset $CINDER_CONF DEFAULT verbose True
- iniset $CINDER_CONF DEFAULT iscsi_helper tgtadm
+ iniset $CINDER_CONF DEFAULT iscsi_helper "$CINDER_ISCSI_HELPER"
iniset $CINDER_CONF database connection `database_connection_url cinder`
iniset $CINDER_CONF DEFAULT api_paste_config $CINDER_API_PASTE_INI
iniset $CINDER_CONF DEFAULT rootwrap_config "$CINDER_CONF_DIR/rootwrap.conf"
@@ -277,7 +254,7 @@
iniset $CINDER_CONF DEFAULT use_syslog True
fi
- iniset_rpc_backend cinder $CINDER_CONF DEFAULT
+ iniset_rpc_backend cinder $CINDER_CONF
if [[ "$CINDER_SECURE_DELETE" == "False" ]]; then
iniset $CINDER_CONF DEFAULT secure_delete False
@@ -388,6 +365,13 @@
function install_cinder {
git_clone $CINDER_REPO $CINDER_DIR $CINDER_BRANCH
setup_develop $CINDER_DIR
+ if [ "$CINDER_ISCSI_HELPER" = "tgtadm" ]; then
+ if is_fedora; then
+ install_package scsi-target-utils
+ else
+ install_package tgt
+ fi
+ fi
}
# install_cinderclient() - Collect source and prepare
@@ -415,21 +399,23 @@
service_port=$CINDER_SERVICE_PORT_INT
service_protocol="http"
fi
- if is_service_enabled c-vol; then
- # Delete any old stack.conf
- sudo rm -f /etc/tgt/conf.d/stack.conf
- _configure_tgt_for_config_d
- if is_ubuntu; then
- sudo service tgt restart
- elif is_fedora || is_suse; then
- restart_service tgtd
- else
- # note for other distros: unstack.sh also uses the tgt/tgtd service
- # name, and would need to be adjusted too
- exit_distro_not_supported "restarting tgt"
+ if [ "$CINDER_ISCSI_HELPER" = "tgtadm" ]; then
+ if is_service_enabled c-vol; then
+ # Delete any old stack.conf
+ sudo rm -f /etc/tgt/conf.d/stack.conf
+ _configure_tgt_for_config_d
+ if is_ubuntu; then
+ sudo service tgt restart
+ elif is_fedora || is_suse; then
+ restart_service tgtd
+ else
+ # note for other distros: unstack.sh also uses the tgt/tgtd service
+ # name, and would need to be adjusted too
+ exit_distro_not_supported "restarting tgt"
+ fi
+ # NOTE(gfidente): ensure tgtd is running in debug mode
+ sudo tgtadm --mode system --op update --name debug --value on
fi
- # NOTE(gfidente): ensure tgtd is running in debug mode
- sudo tgtadm --mode system --op update --name debug --value on
fi
run_process c-api "$CINDER_BIN_DIR/cinder-api --config-file $CINDER_CONF"
@@ -459,14 +445,6 @@
for serv in c-api c-bak c-sch c-vol; do
stop_process $serv
done
-
- if is_service_enabled c-vol; then
- if is_ubuntu; then
- stop_service tgt
- else
- stop_service tgtd
- fi
- fi
}
# create_volume_types() - Create Cinder's configured volume types
diff --git a/lib/cinder_backends/lvm b/lib/cinder_backends/lvm
index f210578..d369c0c 100644
--- a/lib/cinder_backends/lvm
+++ b/lib/cinder_backends/lvm
@@ -49,7 +49,7 @@
iniset $CINDER_CONF $be_name volume_backend_name $be_name
iniset $CINDER_CONF $be_name volume_driver "cinder.volume.drivers.lvm.LVMVolumeDriver"
iniset $CINDER_CONF $be_name volume_group $VOLUME_GROUP_NAME-$be_name
- iniset $CINDER_CONF $be_name iscsi_helper "tgtadm"
+ iniset $CINDER_CONF $be_name iscsi_helper "$CINDER_ISCSI_HELPER"
if [[ "$CINDER_SECURE_DELETE" == "False" ]]; then
iniset $CINDER_CONF $be_name volume_clear none
diff --git a/lib/database b/lib/database
index b114e9e..ff1fafe 100644
--- a/lib/database
+++ b/lib/database
@@ -109,6 +109,11 @@
install_database_$DATABASE_TYPE
}
+# Install the database Python packages
+function install_database_python {
+ install_database_python_$DATABASE_TYPE
+}
+
# Configure and start the database
function configure_database {
configure_database_$DATABASE_TYPE
diff --git a/lib/databases/mysql b/lib/databases/mysql
index 70073c4..310817b 100644
--- a/lib/databases/mysql
+++ b/lib/databases/mysql
@@ -16,7 +16,7 @@
# Linux distros, thank you for being incredibly consistent
MYSQL=mysql
-if is_fedora; then
+if is_fedora && ! is_oraclelinux; then
MYSQL=mariadb
fi
@@ -32,12 +32,12 @@
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
return
+ elif is_suse || is_oraclelinux; then
+ uninstall_package mysql-community-server
+ sudo rm -rf /var/lib/mysql
elif is_fedora; then
uninstall_package mariadb-server
sudo rm -rf /var/lib/mysql
- elif is_suse; then
- uninstall_package mysql-community-server
- sudo rm -rf /var/lib/mysql
else
return
fi
@@ -56,12 +56,12 @@
if is_ubuntu; then
my_conf=/etc/mysql/my.cnf
mysql=mysql
+ elif is_suse || is_oraclelinux; then
+ my_conf=/etc/my.cnf
+ mysql=mysql
elif is_fedora; then
mysql=mariadb
my_conf=/etc/my.cnf
- elif is_suse; then
- my_conf=/etc/my.cnf
- mysql=mysql
else
exit_distro_not_supported "mysql configuration"
fi
@@ -140,20 +140,23 @@
chmod 0600 $HOME/.my.cnf
fi
# Install mysql-server
- if is_fedora; then
- install_package mariadb-server
- elif is_ubuntu; then
- install_package mysql-server
- elif is_suse; then
+ if is_suse || is_oraclelinux; then
if ! is_package_installed mariadb; then
install_package mysql-community-server
fi
+ elif is_fedora; then
+ install_package mariadb-server
+ elif is_ubuntu; then
+ install_package mysql-server
else
exit_distro_not_supported "mysql installation"
fi
+}
+function install_database_python_mysql {
# Install Python client module
pip_install MySQL-python
+ ADDITIONAL_VENV_PACKAGES+=",MySQL-python"
}
function database_connection_url_mysql {
diff --git a/lib/databases/postgresql b/lib/databases/postgresql
index e891a08..a6bcf8c 100644
--- a/lib/databases/postgresql
+++ b/lib/databases/postgresql
@@ -100,9 +100,12 @@
else
exit_distro_not_supported "postgresql installation"
fi
+}
+function install_database_python_postgresql {
# Install Python client module
pip_install psycopg2
+ ADDITIONAL_VENV_PACKAGES+=",psycopg2"
}
function database_connection_url_postgresql {
diff --git a/lib/dstat b/lib/dstat
index 740e48f..c8faa65 100644
--- a/lib/dstat
+++ b/lib/dstat
@@ -41,7 +41,7 @@
# stop_dstat() stop dstat process
function stop_dstat {
# dstat runs as a console, not as a service, and isn't trackable
- # via the normal mechanisms for devstack. So lets just do a
+ # via the normal mechanisms for DevStack. So lets just do a
# killall and move on.
killall dstat || /bin/true
}
diff --git a/lib/glance b/lib/glance
old mode 100755
new mode 100644
index d16b345..578c88a
--- a/lib/glance
+++ b/lib/glance
@@ -31,8 +31,16 @@
# Set up default directories
GITDIR["python-glanceclient"]=$DEST/python-glanceclient
GITDIR["glance_store"]=$DEST/glance_store
-
GLANCE_DIR=$DEST/glance
+
+# Glance virtual environment
+if [[ ${USE_VENV} = True ]]; then
+ PROJECT_VENV["glance"]=${GLANCE_DIR}.venv
+ GLANCE_BIN_DIR=${PROJECT_VENV["glance"]}/bin
+else
+ GLANCE_BIN_DIR=$(get_python_exec_prefix)
+fi
+
GLANCE_CACHE_DIR=${GLANCE_CACHE_DIR:=$DATA_DIR/glance/cache}
GLANCE_IMAGE_DIR=${GLANCE_IMAGE_DIR:=$DATA_DIR/glance/images}
GLANCE_AUTH_CACHE_DIR=${GLANCE_AUTH_CACHE_DIR:-/var/cache/glance}
@@ -47,13 +55,6 @@
GLANCE_POLICY_JSON=$GLANCE_CONF_DIR/policy.json
GLANCE_SCHEMA_JSON=$GLANCE_CONF_DIR/schema-image.json
-# Support entry points installation of console scripts
-if [[ -d $GLANCE_DIR/bin ]]; then
- GLANCE_BIN_DIR=$GLANCE_DIR/bin
-else
- GLANCE_BIN_DIR=$(get_python_exec_prefix)
-fi
-
if is_ssl_enabled_service "glance" || is_service_enabled tls-proxy; then
GLANCE_SERVICE_PROTOCOL="https"
fi
@@ -104,7 +105,7 @@
if is_service_enabled qpid || [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; then
iniset $GLANCE_REGISTRY_CONF DEFAULT notification_driver messaging
fi
- iniset_rpc_backend glance $GLANCE_REGISTRY_CONF DEFAULT
+ iniset_rpc_backend glance $GLANCE_REGISTRY_CONF
cp $GLANCE_DIR/etc/glance-api.conf $GLANCE_API_CONF
iniset $GLANCE_API_CONF DEFAULT debug $ENABLE_DEBUG_LOG_LEVEL
@@ -117,7 +118,7 @@
if is_service_enabled qpid || [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; then
iniset $GLANCE_API_CONF DEFAULT notification_driver messaging
fi
- iniset_rpc_backend glance $GLANCE_API_CONF DEFAULT
+ iniset_rpc_backend glance $GLANCE_API_CONF
if [ "$VIRT_DRIVER" = 'xenserver' ]; then
iniset $GLANCE_API_CONF DEFAULT container_formats "ami,ari,aki,bare,ovf,tgz"
iniset $GLANCE_API_CONF DEFAULT disk_formats "ami,ari,aki,vhd,raw,iso"
diff --git a/lib/heat b/lib/heat
index d90df29..5cb0dbf 100644
--- a/lib/heat
+++ b/lib/heat
@@ -36,6 +36,7 @@
HEAT_CFNTOOLS_DIR=$DEST/heat-cfntools
HEAT_TEMPLATES_REPO_DIR=$DEST/heat-templates
OCC_DIR=$DEST/os-collect-config
+DIB_UTILS_DIR=$DEST/dib-utils
ORC_DIR=$DEST/os-refresh-config
OAC_DIR=$DEST/os-apply-config
@@ -106,7 +107,7 @@
cp $HEAT_DIR/etc/heat/policy.json $HEAT_POLICY_FILE
# common options
- iniset_rpc_backend heat $HEAT_CONF DEFAULT
+ iniset_rpc_backend heat $HEAT_CONF
iniset $HEAT_CONF DEFAULT heat_metadata_server_url http://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT
iniset $HEAT_CONF DEFAULT heat_waitcondition_server_url http://$HEAT_API_CFN_HOST:$HEAT_API_CFN_PORT/v1/waitcondition
iniset $HEAT_CONF DEFAULT heat_watch_server_url http://$HEAT_API_CW_HOST:$HEAT_API_CW_PORT
@@ -123,6 +124,8 @@
setup_colorized_logging $HEAT_CONF DEFAULT tenant user
fi
+ iniset $HEAT_CONF DEFAULT deferred_auth_method $HEAT_DEFERRED_AUTH
+
# NOTE(jamielennox): heat re-uses specific values from the
# keystone_authtoken middleware group and so currently fails when using the
# auth plugin setup. This should be fixed in heat. Heat is also the only
@@ -216,6 +219,10 @@
function install_heat_other {
git_clone $HEAT_CFNTOOLS_REPO $HEAT_CFNTOOLS_DIR $HEAT_CFNTOOLS_BRANCH
git_clone $HEAT_TEMPLATES_REPO $HEAT_TEMPLATES_REPO_DIR $HEAT_TEMPLATES_BRANCH
+ git_clone $OAC_REPO $OAC_DIR $OAC_BRANCH
+ git_clone $OCC_REPO $OCC_DIR $OCC_BRANCH
+ git_clone $ORC_REPO $ORC_DIR $ORC_BRANCH
+ git_clone $DIB_UTILS_REPO $DIB_UTILS_DIR $DIB_UTILS_BRANCH
}
# start_heat() - Start running processes, including screen
@@ -264,10 +271,6 @@
get_or_create_role "heat_stack_user"
fi
- if [[ $HEAT_DEFERRED_AUTH == trusts ]]; then
- iniset $HEAT_CONF DEFAULT deferred_auth_method trusts
- fi
-
if [[ "$HEAT_STACK_DOMAIN" == "True" ]]; then
# Note we have to pass token/endpoint here because the current endpoint and
# version negotiation in OSC means just --os-identity-api-version=3 won't work
@@ -296,7 +299,7 @@
# build_heat_pip_mirror() - Build a pip mirror containing heat agent projects
function build_heat_pip_mirror {
- local project_dirs="$OCC_DIR $OAC_DIR $ORC_DIR $HEAT_CFNTOOLS_DIR"
+ local project_dirs="$OCC_DIR $OAC_DIR $ORC_DIR $HEAT_CFNTOOLS_DIR $DIB_UTILS_DIR"
local projpath proj package
rm -rf $HEAT_PIP_REPO
@@ -332,6 +335,7 @@
" -i $heat_pip_repo_apache_conf
enable_apache_site heat_pip_repo
restart_apache_server
+ sudo iptables -I INPUT -d $HOST_IP -p tcp --dport $HEAT_PIP_REPO_PORT -j ACCEPT || true
}
# Restore xtrace
diff --git a/lib/horizon b/lib/horizon
index c6e3692..63a9d0f 100644
--- a/lib/horizon
+++ b/lib/horizon
@@ -129,7 +129,7 @@
fi
enable_apache_site horizon
- # Remove old log files that could mess with how devstack detects whether Horizon
+ # Remove old log files that could mess with how DevStack detects whether Horizon
# has been successfully started (see start_horizon() and functions::screen_it())
# and run_process
sudo rm -f /var/log/$APACHE_NAME/horizon_*
diff --git a/lib/ironic b/lib/ironic
index 09b1fc2..c8481ab 100644
--- a/lib/ironic
+++ b/lib/ironic
@@ -53,7 +53,7 @@
# The file is composed of multiple lines, each line includes four field
# separated by white space: IPMI address, MAC address, IPMI username
# and IPMI password.
-# An example:
+#
# 192.168.110.107 00:1e:67:57:50:4c root otc123
IRONIC_IPMIINFO_FILE=${IRONIC_IPMIINFO_FILE:-$IRONIC_DATA_DIR/hardware_info}
@@ -99,10 +99,10 @@
IRONIC_AGENT_RAMDISK_URL=${IRONIC_AGENT_RAMDISK_URL:-http://tarballs.openstack.org/ironic-python-agent/coreos/files/coreos_production_pxe_image-oem.cpio.gz}
# Which deploy driver to use - valid choices right now
-# are 'pxe_ssh', 'pxe_ipmitool', 'agent_ssh' and 'agent_ipmitool'.
+# are ``pxe_ssh``, ``pxe_ipmitool``, ``agent_ssh`` and ``agent_ipmitool``.
IRONIC_DEPLOY_DRIVER=${IRONIC_DEPLOY_DRIVER:-pxe_ssh}
-#TODO(agordeev): replace 'ubuntu' with host distro name getting
+# TODO(agordeev): replace 'ubuntu' with host distro name getting
IRONIC_DEPLOY_FLAVOR=${IRONIC_DEPLOY_FLAVOR:-ubuntu $IRONIC_DEPLOY_ELEMENT}
# Support entry points installation of console scripts
@@ -181,7 +181,11 @@
# install_ironic() - Collect source and prepare
function install_ironic {
# make sure all needed service were enabled
- for srv in nova glance key; do
+ local req_services="key"
+ if [[ "$VIRT_DRIVER" == "ironic" ]]; then
+ req_services+=" nova glance neutron"
+ fi
+ for srv in $req_services; do
if ! is_service_enabled "$srv"; then
die $LINENO "$srv should be enabled for Ironic."
fi
@@ -305,7 +309,7 @@
iniset $IRONIC_CONF_FILE keystone_authtoken cafile $SSL_BUNDLE_FILE
iniset $IRONIC_CONF_FILE keystone_authtoken signing_dir $IRONIC_AUTH_CACHE_DIR/api
- iniset_rpc_backend ironic $IRONIC_CONF_FILE DEFAULT
+ iniset_rpc_backend ironic $IRONIC_CONF_FILE
iniset $IRONIC_CONF_FILE api port $IRONIC_SERVICE_PORT
cp -p $IRONIC_DIR/etc/ironic/policy.json $IRONIC_POLICY_JSON
@@ -366,6 +370,7 @@
iniset $IRONIC_CONF_FILE glance swift_container glance
iniset $IRONIC_CONF_FILE glance swift_temp_url_duration 3600
iniset $IRONIC_CONF_FILE agent heartbeat_timeout 30
+ iniset $IRONIC_CONF_FILE agent agent_erase_devices_priority 0
fi
if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then
diff --git a/lib/keystone b/lib/keystone
index b7acb37..7b41812 100644
--- a/lib/keystone
+++ b/lib/keystone
@@ -37,8 +37,16 @@
# Set up default directories
GITDIR["python-keystoneclient"]=$DEST/python-keystoneclient
GITDIR["keystonemiddleware"]=$DEST/keystonemiddleware
-
KEYSTONE_DIR=$DEST/keystone
+
+# Keystone virtual environment
+if [[ ${USE_VENV} = True ]]; then
+ PROJECT_VENV["keystone"]=${KEYSTONE_DIR}.venv
+ KEYSTONE_BIN_DIR=${PROJECT_VENV["keystone"]}/bin
+else
+ KEYSTONE_BIN_DIR=$(get_python_exec_prefix)
+fi
+
KEYSTONE_CONF_DIR=${KEYSTONE_CONF_DIR:-/etc/keystone}
KEYSTONE_CONF=$KEYSTONE_CONF_DIR/keystone.conf
KEYSTONE_PASTE_INI=${KEYSTONE_PASTE_INI:-$KEYSTONE_CONF_DIR/keystone-paste.ini}
@@ -144,6 +152,7 @@
local keystone_keyfile=""
local keystone_service_port=$KEYSTONE_SERVICE_PORT
local keystone_auth_port=$KEYSTONE_AUTH_PORT
+ local venv_path=""
if is_ssl_enabled_service key; then
keystone_ssl="SSLEngine On"
@@ -154,6 +163,9 @@
keystone_service_port=$KEYSTONE_SERVICE_PORT_INT
keystone_auth_port=$KEYSTONE_AUTH_PORT_INT
fi
+ if [[ ${USE_VENV} = True ]]; then
+ venv_path="python-path=${PROJECT_VENV["keystone"]}/lib/python2.7/site-packages"
+ fi
# copy proxy vhost and wsgi file
sudo cp $KEYSTONE_DIR/httpd/keystone.py $KEYSTONE_WSGI_DIR/main
@@ -169,7 +181,8 @@
s|%SSLENGINE%|$keystone_ssl|g;
s|%SSLCERTFILE%|$keystone_certfile|g;
s|%SSLKEYFILE%|$keystone_keyfile|g;
- s|%USER%|$STACK_USER|g
+ s|%USER%|$STACK_USER|g;
+ s|%VIRTUALENV%|$venv_path|g
" -i $keystone_apache_conf
}
@@ -222,26 +235,26 @@
iniset $KEYSTONE_CONF assignment driver "keystone.assignment.backends.$KEYSTONE_ASSIGNMENT_BACKEND.Assignment"
fi
- iniset_rpc_backend keystone $KEYSTONE_CONF DEFAULT
+ iniset_rpc_backend keystone $KEYSTONE_CONF
# Set the URL advertised in the ``versions`` structure returned by the '/' route
iniset $KEYSTONE_CONF DEFAULT public_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/"
iniset $KEYSTONE_CONF DEFAULT admin_endpoint "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_AUTH_PORT/"
- iniset $KEYSTONE_CONF DEFAULT admin_bind_host "$KEYSTONE_ADMIN_BIND_HOST"
+ iniset $KEYSTONE_CONF eventlet_server admin_bind_host "$KEYSTONE_ADMIN_BIND_HOST"
# Register SSL certificates if provided
if is_ssl_enabled_service key; then
ensure_certificates KEYSTONE
- iniset $KEYSTONE_CONF ssl enable True
- iniset $KEYSTONE_CONF ssl certfile $KEYSTONE_SSL_CERT
- iniset $KEYSTONE_CONF ssl keyfile $KEYSTONE_SSL_KEY
+ iniset $KEYSTONE_CONF eventlet_server_ssl enable True
+ iniset $KEYSTONE_CONF eventlet_server_ssl certfile $KEYSTONE_SSL_CERT
+ iniset $KEYSTONE_CONF eventlet_server_ssl keyfile $KEYSTONE_SSL_KEY
fi
if is_service_enabled tls-proxy; then
# Set the service ports for a proxy to take the originals
- iniset $KEYSTONE_CONF DEFAULT public_port $KEYSTONE_SERVICE_PORT_INT
- iniset $KEYSTONE_CONF DEFAULT admin_port $KEYSTONE_AUTH_PORT_INT
+ iniset $KEYSTONE_CONF eventlet_server public_port $KEYSTONE_SERVICE_PORT_INT
+ iniset $KEYSTONE_CONF eventlet_server admin_port $KEYSTONE_AUTH_PORT_INT
fi
iniset $KEYSTONE_CONF DEFAULT admin_token "$SERVICE_TOKEN"
@@ -317,7 +330,7 @@
iniset $KEYSTONE_CONF DEFAULT max_token_size 16384
- iniset $KEYSTONE_CONF DEFAULT admin_workers "$API_WORKERS"
+ iniset $KEYSTONE_CONF eventlet_server admin_workers "$API_WORKERS"
# Public workers will use the server default, typically number of CPU.
}
@@ -353,6 +366,12 @@
# demo demo Member, anotherrole
# invisible_to_admin demo Member
+# Group Users Roles Tenant
+# ------------------------------------------------------------------
+# admins admin admin admin
+# nonadmin demo Member, anotherrole demo
+
+
# Migrated from keystone_data.sh
function create_keystone_accounts {
@@ -394,8 +413,14 @@
get_or_add_user_project_role $another_role $demo_user $demo_tenant
get_or_add_user_project_role $member_role $demo_user $invis_tenant
- get_or_create_group "developers" "default" "openstack developers"
- get_or_create_group "testers" "default"
+ local admin_group=$(get_or_create_group "admins" \
+ "default" "openstack admin group")
+ local non_admin_group=$(get_or_create_group "nonadmins" \
+ "default" "non-admin group")
+
+ get_or_add_group_project_role $member_role $non_admin_group $demo_tenant
+ get_or_add_group_project_role $another_role $non_admin_group $demo_tenant
+ get_or_add_group_project_role $admin_role $admin_group $admin_tenant
# Keystone
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
@@ -460,20 +485,20 @@
recreate_database keystone
# Initialize keystone database
- $KEYSTONE_DIR/bin/keystone-manage db_sync
+ $KEYSTONE_BIN_DIR/keystone-manage db_sync
local extension_value
for extension_value in ${KEYSTONE_EXTENSIONS//,/ }; do
if [[ -z "${extension_value}" ]]; then
continue
fi
- $KEYSTONE_DIR/bin/keystone-manage db_sync --extension "${extension_value}"
+ $KEYSTONE_BIN_DIR/keystone-manage db_sync --extension "${extension_value}"
done
if [[ "$KEYSTONE_TOKEN_FORMAT" != "uuid" ]]; then
# Set up certificates
rm -rf $KEYSTONE_CONF_DIR/ssl
- $KEYSTONE_DIR/bin/keystone-manage pki_setup
+ $KEYSTONE_BIN_DIR/keystone-manage pki_setup
# Create cache dir
sudo install -d -o $STACK_USER $KEYSTONE_AUTH_CACHE_DIR
@@ -492,9 +517,14 @@
# install_keystonemiddleware() - Collect source and prepare
function install_keystonemiddleware {
+ # install_keystonemiddleware() is called when keystonemiddleware is needed
+ # to provide an opportunity to install it from the source repo
if use_library_from_git "keystonemiddleware"; then
git_clone_by_name "keystonemiddleware"
setup_dev_lib "keystonemiddleware"
+ else
+ # When not installing from repo, keystonemiddleware is still needed...
+ pip_install keystonemiddleware
fi
}
@@ -542,7 +572,7 @@
tail_log key-access /var/log/$APACHE_NAME/keystone_access.log
else
# Start Keystone in a screen window
- run_process key "$KEYSTONE_DIR/bin/keystone-all --config-file $KEYSTONE_CONF"
+ run_process key "$KEYSTONE_BIN_DIR/keystone-all --config-file $KEYSTONE_CONF"
fi
echo "Waiting for keystone to start..."
diff --git a/lib/lvm b/lib/lvm
index d0322c7..54976a3 100644
--- a/lib/lvm
+++ b/lib/lvm
@@ -1,3 +1,5 @@
+#!/bin/bash
+#
# lib/lvm
# Configure the default LVM volume group used by Cinder and Nova
@@ -32,8 +34,8 @@
BACKING_FILE_SUFFIX=-backing-file
-# Entry Points
-# ------------
+# Functions
+# ---------
# _clean_lvm_volume_group removes all default LVM volumes
#
@@ -52,7 +54,7 @@
function _clean_lvm_backing_file {
local backing_file=$1
- # if the backing physical device is a loop device, it was probably setup by devstack
+ # If the backing physical device is a loop device, it was probably setup by DevStack
if [[ -n "$backing_file" ]] && [[ -e "$backing_file" ]]; then
local vg_dev=$(sudo losetup -j $backing_file | awk -F':' '/'$BACKING_FILE_SUFFIX'/ { print $1}')
sudo losetup -d $vg_dev
@@ -108,15 +110,20 @@
if is_fedora || is_suse; then
# services is not started by default
start_service lvm2-lvmetad
- start_service tgtd
+ if [ "$CINDER_ISCSI_HELPER" = "tgtadm" ]; then
+ start_service tgtd
+ fi
fi
# Start with a clean volume group
_create_lvm_volume_group $vg $size
# Remove iscsi targets
- sudo tgtadm --op show --mode target | grep Target | cut -f3 -d ' ' | sudo xargs -n1 tgt-admin --delete || true
-
+ if [ "$CINDER_ISCSI_HELPER" = "lioadm" ]; then
+ sudo cinder-rtstool get-targets | sudo xargs -rn 1 cinder-rtstool delete
+ else
+ sudo tgtadm --op show --mode target | grep Target | cut -f3 -d ' ' | sudo xargs -n1 tgt-admin --delete || true
+ fi
_clean_lvm_volume_group $vg
}
diff --git a/lib/neutron b/lib/neutron-legacy
old mode 100755
new mode 100644
similarity index 96%
rename from lib/neutron
rename to lib/neutron-legacy
index 2c8c56d..c6d9296
--- a/lib/neutron
+++ b/lib/neutron-legacy
@@ -426,7 +426,7 @@
# Set common config for all neutron server and agents.
function configure_neutron {
_configure_neutron_common
- iniset_rpc_backend neutron $NEUTRON_CONF DEFAULT
+ iniset_rpc_backend neutron $NEUTRON_CONF
# goes before q-svc to init Q_SERVICE_PLUGIN_CLASSES
if is_service_enabled q-lbaas; then
@@ -779,9 +779,41 @@
fi
}
+# _move_neutron_addresses_route() - Move the primary IP to the OVS bridge
+# on startup, or back to the public interface on cleanup
+function _move_neutron_addresses_route {
+ local from_intf=$1
+ local to_intf=$2
+ local add_ovs_port=$3
+
+ if [[ -n "$from_intf" && -n "$to_intf" ]]; then
+ # Remove the primary IP address from $from_intf and add it to $to_intf,
+ # along with the default route, if it exists. Also, when called
+ # on configure we will also add $from_intf as a port on $to_intf,
+ # assuming it is an OVS bridge.
+
+ local IP_BRD=$(ip -4 a s dev $from_intf | awk '/inet/ { print $2, $3, $4; exit }')
+ local DEFAULT_ROUTE_GW=$(ip r | awk "/default.+$from_intf/ { print \$3; exit }")
+ local ADD_OVS_PORT=""
+
+ if [ "$DEFAULT_ROUTE_GW" != "" ]; then
+ ADD_DEFAULT_ROUTE="sudo ip r replace default via $DEFAULT_ROUTE_GW dev $to_intf"
+ fi
+
+ if [[ "$add_ovs_port" == "True" ]]; then
+ ADD_OVS_PORT="sudo ovs-vsctl --may-exist add-port $to_intf $from_intf"
+ fi
+
+ sudo ip addr del $IP_BRD dev $from_intf; sudo ip addr add $IP_BRD dev $to_intf; $ADD_OVS_PORT; $ADD_DEFAULT_ROUTE
+ fi
+}
+
# cleanup_neutron() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_neutron {
+
+ _move_neutron_addresses_route "$OVS_PHYSICAL_BRIDGE" "$PUBLIC_INTERFACE" False
+
if is_provider_network && is_ironic_hardware; then
for IP in $(ip addr show dev $OVS_PHYSICAL_BRIDGE | grep ' inet ' | awk '{print $2}'); do
sudo ip addr del $IP dev $OVS_PHYSICAL_BRIDGE
@@ -956,6 +988,10 @@
_neutron_setup_interface_driver $Q_L3_CONF_FILE
neutron_plugin_configure_l3_agent
+
+ if [[ $(ip -4 a s dev "$PUBLIC_INTERFACE" | grep -c 'inet') != 0 ]]; then
+ _move_neutron_addresses_route "$PUBLIC_INTERFACE" "$OVS_PHYSICAL_BRIDGE" True
+ fi
}
function _configure_neutron_metadata_agent {
@@ -1227,8 +1263,10 @@
if is_neutron_ovs_base_plugin && [[ "$Q_USE_NAMESPACE" = "True" ]]; then
local ext_gw_interface=$(_neutron_get_ext_gw_interface)
local cidr_len=${FLOATING_RANGE#*/}
- sudo ip addr add $ext_gw_ip/$cidr_len dev $ext_gw_interface
- sudo ip link set $ext_gw_interface up
+ if [[ $(ip addr show dev $ext_gw_interface | grep -c $ext_gw_ip) == 0 && ( $Q_USE_PROVIDERNET_FOR_PUBLIC == "False" || $Q_USE_PUBLIC_VETH == "True" ) ]]; then
+ sudo ip addr add $ext_gw_ip/$cidr_len dev $ext_gw_interface
+ sudo ip link set $ext_gw_interface up
+ fi
ROUTER_GW_IP=`neutron port-list -c fixed_ips -c device_owner | grep router_gateway | awk -F '"' -v subnet_id=$PUB_SUBNET_ID '$4 == subnet_id { print $8; }'`
die_if_not_set $LINENO ROUTER_GW_IP "Failure retrieving ROUTER_GW_IP"
sudo route add -net $FIXED_RANGE gw $ROUTER_GW_IP
diff --git a/lib/neutron_plugins/README.md b/lib/neutron_plugins/README.md
index 7192a05..4b220d3 100644
--- a/lib/neutron_plugins/README.md
+++ b/lib/neutron_plugins/README.md
@@ -13,7 +13,7 @@
functions
---------
-``lib/neutron`` calls the following functions when the ``$Q_PLUGIN`` is enabled
+``lib/neutron-legacy`` calls the following functions when the ``$Q_PLUGIN`` is enabled
* ``neutron_plugin_create_nova_conf`` :
set ``NOVA_VIF_DRIVER`` and optionally set options in nova_conf
diff --git a/lib/neutron_thirdparty/README.md b/lib/neutron_thirdparty/README.md
index 5655e0b..905ae77 100644
--- a/lib/neutron_thirdparty/README.md
+++ b/lib/neutron_thirdparty/README.md
@@ -10,7 +10,7 @@
functions
---------
-``lib/neutron`` calls the following functions when the ``<third_party>`` is enabled
+``lib/neutron-legacy`` calls the following functions when the ``<third_party>`` is enabled
functions to be implemented
* ``configure_<third_party>``:
diff --git a/lib/nova b/lib/nova
index 32dea77..807dfce 100644
--- a/lib/nova
+++ b/lib/nova
@@ -32,9 +32,16 @@
# Set up default directories
GITDIR["python-novaclient"]=$DEST/python-novaclient
-
-
NOVA_DIR=$DEST/nova
+
+# Nova virtual environment
+if [[ ${USE_VENV} = True ]]; then
+ PROJECT_VENV["nova"]=${NOVA_DIR}.venv
+ NOVA_BIN_DIR=${PROJECT_VENV["nova"]}/bin
+else
+ NOVA_BIN_DIR=$(get_python_exec_prefix)
+fi
+
NOVA_STATE_PATH=${NOVA_STATE_PATH:=$DATA_DIR/nova}
# INSTANCES_PATH is the previous name for this
NOVA_INSTANCES_PATH=${NOVA_INSTANCES_PATH:=${INSTANCES_PATH:=$NOVA_STATE_PATH/instances}}
@@ -48,8 +55,9 @@
NOVA_API_PASTE_INI=${NOVA_API_PASTE_INI:-$NOVA_CONF_DIR/api-paste.ini}
# NOVA_API_VERSION valid options
-# - default - setup API end points as nova does out of the box
-# - v21default - make v21 the default on /v2
+# - default - setup API end points as nova does out of the box
+# - v21default - make v21 the default on /v2
+#
# NOTE(sdague): this is for transitional testing of the Nova v21 API.
# Expect to remove in L or M.
NOVA_API_VERSION=${NOVA_API_VERSION-default}
@@ -69,19 +77,9 @@
EC2_SERVICE_PORT=${EC2_SERVICE_PORT:-8773}
EC2_SERVICE_PORT_INT=${EC2_SERVICE_PORT_INT:-18773}
-# Support entry points installation of console scripts
-if [[ -d $NOVA_DIR/bin ]]; then
- NOVA_BIN_DIR=$NOVA_DIR/bin
-else
- NOVA_BIN_DIR=$(get_python_exec_prefix)
-fi
-
-# Set the paths of certain binaries
-NOVA_ROOTWRAP=$(get_rootwrap_location nova)
-
# Option to enable/disable config drive
-# NOTE: Set FORCE_CONFIG_DRIVE="False" to turn OFF config drive
-FORCE_CONFIG_DRIVE=${FORCE_CONFIG_DRIVE:-"always"}
+# NOTE: Set ``FORCE_CONFIG_DRIVE="False"`` to turn OFF config drive
+FORCE_CONFIG_DRIVE=${FORCE_CONFIG_DRIVE:-"True"}
# Nova supports pluggable schedulers. The default ``FilterScheduler``
# should work in most cases.
@@ -92,11 +90,11 @@
# Set default defaults here as some hypervisor drivers override these
PUBLIC_INTERFACE_DEFAULT=br100
FLAT_NETWORK_BRIDGE_DEFAULT=br100
-# set the GUEST_INTERFACE_DEFAULT to some interface on the box so that
-# the default isn't completely crazy. This will match eth*, em*, or
-# the new p* interfaces, then basically picks the first
+# Set ``GUEST_INTERFACE_DEFAULT`` to some interface on the box so that
+# the default isn't completely crazy. This will match ``eth*``, ``em*``, or
+# the new ``p*`` interfaces, then basically picks the first
# alphabetically. It's probably wrong, however it's less wrong than
-# always using 'eth0' which doesn't exist on new Linux distros at all.
+# always using ``eth0`` which doesn't exist on new Linux distros at all.
GUEST_INTERFACE_DEFAULT=$(ip link \
| grep 'state UP' \
| awk '{print $2}' \
@@ -104,8 +102,8 @@
| grep ^[ep] \
| head -1)
-# $NOVA_VNC_ENABLED can be used to forcibly enable vnc configuration.
-# In multi-node setups allows compute hosts to not run n-novnc.
+# ``NOVA_VNC_ENABLED`` can be used to forcibly enable VNC configuration.
+# In multi-node setups allows compute hosts to not run ``n-novnc``.
NOVA_VNC_ENABLED=$(trueorfalse False NOVA_VNC_ENABLED)
# Get hypervisor configuration
@@ -147,7 +145,7 @@
# running the VM - removing a SPOF and bandwidth bottleneck.
MULTI_HOST=$(trueorfalse False MULTI_HOST)
-# ``NOVA_ALLOW_MOVE_TO_SAME_HOST` can be set to False in multi node devstack,
+# ``NOVA_ALLOW_MOVE_TO_SAME_HOST`` can be set to False in multi node DevStack,
# where there are at least two nova-computes.
NOVA_ALLOW_MOVE_TO_SAME_HOST=$(trueorfalse True NOVA_ALLOW_MOVE_TO_SAME_HOST)
@@ -225,33 +223,6 @@
#fi
}
-# configure_nova_rootwrap() - configure Nova's rootwrap
-function configure_nova_rootwrap {
- # Deploy new rootwrap filters files (owned by root).
- # Wipe any existing rootwrap.d files first
- if [[ -d $NOVA_CONF_DIR/rootwrap.d ]]; then
- sudo rm -rf $NOVA_CONF_DIR/rootwrap.d
- fi
-
- # Deploy filters to /etc/nova/rootwrap.d
- sudo install -d -o root -g root -m 755 $NOVA_CONF_DIR/rootwrap.d
- sudo install -o root -g root -m 644 $NOVA_DIR/etc/nova/rootwrap.d/*.filters $NOVA_CONF_DIR/rootwrap.d
-
- # Set up rootwrap.conf, pointing to /etc/nova/rootwrap.d
- sudo install -o root -g root -m 644 $NOVA_DIR/etc/nova/rootwrap.conf $NOVA_CONF_DIR
- sudo sed -e "s:^filters_path=.*$:filters_path=$NOVA_CONF_DIR/rootwrap.d:" -i $NOVA_CONF_DIR/rootwrap.conf
-
- # Specify rootwrap.conf as first parameter to nova-rootwrap
- local rootwrap_sudoer_cmd="$NOVA_ROOTWRAP $NOVA_CONF_DIR/rootwrap.conf *"
-
- # Set up the rootwrap sudoers for nova
- local tempfile=`mktemp`
- echo "$STACK_USER ALL=(root) NOPASSWD: $rootwrap_sudoer_cmd" >$tempfile
- chmod 0440 $tempfile
- sudo chown root:root $tempfile
- sudo mv $tempfile /etc/sudoers.d/nova-rootwrap
-}
-
# configure_nova() - Set config files, create data dirs, etc
function configure_nova {
# Put config files in ``/etc/nova`` for everyone to find
@@ -259,7 +230,7 @@
install_default_policy nova
- configure_nova_rootwrap
+ configure_rootwrap nova $NOVA_BIN_DIR/nova-rootwrap $NOVA_DIR/etc/nova
if [[ "$ENABLED_SERVICES" =~ "n-api" ]]; then
# Get the sample configuration file in place
@@ -532,7 +503,7 @@
iniset $NOVA_CONF DEFAULT ec2_dmz_host "$EC2_DMZ_HOST"
iniset $NOVA_CONF DEFAULT keystone_ec2_url $KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_SERVICE_PORT/v2.0/ec2tokens
- iniset_rpc_backend nova $NOVA_CONF DEFAULT
+ iniset_rpc_backend nova $NOVA_CONF
iniset $NOVA_CONF glance api_servers "${GLANCE_SERVICE_PROTOCOL}://${GLANCE_HOSTPORT}"
iniset $NOVA_CONF DEFAULT osapi_compute_workers "$API_WORKERS"
@@ -696,6 +667,10 @@
service_protocol="http"
fi
+ # Hack to set the path for rootwrap
+ local old_path=$PATH
+ export PATH=$NOVA_BIN_DIR:$PATH
+
run_process n-api "$NOVA_BIN_DIR/nova-api"
echo "Waiting for nova-api to start..."
if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$SERVICE_HOST:$service_port; then
@@ -707,10 +682,16 @@
start_tls_proxy '*' $NOVA_SERVICE_PORT $NOVA_SERVICE_HOST $NOVA_SERVICE_PORT_INT &
start_tls_proxy '*' $EC2_SERVICE_PORT $NOVA_SERVICE_HOST $EC2_SERVICE_PORT_INT &
fi
+
+ export PATH=$old_path
}
# start_nova_compute() - Start the compute process
function start_nova_compute {
+ # Hack to set the path for rootwrap
+ local old_path=$PATH
+ export PATH=$NOVA_BIN_DIR:$PATH
+
if is_service_enabled n-cell; then
local compute_cell_conf=$NOVA_CELLS_CONF
else
@@ -738,10 +719,16 @@
fi
run_process n-cpu "$NOVA_BIN_DIR/nova-compute --config-file $compute_cell_conf"
fi
+
+ export PATH=$old_path
}
# start_nova() - Start running processes, including screen
function start_nova_rest {
+ # Hack to set the path for rootwrap
+ local old_path=$PATH
+ export PATH=$NOVA_BIN_DIR:$PATH
+
local api_cell_conf=$NOVA_CONF
if is_service_enabled n-cell; then
local compute_cell_conf=$NOVA_CELLS_CONF
@@ -769,6 +756,8 @@
# Swift will act as s3 objectstore.
is_service_enabled swift3 || \
run_process n-obj "$NOVA_BIN_DIR/nova-objectstore --config-file $api_cell_conf"
+
+ export PATH=$old_path
}
function start_nova {
diff --git a/lib/nova_plugins/functions-libvirt b/lib/nova_plugins/functions-libvirt
old mode 100644
new mode 100755
index 4d617e8..d4a0768
--- a/lib/nova_plugins/functions-libvirt
+++ b/lib/nova_plugins/functions-libvirt
@@ -14,20 +14,29 @@
# Defaults
# --------
-# if we should turn on massive libvirt debugging
-DEBUG_LIBVIRT=$(trueorfalse False DEBUG_LIBVIRT)
+# Turn on selective debug log filters for libvirt.
+# (NOTE: Enabling this by default, because the log filters enabled in
+# 'configure_libvirt' function further below are _selective_ and not
+# extremely verbose.)
+DEBUG_LIBVIRT=$(trueorfalse True DEBUG_LIBVIRT)
# Installs required distro-specific libvirt packages.
function install_libvirt {
if is_ubuntu; then
- install_package qemu-kvm
- install_package libvirt-bin
- install_package python-libvirt
- install_package python-guestfs
+ if is_arch "aarch64" && [[ ${DISTRO} =~ (trusty|utopic) ]]; then
+ install_package qemu-system
+ else
+ install_package qemu-kvm
+ install_package libguestfs0
+ install_package python-guestfs
+ fi
+ install_package libvirt-bin libvirt-dev
+ pip_install libvirt-python
+ #pip_install <there-si-no-guestfs-in-pypi>
elif is_fedora || is_suse; then
install_package kvm
- install_package libvirt
- install_package libvirt-python
+ install_package libvirt libvirt-devel
+ pip_install libvirt-python
install_package python-libguestfs
fi
@@ -97,9 +106,9 @@
# source file paths, not relative paths. This screws with the matching
# of '1:libvirt' making everything turn on. So use libvirt.c for now.
# This will have to be re-visited when Ubuntu ships libvirt >= 1.2.3
- local log_filters="1:libvirt.c 1:qemu 1:conf 1:security 3:object 3:event 3:json 3:file 1:util"
+ local log_filters="1:libvirt.c 1:qemu 1:conf 1:security 3:object 3:event 3:json 3:file 1:util 1:qemu_monitor"
else
- local log_filters="1:libvirt 1:qemu 1:conf 1:security 3:object 3:event 3:json 3:file 1:util"
+ local log_filters="1:libvirt 1:qemu 1:conf 1:security 3:object 3:event 3:json 3:file 1:util 1:qemu_monitor"
fi
local log_outputs="1:file:/var/log/libvirt/libvirtd.log"
if ! grep -q "log_filters=\"$log_filters\"" /etc/libvirt/libvirtd.conf; then
@@ -110,10 +119,18 @@
fi
fi
+ # Update the libvirt cpu map with a gate64 cpu model. This enables nova
+ # live migration for 64bit guest OSes on heterogenous cloud "hardware".
+ if [[ -f /usr/share/libvirt/cpu_map.xml ]] ; then
+ sudo $TOP_DIR/tools/cpu_map_update.py /usr/share/libvirt/cpu_map.xml
+ fi
+
# libvirt detects various settings on startup, as we potentially changed
# the system configuration (modules, filesystems), we need to restart
- # libvirt to detect those changes.
- restart_service $LIBVIRT_DAEMON
+ # libvirt to detect those changes. Use a stop start as otherwise the new
+ # cpu_map is not loaded properly on some systems (Ubuntu).
+ stop_service $LIBVIRT_DAEMON
+ start_service $LIBVIRT_DAEMON
}
diff --git a/lib/nova_plugins/hypervisor-ironic b/lib/nova_plugins/hypervisor-ironic
index 0169d73..b9e286d 100644
--- a/lib/nova_plugins/hypervisor-ironic
+++ b/lib/nova_plugins/hypervisor-ironic
@@ -54,9 +54,7 @@
# install_nova_hypervisor() - Install external components
function install_nova_hypervisor {
- if ! is_service_enabled neutron; then
- die $LINENO "Neutron should be enabled for usage of the Ironic Nova driver."
- elif is_ironic_hardware; then
+ if is_ironic_hardware; then
return
fi
install_libvirt
diff --git a/lib/oslo b/lib/oslo
index 86efb60..d9688a0 100644
--- a/lib/oslo
+++ b/lib/oslo
@@ -2,7 +2,7 @@
#
# lib/oslo
#
-# Functions to install oslo libraries from git
+# Functions to install **Oslo** libraries from git
#
# We need this to handle the fact that projects would like to use
# pre-released versions of oslo libraries.
@@ -46,8 +46,9 @@
# Support entry points installation of console scripts
OSLO_BIN_DIR=$(get_python_exec_prefix)
-# Entry Points
-# ------------
+
+# Functions
+# ---------
function _do_install_oslo_lib {
local name=$1
diff --git a/lib/rpc_backend b/lib/rpc_backend
index a399d17..cc083de 100644
--- a/lib/rpc_backend
+++ b/lib/rpc_backend
@@ -1,8 +1,7 @@
#!/bin/bash
#
# lib/rpc_backend
-# Interface for interactig with different rpc backend
-# rpc backend settings
+# Interface for interactig with different RPC backends
# Dependencies:
#
@@ -27,10 +26,10 @@
# messaging server as a service, which it really isn't for multi host
QPID_HOST=${QPID_HOST:-}
+
# Functions
# ---------
-
# Make sure we only have one rpc backend enabled.
# Also check the specified rpc backend is available on your platform.
function check_rpc_backend {
@@ -246,13 +245,12 @@
function iniset_rpc_backend {
local package=$1
local file=$2
- local section=$3
+ local section=${3:-DEFAULT}
if is_service_enabled zeromq; then
iniset $file $section rpc_backend "zmq"
iniset $file $section rpc_zmq_host `hostname`
if [ "$ZEROMQ_MATCHMAKER" == "redis" ]; then
- iniset $file $section rpc_zmq_matchmaker \
- oslo.messaging._drivers.matchmaker_redis.MatchMakerRedis
+ iniset $file $section rpc_zmq_matchmaker "redis"
MATCHMAKER_REDIS_HOST=${MATCHMAKER_REDIS_HOST:-127.0.0.1}
iniset $file matchmaker_redis host $MATCHMAKER_REDIS_HOST
else
@@ -272,9 +270,9 @@
fi
elif is_service_enabled rabbit || { [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; }; then
iniset $file $section rpc_backend "rabbit"
- iniset $file $section rabbit_hosts $RABBIT_HOST
- iniset $file $section rabbit_password $RABBIT_PASSWORD
- iniset $file $section rabbit_userid $RABBIT_USERID
+ iniset $file oslo_messaging_rabbit rabbit_hosts $RABBIT_HOST
+ iniset $file oslo_messaging_rabbit rabbit_password $RABBIT_PASSWORD
+ iniset $file oslo_messaging_rabbit rabbit_userid $RABBIT_USERID
fi
}
diff --git a/lib/sahara b/lib/sahara
index 77bf89f..0651b0a 100644
--- a/lib/sahara
+++ b/lib/sahara
@@ -113,12 +113,13 @@
configure_auth_token_middleware $SAHARA_CONF_FILE sahara $SAHARA_AUTH_CACHE_DIR
+ iniset_rpc_backend sahara $SAHARA_CONF_FILE DEFAULT
+
# Set configuration to send notifications
if is_service_enabled ceilometer; then
iniset $SAHARA_CONF_FILE DEFAULT enable_notifications "true"
iniset $SAHARA_CONF_FILE DEFAULT notification_driver "messaging"
- iniset_rpc_backend sahara $SAHARA_CONF_FILE DEFAULT
fi
iniset $SAHARA_CONF_FILE DEFAULT verbose True
@@ -203,12 +204,16 @@
# start_sahara() - Start running processes, including screen
function start_sahara {
run_process sahara "$SAHARA_BIN_DIR/sahara-all --config-file $SAHARA_CONF_FILE"
+ run_process sahara-api "$SAHARA_BIN_DIR/sahara-api --config-file $SAHARA_CONF_FILE"
+ run_process sahara-eng "$SAHARA_BIN_DIR/sahara-engine --config-file $SAHARA_CONF_FILE"
}
# stop_sahara() - Stop running processes
function stop_sahara {
# Kill the Sahara screen windows
stop_process sahara
+ stop_process sahara-api
+ stop_process sahara-eng
}
diff --git a/lib/stack b/lib/stack
index 9a509d8..47e8ce2 100644
--- a/lib/stack
+++ b/lib/stack
@@ -2,27 +2,34 @@
#
# lib/stack
#
-# These functions are code snippets pulled out of stack.sh for easier
+# These functions are code snippets pulled out of ``stack.sh`` for easier
# re-use by Grenade. They can assume the same environment is available
-# as in the lower part of stack.sh, namely a valid stackrc has been sourced
-# as well as all of the lib/* files for the services have been sourced.
+# as in the lower part of ``stack.sh``, namely a valid stackrc has been sourced
+# as well as all of the ``lib/*`` files for the services have been sourced.
#
# For clarity, all functions declared here that came from ``stack.sh``
# shall be named with the prefix ``stack_``.
+# Functions
+# ---------
+
# Generic service install handles venv creation if confgured for service
# stack_install_service service
function stack_install_service {
local service=$1
if type install_${service} >/dev/null 2>&1; then
- if [[ -n ${PROJECT_VENV[$service]:-} ]]; then
+ if [[ ${USE_VENV} = True && -n ${PROJECT_VENV[$service]:-} ]]; then
rm -rf ${PROJECT_VENV[$service]}
- source $TOP_DIR/tools/build_venv.sh ${PROJECT_VENV[$service]}
+ source $TOP_DIR/tools/build_venv.sh ${PROJECT_VENV[$service]} ${ADDITIONAL_VENV_PACKAGES//,/ }
export PIP_VIRTUAL_ENV=${PROJECT_VENV[$service]:-}
+
+ # Install other OpenStack prereqs that might come from source repos
+ install_oslo
+ install_keystonemiddleware
fi
install_${service}
- if [[ -n ${PROJECT_VENV[$service]:-} ]]; then
+ if [[ ${USE_VENV} = True && -n ${PROJECT_VENV[$service]:-} ]]; then
unset PIP_VIRTUAL_ENV
fi
fi
diff --git a/lib/swift b/lib/swift
index 0fd6711..456dde4 100644
--- a/lib/swift
+++ b/lib/swift
@@ -38,7 +38,6 @@
# Set up default directories
GITDIR["python-swiftclient"]=$DEST/python-swiftclient
-
SWIFT_DIR=$DEST/swift
SWIFT_AUTH_CACHE_DIR=${SWIFT_AUTH_CACHE_DIR:-/var/cache/swift}
SWIFT_APACHE_WSGI_DIR=${SWIFT_APACHE_WSGI_DIR:-/var/www/swift}
@@ -59,16 +58,24 @@
SWIFT_CONF_DIR=${SWIFT_CONF_DIR:-/etc/swift}
if is_service_enabled s-proxy && is_service_enabled swift3; then
- # If we are using swift3, we can default the s3 port to swift instead
+ # If we are using ``swift3``, we can default the S3 port to swift instead
# of nova-objectstore
S3_SERVICE_PORT=${S3_SERVICE_PORT:-8080}
fi
-# DevStack will create a loop-back disk formatted as XFS to store the
-# swift data. Set ``SWIFT_LOOPBACK_DISK_SIZE`` to the disk size in
-# kilobytes.
-# Default is 1 gigabyte.
-SWIFT_LOOPBACK_DISK_SIZE_DEFAULT=1G
+if is_service_enabled g-api; then
+ # Minimum Cinder volume size is 1G so if Swift backend for Glance is
+ # only 1G we can not upload volume to image.
+ # Increase Swift disk size up to 2G
+ SWIFT_LOOPBACK_DISK_SIZE_DEFAULT=2G
+else
+ # DevStack will create a loop-back disk formatted as XFS to store the
+ # swift data. Set ``SWIFT_LOOPBACK_DISK_SIZE`` to the disk size in
+ # kilobytes.
+ # Default is 1 gigabyte.
+ SWIFT_LOOPBACK_DISK_SIZE_DEFAULT=1G
+fi
+
# if tempest enabled the default size is 6 Gigabyte.
if is_service_enabled tempest; then
SWIFT_LOOPBACK_DISK_SIZE_DEFAULT=${SWIFT_LOOPBACK_DISK_SIZE:-6G}
@@ -129,11 +136,12 @@
SWIFT_ENABLE_TEMPURLS=${SWIFT_ENABLE_TEMPURLS:-False}
SWIFT_TEMPURL_KEY=${SWIFT_TEMPURL_KEY:-}
+# Toggle for deploying Swift under HTTPD + mod_wsgi
+SWIFT_USE_MOD_WSGI=${SWIFT_USE_MOD_WSGI:-False}
+
# Tell Tempest this project is present
TEMPEST_SERVICES+=,swift
-# Toggle for deploying Swift under HTTPD + mod_wsgi
-SWIFT_USE_MOD_WSGI=${SWIFT_USE_MOD_WSGI:-False}
# Functions
# ---------
@@ -295,7 +303,6 @@
sed -i -e "s,#[ ]*recon_cache_path .*,recon_cache_path = ${SWIFT_DATA_DIR}/cache," ${swift_node_config}
}
-
# configure_swift() - Set config files, create data dirs and loop image
function configure_swift {
local swift_pipeline="${SWIFT_EXTRAS_MIDDLEWARE_NO_AUTH}"
@@ -367,12 +374,9 @@
iniset ${SWIFT_CONFIG_PROXY_SERVER} DEFAULT key_file "$SWIFT_SSL_KEY"
fi
- # Devstack is commonly run in a small slow environment, so bump the
- # timeouts up.
- # node_timeout is how long between read operations a node takes to
- # respond to the proxy server
- # conn_timeout is all about how long it takes a connect() system call to
- # return
+ # DevStack is commonly run in a small slow environment, so bump the timeouts up.
+ # ``node_timeout`` is the node read operation response time to the proxy server
+ # ``conn_timeout`` is how long it takes a connect() system call to return
iniset ${SWIFT_CONFIG_PROXY_SERVER} app:proxy-server node_timeout 120
iniset ${SWIFT_CONFIG_PROXY_SERVER} app:proxy-server conn_timeout 20
@@ -387,10 +391,10 @@
SWIFT_EXTRAS_MIDDLEWARE_LAST="${SWIFT_EXTRAS_MIDDLEWARE_LAST} ceilometer"
fi
- # Restrict the length of auth tokens in the swift proxy-server logs.
+ # Restrict the length of auth tokens in the Swift ``proxy-server`` logs.
iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:proxy-logging reveal_sensitive_prefix ${SWIFT_LOG_TOKEN_LENGTH}
- # By default Swift will be installed with keystone and tempauth middleware
+ # By default Swift will be installed with Keystone and tempauth middleware
# and add the swift3 middleware if its configured for it. The token for
# tempauth would be prefixed with the reseller_prefix setting `TEMPAUTH_` the
# token for keystoneauth would have the standard reseller_prefix `AUTH_`
@@ -406,17 +410,13 @@
sed -i "/^pipeline/ { s/tempauth/${swift_pipeline} ${SWIFT_EXTRAS_MIDDLEWARE}/ ;}" ${SWIFT_CONFIG_PROXY_SERVER}
sed -i "/^pipeline/ { s/proxy-server/${SWIFT_EXTRAS_MIDDLEWARE_LAST} proxy-server/ ; }" ${SWIFT_CONFIG_PROXY_SERVER}
-
iniset ${SWIFT_CONFIG_PROXY_SERVER} app:proxy-server account_autocreate true
-
-
# Configure Crossdomain
iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:crossdomain use "egg:swift#crossdomain"
-
- # This causes the authtoken middleware to use the same python logging
- # adapter provided by the swift proxy-server, so that request transaction
+ # Configure authtoken middleware to use the same Python logging
+ # adapter provided by the Swift ``proxy-server``, so that request transaction
# IDs will included in all of its log messages.
iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken log_name swift
@@ -429,7 +429,7 @@
iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:keystoneauth use "egg:swift#keystoneauth"
iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:keystoneauth operator_roles "Member, admin"
- # Configure Tempauth. In the sample config file, Keystoneauth is commented
+ # Configure Tempauth. In the sample config file Keystoneauth is commented
# out. Make sure we uncomment Tempauth after we uncomment Keystoneauth
# otherwise, this code also sets the reseller_prefix for Keystoneauth.
iniuncomment ${SWIFT_CONFIG_PROXY_SERVER} filter:tempauth account_autocreate
@@ -574,7 +574,8 @@
sudo chown -R ${STACK_USER}: ${node}
done
}
-# create_swift_accounts() - Set up standard swift accounts and extra
+
+# create_swift_accounts() - Set up standard Swift accounts and extra
# one for tests we do this by attaching all words in the account name
# since we want to make it compatible with tempauth which use
# underscores for separators.
@@ -588,9 +589,9 @@
# swifttenanttest4 swiftusertest4 admin swift_test
function create_swift_accounts {
- # Defines specific passwords used by tools/create_userrc.sh
- # As these variables are used by create_userrc.sh, they must be exported
- # The _password suffix is expected by create_userrc.sh
+ # Defines specific passwords used by ``tools/create_userrc.sh``
+ # As these variables are used by ``create_userrc.sh,`` they must be exported
+ # The _password suffix is expected by ``create_userrc.sh``.
export swiftusertest1_password=testing
export swiftusertest2_password=testing2
export swiftusertest3_password=testing3
@@ -720,8 +721,8 @@
# By default with only one replica we are launching the proxy,
# container, account and object server in screen in foreground and
- # other services in background. If we have SWIFT_REPLICAS set to something
- # greater than one we first spawn all the swift services then kill the proxy
+ # other services in background. If we have ``SWIFT_REPLICAS`` set to something
+ # greater than one we first spawn all the Swift services then kill the proxy
# service so we can run it in foreground in screen. ``swift-init ...
# {stop|restart}`` exits with '1' if no servers are running, ignore it just
# in case
@@ -757,7 +758,7 @@
swift-init --run-dir=${SWIFT_DATA_DIR}/run rest stop && return 0
fi
- # screen normally killed by unstack.sh
+ # screen normally killed by ``unstack.sh``
if type -p swift-init >/dev/null; then
swift-init --run-dir=${SWIFT_DATA_DIR}/run all stop || true
fi
diff --git a/lib/tempest b/lib/tempest
index 7672ff8..e8e9e0b 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -62,13 +62,11 @@
# The default is set to 196 seconds.
BUILD_TIMEOUT=${BUILD_TIMEOUT:-196}
-
# This must be False on stable branches, as master tempest
# deps do not match stable branch deps. Set this to True to
-# have tempest installed in devstack by default.
+# have tempest installed in DevStack by default.
INSTALL_TEMPEST=${INSTALL_TEMPEST:-"True"}
-
BOTO_MATERIALS_PATH="$FILES/images/s3-materials/cirros-${CIRROS_VERSION}"
BOTO_CONF=/etc/boto.cfg
@@ -83,6 +81,7 @@
IPV6_ENABLED=$(trueorfalse True IPV6_ENABLED)
IPV6_SUBNET_ATTRIBUTES_ENABLED=$(trueorfalse True IPV6_SUBNET_ATTRIBUTES_ENABLED)
+
# Functions
# ---------
@@ -168,15 +167,19 @@
esac
fi
- # Create tempest.conf from tempest.conf.sample
- # copy every time, because the image UUIDS are going to change
+ # Create ``tempest.conf`` from ``tempest.conf.sample``
+ # Copy every time because the image UUIDS are going to change
sudo install -d -o $STACK_USER $TEMPEST_CONFIG_DIR
install -m 644 $TEMPEST_DIR/etc/tempest.conf.sample $TEMPEST_CONFIG
password=${ADMIN_PASSWORD:-secrete}
- # See files/keystone_data.sh and stack.sh where admin, demo and alt_demo
- # user and tenant are set up...
+ # Do we want to make a configuration where Tempest has admin on
+ # the cloud. We don't always want to so that we can ensure Tempest
+ # would work on a public cloud.
+ TEMPEST_HAS_ADMIN=$(trueorfalse True TEMPEST_HAS_ADMIN)
+
+ # See ``lib/keystone`` where these users and tenants are set up
ADMIN_USERNAME=${ADMIN_USERNAME:-admin}
ADMIN_TENANT_NAME=${ADMIN_TENANT_NAME:-admin}
ADMIN_DOMAIN_NAME=${ADMIN_DOMAIN_NAME:-Default}
@@ -187,13 +190,13 @@
ADMIN_TENANT_ID=$(openstack project list | awk "/ admin / { print \$2 }")
if is_service_enabled nova; then
- # If the ``DEFAULT_INSTANCE_TYPE`` not declared, use the new behavior
- # Tempest creates instane types for himself
+ # If ``DEFAULT_INSTANCE_TYPE`` is not declared, use the new behavior
+ # Tempest creates its own instance types
if [[ -z "$DEFAULT_INSTANCE_TYPE" ]]; then
available_flavors=$(nova flavor-list)
if [[ ! ( $available_flavors =~ 'm1.nano' ) ]]; then
if is_arch "ppc64"; then
- # qemu needs at least 128MB of memory to boot on ppc64
+ # Qemu needs at least 128MB of memory to boot on ppc64
nova flavor-create m1.nano 42 128 0 1
else
nova flavor-create m1.nano 42 64 0 1
@@ -210,8 +213,7 @@
fi
flavor_ref_alt=84
else
- # Check Nova for existing flavors and, if set, look for the
- # ``DEFAULT_INSTANCE_TYPE`` and use that.
+ # Check Nova for existing flavors, if ``DEFAULT_INSTANCE_TYPE`` is set use it.
boto_instance_type=$DEFAULT_INSTANCE_TYPE
flavor_lines=`nova flavor-list`
IFS=$'\r\n'
@@ -236,8 +238,8 @@
flavor_ref=${flavors[0]}
flavor_ref_alt=$flavor_ref
- # ensure flavor_ref and flavor_ref_alt have different values
- # some resize instance in tempest tests depends on this.
+ # Ensure ``flavor_ref`` and ``flavor_ref_alt`` have different values.
+ # Some resize instance in tempest tests depends on this.
for f in ${flavors[@]:1}; do
if [[ $f -ne $flavor_ref ]]; then
flavor_ref_alt=$f
@@ -262,14 +264,24 @@
public_network_id=$(neutron net-list | grep $PUBLIC_NETWORK_NAME | \
awk '{print $2}')
if [ "$Q_USE_NAMESPACE" == "False" ]; then
- # If namespaces are disabled, devstack will create a single
+ # If namespaces are disabled, DevStack will create a single
# public router that tempest should be configured to use.
public_router_id=$(neutron router-list | awk "/ $Q_ROUTER_NAME / \
{ print \$2 }")
fi
fi
+ EC2_URL=$(openstack endpoint show -f value -c publicurl ec2 || true)
+ if [[ -z $EC2_URL ]]; then
+ EC2_URL="$EC2_SERVICE_PROTOCOL://$SERVICE_HOST:8773/"
+ fi
+ S3_URL=$(openstack endpoint show -f value -c publicurl s3 || true)
+ if [[ -z $S3_URL ]]; then
+ S3_URL="http://$SERVICE_HOST:${S3_SERVICE_PORT:-3333}"
+ fi
+
iniset $TEMPEST_CONFIG DEFAULT use_syslog $SYSLOG
+
# Oslo
iniset $TEMPEST_CONFIG oslo_concurrency lock_path $TEMPEST_STATE_PATH
mkdir -p $TEMPEST_STATE_PATH
@@ -292,28 +304,29 @@
iniset $TEMPEST_CONFIG identity alt_username $ALT_USERNAME
iniset $TEMPEST_CONFIG identity alt_password "$password"
iniset $TEMPEST_CONFIG identity alt_tenant_name $ALT_TENANT_NAME
- iniset $TEMPEST_CONFIG identity admin_username $ADMIN_USERNAME
- iniset $TEMPEST_CONFIG identity admin_password "$password"
- iniset $TEMPEST_CONFIG identity admin_tenant_name $ADMIN_TENANT_NAME
- iniset $TEMPEST_CONFIG identity admin_tenant_id $ADMIN_TENANT_ID
- iniset $TEMPEST_CONFIG identity admin_domain_name $ADMIN_DOMAIN_NAME
+ if [[ "$TEMPEST_HAS_ADMIN" == "True" ]]; then
+ iniset $TEMPEST_CONFIG identity admin_username $ADMIN_USERNAME
+ iniset $TEMPEST_CONFIG identity admin_password "$password"
+ iniset $TEMPEST_CONFIG identity admin_tenant_name $ADMIN_TENANT_NAME
+ iniset $TEMPEST_CONFIG identity admin_tenant_id $ADMIN_TENANT_ID
+ iniset $TEMPEST_CONFIG identity admin_domain_name $ADMIN_DOMAIN_NAME
+ fi
iniset $TEMPEST_CONFIG identity auth_version ${TEMPEST_AUTH_VERSION:-v2}
if is_ssl_enabled_service "key" || is_service_enabled tls-proxy; then
iniset $TEMPEST_CONFIG identity ca_certificates_file $SSL_BUNDLE_FILE
fi
# Image
- # for the gate we want to be able to override this variable so we aren't
- # doing an HTTP fetch over the wide internet for this test
+ # We want to be able to override this variable in the gate to avoid
+ # doing an external HTTP fetch for this test.
if [[ ! -z "$TEMPEST_HTTP_IMAGE" ]]; then
iniset $TEMPEST_CONFIG image http_image $TEMPEST_HTTP_IMAGE
fi
# Auth
+ TEMPEST_ALLOW_TENANT_ISOLATION=${TEMPEST_ALLOW_TENANT_ISOLATION:-$TEMPEST_HAS_ADMIN}
iniset $TEMPEST_CONFIG auth allow_tenant_isolation ${TEMPEST_ALLOW_TENANT_ISOLATION:-True}
- if [[ "$TEMPEST_AUTH_VERSION" == "v3" ]]; then
- iniset $TEMPEST_CONFIG auth tempest_roles "Member"
- fi
+ iniset $TEMPEST_CONFIG auth tempest_roles "Member"
# Compute
iniset $TEMPEST_CONFIG compute ssh_user ${DEFAULT_INSTANCE_USER:-cirros} # DEPRECATED
@@ -327,13 +340,14 @@
iniset $TEMPEST_CONFIG compute flavor_ref $flavor_ref
iniset $TEMPEST_CONFIG compute flavor_ref_alt $flavor_ref_alt
iniset $TEMPEST_CONFIG compute ssh_connect_method $ssh_connect_method
+ iniset $TEMPEST_CONFIG compute fixed_network_name $PRIVATE_NETWORK_NAME
# Compute Features
- # Run verify_tempest_config -ur to retrieve enabled extensions on API endpoints
+ # Run ``verify_tempest_config -ur`` to retrieve enabled extensions on API endpoints
# NOTE(mtreinish): This must be done after auth settings are added to the tempest config
local tmp_cfg_file=$(mktemp)
cd $TEMPEST_DIR
- tox -evenv -- verify-tempest-config -uro $tmp_cfg_file
+ tox -revenv -- verify-tempest-config -uro $tmp_cfg_file
local compute_api_extensions=${COMPUTE_API_EXTENSIONS:-"all"}
if [[ ! -z "$DISABLE_COMPUTE_API_EXTENSIONS" ]]; then
@@ -348,11 +362,8 @@
iniset $TEMPEST_CONFIG compute-feature-enabled change_password False
iniset $TEMPEST_CONFIG compute-feature-enabled block_migration_for_live_migration ${USE_BLOCK_MIGRATION_FOR_LIVE_MIGRATION:-False}
iniset $TEMPEST_CONFIG compute-feature-enabled api_extensions $compute_api_extensions
-
- # Compute admin
- iniset $TEMPEST_CONFIG "compute-admin" username $ADMIN_USERNAME
- iniset $TEMPEST_CONFIG "compute-admin" password "$password"
- iniset $TEMPEST_CONFIG "compute-admin" tenant_name $ADMIN_TENANT_NAME
+ # TODO(mriedem): Remove the preserve_ports flag when Juno is end of life.
+ iniset $TEMPEST_CONFIG compute-feature-enabled preserve_ports True
# Network
iniset $TEMPEST_CONFIG network api_version 2.0
@@ -373,8 +384,8 @@
iniset $TEMPEST_CONFIG network-feature-enabled api_extensions $network_api_extensions
# boto
- iniset $TEMPEST_CONFIG boto ec2_url "$EC2_SERVICE_PROTOCOL://$SERVICE_HOST:8773/"
- iniset $TEMPEST_CONFIG boto s3_url "http://$SERVICE_HOST:${S3_SERVICE_PORT:-3333}"
+ iniset $TEMPEST_CONFIG boto ec2_url "$EC2_URL"
+ iniset $TEMPEST_CONFIG boto s3_url "$S3_URL"
iniset $TEMPEST_CONFIG boto s3_materials_path "$BOTO_MATERIALS_PATH"
iniset $TEMPEST_CONFIG boto ari_manifest cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-initrd.manifest.xml
iniset $TEMPEST_CONFIG boto ami_manifest cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-blank.img.manifest.xml
@@ -399,20 +410,22 @@
fi
# Scenario
- iniset $TEMPEST_CONFIG scenario img_dir "$FILES/images/cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-uec"
+ SCENARIO_IMAGE_DIR=${SCENARIO_IMAGE_DIR:-$FILES/images/cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-uec}
+ iniset $TEMPEST_CONFIG scenario img_dir $SCENARIO_IMAGE_DIR
iniset $TEMPEST_CONFIG scenario ami_img_file "cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-blank.img"
iniset $TEMPEST_CONFIG scenario ari_img_file "cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-initrd"
iniset $TEMPEST_CONFIG scenario aki_img_file "cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-vmlinuz"
+ iniset $TEMPEST_CONFIG scenario img_file "cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-disk.img"
# Large Ops Number
iniset $TEMPEST_CONFIG scenario large_ops_number ${TEMPEST_LARGE_OPS_NUMBER:-0}
# Telemetry
- # Ceilometer API optimization happened in juno that allows to run more tests in tempest.
+ # Ceilometer API optimization happened in Juno that allows to run more tests in tempest.
# Once Tempest retires support for icehouse this flag can be removed.
iniset $TEMPEST_CONFIG telemetry too_slow_to_test "False"
- # Object storage
+ # Object Store
local object_storage_api_extensions=${OBJECT_STORAGE_API_EXTENSIONS:-"all"}
if [[ ! -z "$DISABLE_OBJECT_STORAGE_API_EXTENSIONS" ]]; then
# Enabled extensions are either the ones explicitly specified or those available on the API endpoint
@@ -436,7 +449,7 @@
iniset $TEMPEST_CONFIG volume-feature-enabled backup False
fi
- # Using CINDER_ENABLED_BACKENDS
+ # Using ``CINDER_ENABLED_BACKENDS``
if [[ -n "$CINDER_ENABLED_BACKENDS" ]] && [[ $CINDER_ENABLED_BACKENDS =~ .*,.* ]]; then
iniset $TEMPEST_CONFIG volume-feature-enabled multi_backend "True"
local i=1
@@ -461,12 +474,13 @@
iniset $TEMPEST_CONFIG dashboard dashboard_url "http://$SERVICE_HOST/"
iniset $TEMPEST_CONFIG dashboard login_url "http://$SERVICE_HOST/auth/login/"
- # cli
+ # CLI
iniset $TEMPEST_CONFIG cli cli_dir $NOVA_BIN_DIR
# Baremetal
if [ "$VIRT_DRIVER" = "ironic" ] ; then
iniset $TEMPEST_CONFIG baremetal driver_enabled True
+ iniset $TEMPEST_CONFIG baremetal unprovision_timeout 300
iniset $TEMPEST_CONFIG compute-feature-enabled change_password False
iniset $TEMPEST_CONFIG compute-feature-enabled console_output False
iniset $TEMPEST_CONFIG compute-feature-enabled interface_attach False
@@ -486,7 +500,7 @@
iniset $TEMPEST_CONFIG compute-feature-enabled suspend False
fi
- # service_available
+ # ``service_available``
for service in ${TEMPEST_SERVICES//,/ }; do
if is_service_enabled $service ; then
iniset $TEMPEST_CONFIG service_available $service "True"
@@ -496,7 +510,7 @@
done
if is_ssl_enabled_service "key" || is_service_enabled tls-proxy; then
- # Use the BOTO_CONFIG environment variable to point to this file
+ # Use the ``BOTO_CONFIG`` environment variable to point to this file
iniset $BOTO_CONF Boto ca_certificates_file $SSL_BUNDLE_FILE
sudo chown $STACK_USER $BOTO_CONF
fi
@@ -511,7 +525,6 @@
# ------------------------------------------------------------------
# alt_demo alt_demo Member
-# Migrated from keystone_data.sh
function create_tempest_accounts {
if is_service_enabled tempest; then
# Tempest has some tests that validate various authorization checks
@@ -522,13 +535,13 @@
fi
}
-# install_tempest_lib() - Collect source, prepare, and install tempest-lib
+# install_tempest_lib() - Collect source, prepare, and install ``tempest-lib``
function install_tempest_lib {
if use_library_from_git "tempest-lib"; then
git_clone_by_name "tempest-lib"
setup_dev_lib "tempest-lib"
- # NOTE(mtreinish) For testing tempest-lib from git with tempest we need
- # put the git version of tempest-lib in the tempest job's tox venv
+ # NOTE(mtreinish) For testing ``tempest-lib`` from git with Tempest we need to
+ # put the git version of ``tempest-lib`` in the Tempest job's tox venv
export PIP_VIRTUAL_ENV=${PROJECT_VENV["tempest"]}
setup_dev_lib "tempest-lib"
unset PIP_VIRTUAL_ENV
@@ -546,7 +559,7 @@
popd
}
-# init_tempest() - Initialize ec2 images
+# init_tempest() - Initialize EC2 images
function init_tempest {
local base_image_name=cirros-${CIRROS_VERSION}-${CIRROS_ARCH}
# /opt/stack/devstack/files/images/cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-uec
@@ -555,12 +568,14 @@
local ramdisk="$image_dir/${base_image_name}-initrd"
local disk_image="$image_dir/${base_image_name}-blank.img"
if is_service_enabled nova; then
- # if the cirros uec downloaded and the system is uec capable
+ # If the CirrOS uec downloaded and the system is UEC capable
if [ -f "$kernel" -a -f "$ramdisk" -a -f "$disk_image" -a "$VIRT_DRIVER" != "openvz" \
-a \( "$LIBVIRT_TYPE" != "lxc" -o "$VIRT_DRIVER" != "libvirt" \) ]; then
echo "Prepare aki/ari/ami Images"
mkdir -p $BOTO_MATERIALS_PATH
( #new namespace
+ # euca2ools should be installed to call euca-* commands
+ is_package_installed euca2ools || install_package euca2ools
# tenant:demo ; user: demo
source $TOP_DIR/accrc/demo/demo
euca-bundle-image -r ${CIRROS_ARCH} -i "$kernel" --kernel true -d "$BOTO_MATERIALS_PATH"
diff --git a/lib/tls b/lib/tls
index 677895b..09f1c2d 100644
--- a/lib/tls
+++ b/lib/tls
@@ -32,6 +32,7 @@
# - is_ssl_enabled_service
# - enable_mod_ssl
+
# Defaults
# --------
@@ -92,7 +93,6 @@
cp /dev/null $ca_dir/index.txt
}
-
# Create a new CA configuration file
# create_CA_config ca-dir common-name
function create_CA_config {
@@ -248,7 +248,6 @@
fi
}
-
# make_cert creates and signs a new certificate with the given commonName and CA
# make_cert ca-dir cert-name "common-name" ["alt-name" ...]
function make_cert {
@@ -287,7 +286,6 @@
fi
}
-
# Make an intermediate CA to sign everything else
# make_int_CA ca-dir signing-ca-dir
function make_int_CA {
@@ -362,17 +360,16 @@
return 1
}
-
# Ensure that the certificates for a service are in place. This function does
# not check that a service is SSL enabled, this should already have been
# completed.
#
# The function expects to find a certificate, key and CA certificate in the
-# variables {service}_SSL_CERT, {service}_SSL_KEY and {service}_SSL_CA. For
-# example for keystone this would be KEYSTONE_SSL_CERT, KEYSTONE_SSL_KEY and
-# KEYSTONE_SSL_CA.
+# variables ``{service}_SSL_CERT``, ``{service}_SSL_KEY`` and ``{service}_SSL_CA``. For
+# example for keystone this would be ``KEYSTONE_SSL_CERT``, ``KEYSTONE_SSL_KEY`` and
+# ``KEYSTONE_SSL_CA``.
#
-# If it does not find these certificates then the devstack-issued server
+# If it does not find these certificates then the DevStack-issued server
# certificate, key and CA certificate will be associated with the service.
#
# If only some of the variables are provided then the function will quit.
@@ -437,14 +434,12 @@
# Cleanup Functions
# =================
-
# Stops all stud processes. This should be done only after all services
# using tls configuration are down.
function stop_tls_proxy {
killall stud
}
-
# Remove CA along with configuration, as well as the local server certificate
function cleanup_CA {
rm -rf "$DATA_DIR/CA" "$DEVSTACK_CERT"
diff --git a/lib/trove b/lib/trove
index 4c5a438..b0a9610 100644
--- a/lib/trove
+++ b/lib/trove
@@ -21,6 +21,7 @@
XTRACE=$(set +o | grep xtrace)
set +o xtrace
+
# Defaults
# --------
if is_service_enabled neutron; then
@@ -33,12 +34,12 @@
GITDIR["python-troveclient"]=$DEST/python-troveclient
TROVE_DIR=$DEST/trove
-TROVE_CONF_DIR=/etc/trove
-TROVE_CONF=$TROVE_CONF_DIR/trove.conf
-TROVE_TASKMANAGER_CONF=$TROVE_CONF_DIR/trove-taskmanager.conf
-TROVE_CONDUCTOR_CONF=$TROVE_CONF_DIR/trove-conductor.conf
-TROVE_GUESTAGENT_CONF=$TROVE_CONF_DIR/trove-guestagent.conf
-TROVE_API_PASTE_INI=$TROVE_CONF_DIR/api-paste.ini
+TROVE_CONF_DIR=${TROVE_CONF_DIR:-/etc/trove}
+TROVE_CONF=${TROVE_CONF:-$TROVE_CONF_DIR/trove.conf}
+TROVE_TASKMANAGER_CONF=${TROVE_TASKMANAGER_CONF:-$TROVE_CONF_DIR/trove-taskmanager.conf}
+TROVE_CONDUCTOR_CONF=${TROVE_CONDUCTOR_CONF:-$TROVE_CONF_DIR/trove-conductor.conf}
+TROVE_GUESTAGENT_CONF=${TROVE_GUESTAGENT_CONF:-$TROVE_CONF_DIR/trove-guestagent.conf}
+TROVE_API_PASTE_INI=${TROVE_API_PASTE_INI:-$TROVE_CONF_DIR/api-paste.ini}
TROVE_LOCAL_CONF_DIR=$TROVE_DIR/etc/trove
TROVE_LOCAL_API_PASTE_INI=$TROVE_LOCAL_CONF_DIR/api-paste.ini
@@ -80,7 +81,7 @@
fi
}
-# create_trove_accounts() - Set up common required trove accounts
+# create_trove_accounts() - Set up common required Trove accounts
# Tenant User Roles
# ------------------------------------------------------------------
@@ -115,7 +116,6 @@
rm -fr $TROVE_CONF_DIR/*
}
-
# configure_trove() - Set config files, create data dirs, etc
function configure_trove {
setup_develop $TROVE_DIR
diff --git a/lib/zaqar b/lib/zaqar
index 5f3f7bb..34f1915 100644
--- a/lib/zaqar
+++ b/lib/zaqar
@@ -132,7 +132,7 @@
iniset $ZAQAR_CONF DEFAULT notification_driver messaging
iniset $ZAQAR_CONF DEFAULT control_exchange zaqar
fi
- iniset_rpc_backend zaqar $ZAQAR_CONF DEFAULT
+ iniset_rpc_backend zaqar $ZAQAR_CONF
cleanup_zaqar
}
diff --git a/run_tests.sh b/run_tests.sh
index 3ba7e10..c6b7da6 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -11,9 +11,8 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
-#
-#
-# this runs a series of unit tests for devstack to ensure it's functioning
+
+# This runs a series of unit tests for DevStack to ensure it's functioning
PASSES=""
FAILURES=""
diff --git a/samples/local.conf b/samples/local.conf
index 63000b6..bd0cd9c 100644
--- a/samples/local.conf
+++ b/samples/local.conf
@@ -1,7 +1,6 @@
# Sample ``local.conf`` for user-configurable variables in ``stack.sh``
-# NOTE: Copy this file to the root ``devstack`` directory for it to
-# work properly.
+# NOTE: Copy this file to the root DevStack directory for it to work properly.
# ``local.conf`` is a user-maintained settings file that is sourced from ``stackrc``.
# This gives it the ability to override any variables set in ``stackrc``.
diff --git a/samples/local.sh b/samples/local.sh
index 664cb66..634f6dd 100755
--- a/samples/local.sh
+++ b/samples/local.sh
@@ -3,15 +3,14 @@
# Sample ``local.sh`` for user-configurable tasks to run automatically
# at the successful conclusion of ``stack.sh``.
-# NOTE: Copy this file to the root ``devstack`` directory for it to
-# work properly.
+# NOTE: Copy this file to the root DevStack directory for it to work properly.
# This is a collection of some of the things we have found to be useful to run
# after ``stack.sh`` to tweak the OpenStack configuration that DevStack produces.
# These should be considered as samples and are unsupported DevStack code.
-# Keep track of the devstack directory
+# Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0") && pwd)
# Import common functions
@@ -50,7 +49,7 @@
source $TOP_DIR/openrc admin admin
# Name of new flavor
- # set in ``localrc`` with ``DEFAULT_INSTANCE_TYPE=m1.micro``
+ # set in ``local.conf`` with ``DEFAULT_INSTANCE_TYPE=m1.micro``
MI_NAME=m1.micro
# Create micro flavor if not present
diff --git a/stack.sh b/stack.sh
index d83952a..adcaa21 100755
--- a/stack.sh
+++ b/stack.sh
@@ -16,18 +16,11 @@
# (14.04 Trusty or newer), **Fedora** (F20 or newer), or **CentOS/RHEL**
# (7 or newer) machine. (It may work on other platforms but support for those
# platforms is left to those who added them to DevStack.) It should work in
-# a VM or physical server. Additionally, we maintain a list of ``apt`` and
+# a VM or physical server. Additionally, we maintain a list of ``deb`` and
# ``rpm`` dependencies and other configuration files in this repo.
# Learn more and get the most recent version at http://devstack.org
-# check if someone has invoked with "sh"
-if [[ "${POSIXLY_CORRECT}" == "y" ]]; then
- echo "You appear to be running bash in POSIX compatability mode."
- echo "devstack uses bash features. \"./stack.sh\" should do the right thing"
- exit 1
-fi
-
# Make sure custom grep options don't get in the way
unset GREP_OPTIONS
@@ -44,7 +37,7 @@
# Not all distros have sbin in PATH for regular users.
PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin
-# Keep track of the devstack directory
+# Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0") && pwd)
# Check for uninitialized variables, a big cause of bugs
@@ -53,6 +46,10 @@
set -o nounset
fi
+
+# Configuration
+# =============
+
# Sanity Checks
# -------------
@@ -61,7 +58,7 @@
rm $TOP_DIR/.stackenv
fi
-# ``stack.sh`` keeps the list of ``apt`` and ``rpm`` dependencies and config
+# ``stack.sh`` keeps the list of ``deb`` and ``rpm`` dependencies, config
# templates and other useful files in the ``files`` subdirectory
FILES=$TOP_DIR/files
if [ ! -d $FILES ]; then
@@ -69,12 +66,23 @@
fi
# ``stack.sh`` keeps function libraries here
+# Make sure ``$TOP_DIR/inc`` directory is present
+if [ ! -d $TOP_DIR/inc ]; then
+ die $LINENO "missing devstack/inc"
+fi
+
+# ``stack.sh`` keeps project libraries here
# Make sure ``$TOP_DIR/lib`` directory is present
if [ ! -d $TOP_DIR/lib ]; then
die $LINENO "missing devstack/lib"
fi
-# Check if run as root
+# Check if run in POSIX shell
+if [[ "${POSIXLY_CORRECT}" == "y" ]]; then
+ echo "You are running POSIX compatibility mode, DevStack requires bash 4.2 or newer."
+ exit 1
+fi
+
# OpenStack is designed to be run as a non-root user; Horizon will fail to run
# as **root** since Apache will not serve content from **root** user).
# ``stack.sh`` must not be run as **root**. It aborts and suggests one course of
@@ -89,6 +97,7 @@
exit 1
fi
+
# Prepare the environment
# -----------------------
@@ -109,6 +118,7 @@
# and ``DISTRO``
GetDistro
+
# Global Settings
# ---------------
@@ -131,7 +141,6 @@
done
fi
-
# ``stack.sh`` is customizable by setting environment variables. Override a
# default setting via export::
#
@@ -142,18 +151,20 @@
#
# DATABASE_PASSWORD=simple ./stack.sh
#
-# Persistent variables can be placed in a ``localrc`` file::
+# Persistent variables can be placed in a ``local.conf`` file::
#
+# [[local|localrc]]
# DATABASE_PASSWORD=anothersecret
# DATABASE_USER=hellaroot
#
# We try to have sensible defaults, so you should be able to run ``./stack.sh``
-# in most cases. ``localrc`` is not distributed with DevStack and will never
+# in most cases. ``local.conf`` is not distributed with DevStack and will never
# be overwritten by a DevStack update.
#
# DevStack distributes ``stackrc`` which contains locations for the OpenStack
# repositories, branches to configure, and other configuration defaults.
-# ``stackrc`` sources ``localrc`` to allow you to safely override those settings.
+# ``stackrc`` sources the ``localrc`` section of ``local.conf`` to allow you to
+# safely override those settings.
if [[ ! -r $TOP_DIR/stackrc ]]; then
die $LINENO "missing $TOP_DIR/stackrc - did you grab more than just stack.sh?"
@@ -185,34 +196,27 @@
# Make sure the proxy config is visible to sub-processes
export_proxy_variables
-# Remove services which were negated in ENABLED_SERVICES
+# Remove services which were negated in ``ENABLED_SERVICES``
# using the "-" prefix (e.g., "-rabbit") instead of
# calling disable_service().
disable_negated_services
-# Look for obsolete stuff
-# if [[ ,${ENABLED_SERVICES}, =~ ,"swift", ]]; then
-# echo "FATAL: 'swift' is not supported as a service name"
-# echo "FATAL: Use the actual swift service names to enable them as required:"
-# echo "FATAL: s-proxy s-object s-container s-account"
-# exit 1
-# fi
# Configure sudo
# --------------
-# We're not **root**, make sure ``sudo`` is available
+# We're not as **root** so make sure ``sudo`` is available
is_package_installed sudo || install_package sudo
# UEC images ``/etc/sudoers`` does not have a ``#includedir``, add one
sudo grep -q "^#includedir.*/etc/sudoers.d" /etc/sudoers ||
echo "#includedir /etc/sudoers.d" | sudo tee -a /etc/sudoers
-# Set up devstack sudoers
+# Set up DevStack sudoers
TEMPFILE=`mktemp`
echo "$STACK_USER ALL=(root) NOPASSWD:ALL" >$TEMPFILE
-# Some binaries might be under /sbin or /usr/sbin, so make sure sudo will
-# see them by forcing PATH
+# Some binaries might be under ``/sbin`` or ``/usr/sbin``, so make sure sudo will
+# see them by forcing ``PATH``
echo "Defaults:$STACK_USER secure_path=/sbin:/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin" >> $TEMPFILE
echo "Defaults:$STACK_USER !requiretty" >> $TEMPFILE
chmod 0440 $TEMPFILE
@@ -223,7 +227,7 @@
# Configure Distro Repositories
# -----------------------------
-# For debian/ubuntu make apt attempt to retry network ops on it's own
+# For Debian/Ubuntu make apt attempt to retry network ops on it's own
if is_ubuntu; then
echo 'APT::Acquire::Retries "20";' | sudo tee /etc/apt/apt.conf.d/80retry >/dev/null
fi
@@ -234,7 +238,7 @@
if is_fedora && [[ $DISTRO == "rhel7" ]]; then
# RHEL requires EPEL for many Open Stack dependencies
- # note we always remove and install latest -- some environments
+ # NOTE: We always remove and install latest -- some environments
# use snapshot images, and if EPEL version updates they break
# unless we update them to latest version.
if sudo yum repolist enabled epel | grep -q 'epel'; then
@@ -245,7 +249,7 @@
# repo, then removes itself (as epel-release installed the
# "real" repo).
#
- # you would think that rather than this, you could use
+ # You would think that rather than this, you could use
# $releasever directly in .repo file we create below. However
# RHEL gives a $releasever of "6Server" which breaks the path;
# see https://bugzilla.redhat.com/show_bug.cgi?id=1150759
@@ -262,7 +266,7 @@
sudo yum-config-manager --enable epel-bootstrap
yum_install epel-release || \
die $LINENO "Error installing EPEL repo, cannot continue"
- # epel rpm has installed it's version
+ # EPEL rpm has installed it's version
sudo rm -f /etc/yum.repos.d/epel-bootstrap.repo
# ... and also optional to be enabled
@@ -278,6 +282,10 @@
die $LINENO "Error installing RDO repo, cannot continue"
fi
+ if is_oraclelinux; then
+ sudo yum-config-manager --enable ol7_optional_latest ol7_addons ol7_MySQL56
+ fi
+
fi
@@ -293,7 +301,7 @@
safe_chown -R $STACK_USER $DEST
safe_chmod 0755 $DEST
-# a basic test for $DEST path permissions (fatal on error unless skipped)
+# Basic test for ``$DEST`` path permissions (fatal on error unless skipped)
check_path_perm_sanity ${DEST}
# Destination path for service data
@@ -481,6 +489,9 @@
# an error. It is also useful for following along as the install occurs.
set -o xtrace
+# Print the kernel version
+uname -a
+
# Reset the bundle of CA certificates
SSL_BUNDLE_FILE="$DATA_DIR/ca-bundle.pem"
rm -f $SSL_BUNDLE_FILE
@@ -493,7 +504,7 @@
# and the specified rpc backend is available on your platform.
check_rpc_backend
-# Service to enable with SSL if USE_SSL is True
+# Service to enable with SSL if ``USE_SSL`` is True
SSL_ENABLED_SERVICES="key,nova,cinder,glance,s-proxy,neutron"
if is_service_enabled tls-proxy && [ "$USE_SSL" == "True" ]; then
@@ -503,7 +514,11 @@
# Configure Projects
# ==================
-# Import apache functions
+# Plugin Phase 0: override_defaults - allow pluggins to override
+# defaults before other services are run
+run_phase override_defaults
+
+# Import Apache functions
source $TOP_DIR/lib/apache
# Import TLS functions
@@ -521,7 +536,7 @@
source $TOP_DIR/lib/swift
source $TOP_DIR/lib/ceilometer
source $TOP_DIR/lib/heat
-source $TOP_DIR/lib/neutron
+source $TOP_DIR/lib/neutron-legacy
source $TOP_DIR/lib/ldap
source $TOP_DIR/lib/dstat
@@ -587,8 +602,9 @@
# Database Configuration
+# ----------------------
-# To select between database backends, add the following to ``localrc``:
+# To select between database backends, add the following to ``local.conf``:
#
# disable_service mysql
# enable_service postgresql
@@ -600,9 +616,10 @@
# Queue Configuration
+# -------------------
# Rabbit connection info
-# In multi node devstack, second node needs RABBIT_USERID, but rabbit
+# In multi node DevStack, second node needs ``RABBIT_USERID``, but rabbit
# isn't enabled.
RABBIT_USERID=${RABBIT_USERID:-stackrabbit}
if is_service_enabled rabbit; then
@@ -612,6 +629,7 @@
# Keystone
+# --------
if is_service_enabled keystone; then
# The ``SERVICE_TOKEN`` is used to bootstrap the Keystone database. It is
@@ -623,14 +641,14 @@
read_password ADMIN_PASSWORD "ENTER A PASSWORD TO USE FOR HORIZON AND KEYSTONE (20 CHARS OR LESS)."
# Keystone can now optionally install OpenLDAP by enabling the ``ldap``
- # service in ``localrc`` (e.g. ``enable_service ldap``).
+ # service in ``local.conf`` (e.g. ``enable_service ldap``).
# To clean out the Keystone contents in OpenLDAP set ``KEYSTONE_CLEAR_LDAP``
- # to ``yes`` (e.g. ``KEYSTONE_CLEAR_LDAP=yes``) in ``localrc``. To enable the
+ # to ``yes`` (e.g. ``KEYSTONE_CLEAR_LDAP=yes``) in ``local.conf``. To enable the
# Keystone Identity Driver (``keystone.identity.backends.ldap.Identity``)
# set ``KEYSTONE_IDENTITY_BACKEND`` to ``ldap`` (e.g.
- # ``KEYSTONE_IDENTITY_BACKEND=ldap``) in ``localrc``.
+ # ``KEYSTONE_IDENTITY_BACKEND=ldap``) in ``local.conf``.
- # only request ldap password if the service is enabled
+ # Only request LDAP password if the service is enabled
if is_service_enabled ldap; then
read_password LDAP_PASSWORD "ENTER A PASSWORD TO USE FOR LDAP"
fi
@@ -638,6 +656,7 @@
# Swift
+# -----
if is_service_enabled s-proxy; then
# We only ask for Swift Hash if we have enabled swift service.
@@ -661,14 +680,14 @@
echo_summary "Installing package prerequisites"
source $TOP_DIR/tools/install_prereqs.sh
-# Configure an appropriate python environment
+# Configure an appropriate Python environment
if [[ "$OFFLINE" != "True" ]]; then
PYPI_ALTERNATIVE_URL=${PYPI_ALTERNATIVE_URL:-""} $TOP_DIR/tools/install_pip.sh
fi
TRACK_DEPENDS=${TRACK_DEPENDS:-False}
-# Install python packages into a virtualenv so that we can track them
+# Install Python packages into a virtualenv so that we can track them
if [[ $TRACK_DEPENDS = True ]]; then
echo_summary "Installing Python packages into a virtualenv $DEST/.venv"
pip_install -U virtualenv
@@ -702,6 +721,7 @@
if is_service_enabled $DATABASE_BACKENDS; then
install_database
+ install_database_python
fi
if is_service_enabled neutron; then
@@ -716,10 +736,10 @@
# Install required infra support libraries
install_infra
-# Install oslo libraries that have graduated
+# Install Oslo libraries
install_oslo
-# Install clients libraries
+# Install client libraries
install_keystoneclient
install_glanceclient
install_cinderclient
@@ -737,7 +757,6 @@
# Install middleware
install_keystonemiddleware
-
if is_service_enabled keystone; then
if [ "$KEYSTONE_AUTH_HOST" == "$SERVICE_HOST" ]; then
stack_install_service keystone
@@ -754,7 +773,7 @@
# swift3 middleware to provide S3 emulation to Swift
if is_service_enabled swift3; then
- # replace the nova-objectstore port by the swift port
+ # Replace the nova-objectstore port by the swift port
S3_SERVICE_PORT=8080
git_clone $SWIFT3_REPO $SWIFT3_DIR $SWIFT3_BRANCH
setup_develop $SWIFT3_DIR
@@ -762,23 +781,25 @@
fi
if is_service_enabled g-api n-api; then
- # image catalog service
+ # Image catalog service
stack_install_service glance
configure_glance
fi
if is_service_enabled cinder; then
+ # Block volume service
stack_install_service cinder
configure_cinder
fi
if is_service_enabled neutron; then
+ # Network service
stack_install_service neutron
install_neutron_third_party
fi
if is_service_enabled nova; then
- # compute service
+ # Compute service
stack_install_service nova
cleanup_nova
configure_nova
@@ -810,18 +831,18 @@
configure_CA
init_CA
init_cert
- # Add name to /etc/hosts
- # don't be naive and add to existing line!
+ # Add name to ``/etc/hosts``.
+ # Don't be naive and add to existing line!
fi
+
# Extras Install
# --------------
# Phase: install
run_phase stack install
-
-# install the OpenStack client, needed for most setup commands
+# Install the OpenStack client, needed for most setup commands
if use_library_from_git "python-openstackclient"; then
git_clone_by_name "python-openstackclient"
setup_dev_lib "python-openstackclient"
@@ -829,7 +850,6 @@
pip_install 'python-openstackclient>=1.0.2'
fi
-
if [[ $TRACK_DEPENDS = True ]]; then
$DEST/.venv/bin/pip freeze > $DEST/requires-post-pip
if ! diff -Nru $DEST/requires-pre-pip $DEST/requires-post-pip > $DEST/requires.diff; then
@@ -922,7 +942,7 @@
screen -r $SCREEN_NAME -X setenv PROMPT_COMMAND /bin/true
fi
-# Clear screen rc file
+# Clear ``screenrc`` file
SCREENRC=$TOP_DIR/$SCREEN_NAME-screenrc
if [[ -e $SCREENRC ]]; then
rm -f $SCREENRC
@@ -931,14 +951,16 @@
# Initialize the directory for service status check
init_service_check
+
+# Start Services
+# ==============
+
# Dstat
-# -------
+# -----
# A better kind of sysstat, with the top process per time slice
start_dstat
-# Start Services
-# ==============
# Keystone
# --------
@@ -960,7 +982,7 @@
SERVICE_ENDPOINT=http://$KEYSTONE_AUTH_HOST:$KEYSTONE_AUTH_PORT_INT/v2.0
fi
- # Setup OpenStackclient token-flow auth
+ # Setup OpenStackClient token-endpoint auth
export OS_TOKEN=$SERVICE_TOKEN
export OS_URL=$SERVICE_ENDPOINT
@@ -982,10 +1004,10 @@
create_heat_accounts
fi
- # Begone token-flow auth
+ # Begone token auth
unset OS_TOKEN OS_URL
- # Set up password-flow auth creds now that keystone is bootstrapped
+ # Set up password auth credentials now that Keystone is bootstrapped
export OS_AUTH_URL=$SERVICE_ENDPOINT
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
@@ -1030,7 +1052,7 @@
echo_summary "Configuring Neutron"
configure_neutron
- # Run init_neutron only on the node hosting the neutron API server
+ # Run init_neutron only on the node hosting the Neutron API server
if is_service_enabled $DATABASE_BACKENDS && is_service_enabled q-svc; then
init_neutron
fi
@@ -1106,6 +1128,7 @@
init_nova_cells
fi
+
# Extras Configuration
# ====================
@@ -1116,7 +1139,7 @@
# Local Configuration
# ===================
-# Apply configuration from local.conf if it exists for layer 2 services
+# Apply configuration from ``local.conf`` if it exists for layer 2 services
# Phase: post-config
merge_config_group $TOP_DIR/local.conf post-config
@@ -1138,18 +1161,16 @@
start_glance
fi
+
# Install Images
# ==============
-# Upload an image to glance.
+# Upload an image to Glance.
#
-# The default image is cirros, a small testing image which lets you login as **root**
-# cirros has a ``cloud-init`` analog supporting login via keypair and sending
+# The default image is CirrOS, a small testing image which lets you login as **root**
+# CirrOS has a ``cloud-init`` analog supporting login via keypair and sending
# scripts as userdata.
-# See https://help.ubuntu.com/community/CloudInit for more on cloud-init
-#
-# Override ``IMAGE_URLS`` with a comma-separated list of UEC images.
-# * **precise**: http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64.tar.gz
+# See https://help.ubuntu.com/community/CloudInit for more on ``cloud-init``
if is_service_enabled g-reg; then
TOKEN=$(keystone token-get | grep ' id ' | get_field 2)
@@ -1167,7 +1188,7 @@
done
fi
-# Create an access key and secret key for nova ec2 register image
+# Create an access key and secret key for Nova EC2 register image
if is_service_enabled keystone && is_service_enabled swift3 && is_service_enabled nova; then
eval $(openstack ec2 credentials create --user nova --project $SERVICE_TENANT_NAME -f shell -c access -c secret)
iniset $NOVA_CONF DEFAULT s3_access_key "$access"
@@ -1193,6 +1214,9 @@
elif is_service_enabled $DATABASE_BACKENDS && is_service_enabled n-net; then
NM_CONF=${NOVA_CONF}
if is_service_enabled n-cell; then
+ # Create a small network in the API cell
+ $NOVA_BIN_DIR/nova-manage --config-file $NM_CONF network create "$PRIVATE_NETWORK_NAME" $FIXED_RANGE 1 $FIXED_NETWORK_SIZE $NETWORK_CREATE_ARGS
+ # Everything else should go in the child cell
NM_CONF=${NOVA_CELLS_CONF}
fi
@@ -1230,7 +1254,7 @@
start_ceilometer
fi
-# Configure and launch heat engine, api and metadata
+# Configure and launch Heat engine, api and metadata
if is_service_enabled heat; then
# Initialize heat
echo_summary "Configuring Heat"
@@ -1275,30 +1299,34 @@
done
-# Local Configuration
-# ===================
+# Wrapup configuration
+# ====================
-# Apply configuration from local.conf if it exists for layer 2 services
+# local.conf extra
+# ----------------
+
+# Apply configuration from ``local.conf`` if it exists for layer 2 services
# Phase: extra
merge_config_group $TOP_DIR/local.conf extra
# Run extras
-# ==========
+# ----------
# Phase: extra
run_phase stack extra
-# Local Configuration
-# ===================
-# Apply configuration from local.conf if it exists for layer 2 services
+# local.conf post-extra
+# ---------------------
+
+# Apply late configuration from ``local.conf`` if it exists for layer 2 services
# Phase: post-extra
merge_config_group $TOP_DIR/local.conf post-extra
# Run local script
-# ================
+# ----------------
# Run ``local.sh`` if it exists to perform user-managed tasks
if [[ -x $TOP_DIR/local.sh ]]; then
@@ -1326,6 +1354,7 @@
fi
fi
+
# Fin
# ===
@@ -1342,11 +1371,12 @@
# Using the cloud
-# ---------------
+# ===============
echo ""
echo ""
echo ""
+echo "This is your host ip: $HOST_IP"
# If you installed Horizon on this server you should be able
# to access the site using your browser.
@@ -1356,15 +1386,11 @@
# If Keystone is present you can point ``nova`` cli to this server
if is_service_enabled keystone; then
- echo "Keystone is serving at $KEYSTONE_SERVICE_URI/v2.0/"
- echo "Examples on using novaclient command line is in exercise.sh"
+ echo "Keystone is serving at $KEYSTONE_SERVICE_URI/"
echo "The default users are: admin and demo"
echo "The password: $ADMIN_PASSWORD"
fi
-# Echo ``HOST_IP`` - useful for ``build_uec.sh``, which uses dhcp to give the instance an address
-echo "This is your host ip: $HOST_IP"
-
# Warn that a deprecated feature was used
if [[ -n "$DEPRECATED_TEXT" ]]; then
echo_summary "WARNING: $DEPRECATED_TEXT"
diff --git a/stackrc b/stackrc
index 02b12a3..abedb00 100644
--- a/stackrc
+++ b/stackrc
@@ -5,7 +5,7 @@
# Find the other rc files
RC_DIR=$(cd $(dirname "${BASH_SOURCE:-$0}") && pwd)
-# Source required devstack functions and globals
+# Source required DevStack functions and globals
source $RC_DIR/functions
# Destination path for installation
@@ -41,21 +41,23 @@
# enable_service q-dhcp
# enable_service q-l3
# enable_service q-meta
-# # Optional, to enable tempest configuration as part of devstack
+# # Optional, to enable tempest configuration as part of DevStack
# enable_service tempest
-# this allows us to pass ENABLED_SERVICES
+# This allows us to pass ``ENABLED_SERVICES``
if ! isset ENABLED_SERVICES ; then
- # core compute (glance / keystone / nova (+ nova-network))
- ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-net,n-cond,n-sch,n-novnc,n-xvnc,n-cauth
- # cinder
+ # Keystone - nothing works without keystone
+ ENABLED_SERVICES=key
+ # Nova - services to support libvirt based openstack clouds
+ ENABLED_SERVICES+=,n-api,n-cpu,n-net,n-cond,n-sch,n-novnc
+ # Glance services needed for Nova
+ ENABLED_SERVICES+=,g-api,g-reg
+ # Cinder
ENABLED_SERVICES+=,c-sch,c-api,c-vol
- # heat
- ENABLED_SERVICES+=,h-eng,h-api,h-api-cfn,h-api-cw
- # dashboard
+ # Dashboard
ENABLED_SERVICES+=,horizon
- # additional services
- ENABLED_SERVICES+=,rabbit,tempest,mysql
+ # Additional services
+ ENABLED_SERVICES+=,rabbit,tempest,mysql,dstat
fi
# SQLAlchemy supports multiple database drivers for each database server
@@ -79,7 +81,7 @@
# Tell Tempest which services are available. The default is set here as
# Tempest falls late in the configuration sequence. This differs from
# ``ENABLED_SERVICES`` in that the project names are used here rather than
-# the service names, i.e.: TEMPEST_SERVICES="key,glance,nova"
+# the service names, i.e.: ``TEMPEST_SERVICES="key,glance,nova"``
TEMPEST_SERVICES=""
# Set the default Nova APIs to enable
@@ -104,6 +106,16 @@
source $RC_DIR/.localrc.auto
fi
+# Enable use of Python virtual environments. Individual project use of
+# venvs are controlled by the PROJECT_VENV array; every project with
+# an entry in the array will be installed into the named venv.
+# By default this will put each project into its own venv.
+USE_VENV=$(trueorfalse False USE_VENV)
+
+# Add packages that need to be installed into a venv but are not in any
+# requirmenets files here, in a comma-separated list
+ADDITIONAL_VENV_PACKAGES=${ADITIONAL_VENV_PACKAGES:-""}
+
# Configure wheel cache location
export WHEELHOUSE=${WHEELHOUSE:-$DEST/.wheelhouse}
export PIP_WHEEL_DIR=${PIP_WHEEL_DIR:-$WHEELHOUSE}
@@ -135,6 +147,7 @@
# but pass through any extras)
REQUIREMENTS_MODE=${REQUIREMENTS_MODE:-strict}
+
# Repositories
# ------------
@@ -145,16 +158,17 @@
# Which libraries should we install from git instead of using released
# versions on pypi?
#
-# By default devstack is now installing libraries from pypi instead of
+# By default DevStack is now installing libraries from pypi instead of
# from git repositories by default. This works great if you are
# developing server components, but if you want to develop libraries
-# and see them live in devstack you need to tell devstack it should
+# and see them live in DevStack you need to tell DevStack it should
# install them from git.
#
# ex: LIBS_FROM_GIT=python-keystoneclient,oslo.config
#
# Will install those 2 libraries from git, the rest from pypi.
+
##############
#
# OpenStack Server Components
@@ -221,6 +235,7 @@
TROVE_REPO=${TROVE_REPO:-${GIT_BASE}/openstack/trove.git}
TROVE_BRANCH=${TROVE_BRANCH:-master}
+
##############
#
# Testing Components
@@ -296,6 +311,7 @@
# this doesn't exist in a lib file, so set it here
GITDIR["python-openstackclient"]=$DEST/python-openstackclient
+
###################
#
# Oslo Libraries
@@ -386,6 +402,7 @@
GITREPO["pbr"]=${PBR_REPO:-${GIT_BASE}/openstack-dev/pbr.git}
GITBRANCH["pbr"]=${PBR_BRANCH:-master}
+
##################
#
# Libraries managed by OpenStack programs (non oslo)
@@ -427,6 +444,10 @@
#
##################
+# run-parts script required by os-refresh-config
+DIB_UTILS_REPO=${DIB_UTILS_REPO:-${GIT_BASE}/openstack/dib-utils.git}
+DIB_UTILS_BRANCH=${DIB_UTILS_BRANCH:-master}
+
# os-apply-config configuration template tool
OAC_REPO=${OAC_REPO:-${GIT_BASE}/openstack/os-apply-config.git}
OAC_BRANCH=${OAC_BRANCH:-master}
@@ -439,6 +460,7 @@
ORC_REPO=${ORC_REPO:-${GIT_BASE}/openstack/os-refresh-config.git}
ORC_BRANCH=${ORC_BRANCH:-master}
+
#################
#
# 3rd Party Components (non pip installable)
@@ -460,7 +482,6 @@
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
# also install an **LXC**, **OpenVZ** or **XenAPI** based system. If xenserver-core
@@ -556,18 +577,6 @@
IMAGE_URLS=${IMAGE_URLS:-"http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-${CIRROS_ARCH}-uec.tar.gz"};;
esac
-# Use 64bit fedora image if heat is enabled
-if [[ "$ENABLED_SERVICES" =~ 'h-api' ]]; then
- case "$VIRT_DRIVER" in
- libvirt|ironic)
- HEAT_CFN_IMAGE_URL=${HEAT_CFN_IMAGE_URL:-"https://download.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"}
- IMAGE_URLS+=",$HEAT_CFN_IMAGE_URL"
- ;;
- *)
- ;;
- esac
-fi
-
# Trove needs a custom image for its work
if [[ "$ENABLED_SERVICES" =~ 'tr-api' ]]; then
case "$VIRT_DRIVER" in
@@ -580,17 +589,6 @@
esac
fi
-# Staging Area for New Images, have them here for at least 24hrs for nodepool
-# to cache them otherwise the failure rates in the gate are too high
-PRECACHE_IMAGES=$(trueorfalse False PRECACHE_IMAGES)
-if [[ "$PRECACHE_IMAGES" == "True" ]]; then
- # staging in update for nodepool
- IMAGE_URL="https://download.fedoraproject.org/pub/alt/openstack/20/x86_64/Fedora-x86_64-20-20140618-sda.qcow2"
- if ! [[ "$IMAGE_URLS" =~ "$IMAGE_URL" ]]; then
- IMAGE_URLS+=",$IMAGE_URL"
- fi
-fi
-
# 10Gb default volume backing file size
VOLUME_BACKING_FILE_SIZE=${VOLUME_BACKING_FILE_SIZE:-10250M}
@@ -611,9 +609,6 @@
# Set default screen name
SCREEN_NAME=${SCREEN_NAME:-stack}
-# Do not install packages tagged with 'testonly' by default
-INSTALL_TESTONLY_PACKAGES=${INSTALL_TESTONLY_PACKAGES:-False}
-
# Undo requirements changes by global requirements
UNDO_REQUIREMENTS=${UNDO_REQUIREMENTS:-True}
@@ -653,7 +648,7 @@
# Set fixed and floating range here so we can make sure not to use addresses
# from either range when attempting to guess the IP to use for the host.
-# Note that setting FIXED_RANGE may be necessary when running DevStack
+# Note that setting ``FIXED_RANGE`` may be necessary when running DevStack
# in an OpenStack cloud that uses either of these address ranges internally.
FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.0/24}
FIXED_RANGE=${FIXED_RANGE:-10.0.0.0/24}
@@ -681,9 +676,10 @@
# Set to 0 to disable shallow cloning
GIT_DEPTH=${GIT_DEPTH:-0}
-# Use native SSL for servers in SSL_ENABLED_SERVICES
+# Use native SSL for servers in ``SSL_ENABLED_SERVICES``
USE_SSL=$(trueorfalse False USE_SSL)
+
# Following entries need to be last items in file
# Compatibility bits required by other callers like Grenade
@@ -705,7 +701,6 @@
# For compat, if SCREEN_LOGDIR is set, it will be used to create back-compat symlinks to the LOGDIR
# symlinks to SCREEN_LOGDIR (compat)
-
# Set up new logging defaults
if [[ -z "${LOGDIR:-}" ]]; then
default_logdir=$DEST/logs
@@ -730,8 +725,8 @@
unset default_logdir logfile
fi
-# LOGDIR is always set at this point so it is not useful as a 'enable' for service logs
-# SCREEN_LOGDIR may be set, it is useful to enable the compat symlinks
+# ``LOGDIR`` is always set at this point so it is not useful as a 'enable' for service logs
+# ``SCREEN_LOGDIR`` may be set, it is useful to enable the compat symlinks
# Local variables:
# mode: shell-script
diff --git a/tests/functions.sh b/tests/functions.sh
index 874d022..126080f 100755
--- a/tests/functions.sh
+++ b/tests/functions.sh
@@ -196,3 +196,20 @@
echo "is_package_installed() on deleted package failed"
fi
fi
+
+# test isset function
+echo "Testing isset()"
+you_should_not_have_this_variable=42
+
+if isset "you_should_not_have_this_variable"; then
+ echo "OK"
+else
+ echo "\"you_should_not_have_this_variable\" not declared. failed"
+fi
+
+unset you_should_not_have_this_variable
+if isset "you_should_not_have_this_variable"; then
+ echo "\"you_should_not_have_this_variable\" looks like declared variable. failed"
+else
+ echo "OK"
+fi
diff --git a/tools/build_docs.sh b/tools/build_docs.sh
index 2aa0a0a..fda86c0 100755
--- a/tools/build_docs.sh
+++ b/tools/build_docs.sh
@@ -2,8 +2,8 @@
# **build_docs.sh** - Build the docs for DevStack
#
-# - Install shocco if not found on PATH and INSTALL_SHOCCO is set
-# - Clone MASTER_REPO branch MASTER_BRANCH
+# - Install shocco if not found on ``PATH`` and ``INSTALL_SHOCCO`` is set
+# - Clone ``MASTER_REPO`` branch ``MASTER_BRANCH``
# - Re-creates ``doc/build/html`` directory from existing repo + new generated script docs
# Usage:
@@ -16,7 +16,7 @@
HTML_BUILD=doc/build/html
-# Keep track of the devstack directory
+# Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
# Uses this shocco branch: https://github.com/dtroyer/shocco/tree/rst_support
diff --git a/tools/build_venv.sh b/tools/build_venv.sh
index 11d1d35..cfa39a8 100755
--- a/tools/build_venv.sh
+++ b/tools/build_venv.sh
@@ -4,11 +4,12 @@
#
# build_venv.sh venv-path [package [...]]
#
+# Installs basic common prereq packages that require compilation
+# to allow quick copying of resulting venv as a baseline
+#
# Assumes:
# - a useful pip is installed
# - virtualenv will be installed by pip
-# - installs basic common prereq packages that require compilation
-# to allow quick copying of resulting venv as a baseline
VENV_DEST=${1:-.venv}
@@ -16,14 +17,14 @@
MORE_PACKAGES="$@"
-# If TOP_DIR is set we're being sourced rather than running stand-alone
+# If ``TOP_DIR`` is set we're being sourced rather than running stand-alone
# or in a sub-shell
if [[ -z "$TOP_DIR" ]]; then
set -o errexit
set -o nounset
- # Keep track of the devstack directory
+ # Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
FILES=$TOP_DIR/files
diff --git a/tools/build_wheels.sh b/tools/build_wheels.sh
index f1740df..c57568f 100755
--- a/tools/build_wheels.sh
+++ b/tools/build_wheels.sh
@@ -4,21 +4,22 @@
#
# build_wheels.sh [package [...]]
#
-# System package prerequisites listed in files/*/devlibs will be installed
+# System package prerequisites listed in ``files/*/devlibs`` will be installed
#
# Builds wheels for all virtual env requirements listed in
# ``venv-requirements.txt`` plus any supplied on the command line.
#
-# Assumes ``tools/install_pip.sh`` has been run and a suitable pip/setuptools is available.
+# Assumes:
+# - ``tools/install_pip.sh`` has been run and a suitable ``pip/setuptools`` is available.
-# If TOP_DIR is set we're being sourced rather than running stand-alone
+# If ``TOP_DIR`` is set we're being sourced rather than running stand-alone
# or in a sub-shell
if [[ -z "$TOP_DIR" ]]; then
set -o errexit
set -o nounset
- # Keep track of the devstack directory
+ # Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
FILES=$TOP_DIR/files
@@ -59,7 +60,7 @@
# Install modern pip and wheel
PIP_VIRTUAL_ENV=$TMP_VENV_PATH pip_install -U pip wheel
-# VENV_PACKAGES is a list of packages we want to pre-install
+# ``VENV_PACKAGES`` is a list of packages we want to pre-install
VENV_PACKAGE_FILE=$FILES/venv-requirements.txt
if [[ -r $VENV_PACKAGE_FILE ]]; then
VENV_PACKAGES=$(grep -v '^#' $VENV_PACKAGE_FILE)
diff --git a/tools/cpu_map_update.py b/tools/cpu_map_update.py
new file mode 100755
index 0000000..1938793
--- /dev/null
+++ b/tools/cpu_map_update.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# This small script updates the libvirt CPU map to add a gate64 cpu model
+# that can be used to enable a common 64bit capable feature set across
+# devstack nodes so that features like nova live migration work.
+
+import sys
+import xml.etree.ElementTree as ET
+from xml.dom import minidom
+
+
+def update_cpu_map(tree):
+ root = tree.getroot()
+ cpus = root#.find("cpus")
+ x86 = None
+ for arch in cpus.findall("arch"):
+ if arch.get("name") == "x86":
+ x86 = arch
+ break
+ if x86 is not None:
+ # Create a gate64 cpu model that is core2duo less monitor and pse36
+ gate64 = ET.SubElement(x86, "model")
+ gate64.set("name", "gate64")
+ ET.SubElement(gate64, "vendor").set("name", "Intel")
+ ET.SubElement(gate64, "feature").set("name", "fpu")
+ ET.SubElement(gate64, "feature").set("name", "de")
+ ET.SubElement(gate64, "feature").set("name", "pse")
+ ET.SubElement(gate64, "feature").set("name", "tsc")
+ ET.SubElement(gate64, "feature").set("name", "msr")
+ ET.SubElement(gate64, "feature").set("name", "pae")
+ ET.SubElement(gate64, "feature").set("name", "mce")
+ ET.SubElement(gate64, "feature").set("name", "cx8")
+ ET.SubElement(gate64, "feature").set("name", "apic")
+ ET.SubElement(gate64, "feature").set("name", "sep")
+ ET.SubElement(gate64, "feature").set("name", "pge")
+ ET.SubElement(gate64, "feature").set("name", "cmov")
+ ET.SubElement(gate64, "feature").set("name", "pat")
+ ET.SubElement(gate64, "feature").set("name", "mmx")
+ ET.SubElement(gate64, "feature").set("name", "fxsr")
+ ET.SubElement(gate64, "feature").set("name", "sse")
+ ET.SubElement(gate64, "feature").set("name", "sse2")
+ ET.SubElement(gate64, "feature").set("name", "vme")
+ ET.SubElement(gate64, "feature").set("name", "mtrr")
+ ET.SubElement(gate64, "feature").set("name", "mca")
+ ET.SubElement(gate64, "feature").set("name", "clflush")
+ ET.SubElement(gate64, "feature").set("name", "pni")
+ ET.SubElement(gate64, "feature").set("name", "nx")
+ ET.SubElement(gate64, "feature").set("name", "ssse3")
+ ET.SubElement(gate64, "feature").set("name", "syscall")
+ ET.SubElement(gate64, "feature").set("name", "lm")
+
+
+def format_xml(root):
+ # Adapted from http://pymotw.com/2/xml/etree/ElementTree/create.html
+ # thank you dhellmann
+ rough_string = ET.tostring(root, encoding="UTF-8")
+ dom_parsed = minidom.parseString(rough_string)
+ return dom_parsed.toprettyxml(" ", encoding="UTF-8")
+
+
+def main():
+ if len(sys.argv) != 2:
+ raise Exception("Must pass path to cpu_map.xml to update")
+ cpu_map = sys.argv[1]
+ tree = ET.parse(cpu_map)
+ for model in tree.getroot().iter("model"):
+ if model.get("name") == "gate64":
+ # gate64 model is already present
+ return
+ update_cpu_map(tree)
+ pretty_xml = format_xml(tree.getroot())
+ with open(cpu_map, 'w') as f:
+ f.write(pretty_xml)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/create-stack-user.sh b/tools/create-stack-user.sh
index 9c29ecd..b49164b 100755
--- a/tools/create-stack-user.sh
+++ b/tools/create-stack-user.sh
@@ -17,7 +17,7 @@
set -o errexit
-# Keep track of the devstack directory
+# Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
# Import common functions
diff --git a/tools/fixup_stuff.sh b/tools/fixup_stuff.sh
index f8edd16..2efb4e0 100755
--- a/tools/fixup_stuff.sh
+++ b/tools/fixup_stuff.sh
@@ -17,7 +17,7 @@
# - uninstall firewalld (f20 only)
-# If TOP_DIR is set we're being sourced rather than running stand-alone
+# If ``TOP_DIR`` is set we're being sourced rather than running stand-alone
# or in a sub-shell
if [[ -z "$TOP_DIR" ]]; then
set -o errexit
@@ -27,7 +27,7 @@
TOOLS_DIR=$(cd $(dirname "$0") && pwd)
TOP_DIR=$(cd $TOOLS_DIR/..; pwd)
- # Change dir to top of devstack
+ # Change dir to top of DevStack
cd $TOP_DIR
# Import common functions
@@ -38,7 +38,7 @@
# Keystone Port Reservation
# -------------------------
-# Reserve and prevent $KEYSTONE_AUTH_PORT and $KEYSTONE_AUTH_PORT_INT from
+# Reserve and prevent ``KEYSTONE_AUTH_PORT`` and ``KEYSTONE_AUTH_PORT_INT`` from
# being used as ephemeral ports by the system. The default(s) are 35357 and
# 35358 which are in the Linux defined ephemeral port range (in disagreement
# with the IANA ephemeral port range). This is a workaround for bug #1253482
@@ -47,9 +47,9 @@
# exception into the Kernel for the Keystone AUTH ports.
keystone_ports=${KEYSTONE_AUTH_PORT:-35357},${KEYSTONE_AUTH_PORT_INT:-35358}
-# only do the reserved ports when available, on some system (like containers)
+# Only do the reserved ports when available, on some system (like containers)
# where it's not exposed we are almost pretty sure these ports would be
-# exclusive for our devstack.
+# exclusive for our DevStack.
if sysctl net.ipv4.ip_local_reserved_ports >/dev/null 2>&1; then
# Get any currently reserved ports, strip off leading whitespace
reserved_ports=$(sysctl net.ipv4.ip_local_reserved_ports | awk -F'=' '{print $2;}' | sed 's/^ //')
@@ -59,7 +59,7 @@
sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports}
else
# If there are currently reserved ports, keep those and also reserve the
- # keystone specific ports. Duplicate reservations are merged into a single
+ # Keystone specific ports. Duplicate reservations are merged into a single
# reservation (or range) automatically by the kernel.
sudo sysctl -w net.ipv4.ip_local_reserved_ports=${keystone_ports},${reserved_ports}
fi
diff --git a/tools/image_list.sh b/tools/image_list.sh
index 88c1d09..2042807 100755
--- a/tools/image_list.sh
+++ b/tools/image_list.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-# Keep track of the devstack directory
+# Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
source $TOP_DIR/functions
diff --git a/tools/info.sh b/tools/info.sh
index a8f9544..433206e 100755
--- a/tools/info.sh
+++ b/tools/info.sh
@@ -2,7 +2,7 @@
# **info.sh**
-# Produce a report on the state of devstack installs
+# Produce a report on the state of DevStack installs
#
# Output fields are separated with '|' chars
# Output types are git,localrc,os,pip,pkg:
@@ -14,7 +14,7 @@
# pkg|<package>|<version>
function usage {
- echo "$0 - Report on the devstack configuration"
+ echo "$0 - Report on the DevStack configuration"
echo ""
echo "Usage: $0"
exit 1
diff --git a/tools/install_pip.sh b/tools/install_pip.sh
index b7b40c7..0f7c962 100755
--- a/tools/install_pip.sh
+++ b/tools/install_pip.sh
@@ -16,7 +16,7 @@
TOOLS_DIR=$(cd $(dirname "$0") && pwd)
TOP_DIR=`cd $TOOLS_DIR/..; pwd`
-# Change dir to top of devstack
+# Change dir to top of DevStack
cd $TOP_DIR
# Import common functions
@@ -42,11 +42,11 @@
function install_get_pip {
- # the openstack gate and others put a cached version of get-pip.py
+ # The OpenStack gate and others put a cached version of get-pip.py
# for this to find, explicitly to avoid download issues.
#
- # However, if devstack *did* download the file, we want to check
- # for updates; people can leave thier stacks around for a long
+ # However, if DevStack *did* download the file, we want to check
+ # for updates; people can leave their stacks around for a long
# time and in the mean-time pip might get upgraded.
#
# Thus we use curl's "-z" feature to always check the modified
@@ -74,7 +74,7 @@
touch $PIP_CONFIG_FILE
fi
if ! ini_has_option "$PIP_CONFIG_FILE" "global" "index-url"; then
- #it means that the index-url does not exist
+ # It means that the index-url does not exist
iniset "$PIP_CONFIG_FILE" "global" "index-url" "$PYPI_OVERRIDE"
fi
diff --git a/tools/install_prereqs.sh b/tools/install_prereqs.sh
index 917980c..a07e58d 100755
--- a/tools/install_prereqs.sh
+++ b/tools/install_prereqs.sh
@@ -18,10 +18,10 @@
esac
done
-# If TOP_DIR is set we're being sourced rather than running stand-alone
+# If ``TOP_DIR`` is set we're being sourced rather than running stand-alone
# or in a sub-shell
if [[ -z "$TOP_DIR" ]]; then
- # Keep track of the devstack directory
+ # Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
# Import common functions
@@ -65,7 +65,7 @@
PACKAGES="$PACKAGES $(get_plugin_packages)"
if is_ubuntu && echo $PACKAGES | grep -q dkms ; then
- # ensure headers for the running kernel are installed for any DKMS builds
+ # Ensure headers for the running kernel are installed for any DKMS builds
PACKAGES="$PACKAGES linux-headers-$(uname -r)"
fi
diff --git a/tools/ironic/scripts/create-node b/tools/ironic/scripts/create-node
index 25b53d4..b018acd 100755
--- a/tools/ironic/scripts/create-node
+++ b/tools/ironic/scripts/create-node
@@ -6,13 +6,13 @@
set -ex
-# Keep track of the devstack directory
+# Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
NAME=$1
CPU=$2
MEM=$(( 1024 * $3 ))
-# extra G to allow fuzz for partition table : flavor size and registered size
+# Extra G to allow fuzz for partition table : flavor size and registered size
# need to be different to actual size.
DISK=$(( $4 + 1))
diff --git a/tools/ironic/scripts/setup-network b/tools/ironic/scripts/setup-network
index e326bf8..83308ed 100755
--- a/tools/ironic/scripts/setup-network
+++ b/tools/ironic/scripts/setup-network
@@ -9,7 +9,7 @@
LIBVIRT_CONNECT_URI=${LIBVIRT_CONNECT_URI:-"qemu:///system"}
-# Keep track of the devstack directory
+# Keep track of the DevStack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
BRIDGE_SUFFIX=${1:-''}
BRIDGE_NAME=brbm$BRIDGE_SUFFIX
@@ -19,7 +19,7 @@
# Only add bridge if missing
(sudo ovs-vsctl list-br | grep ${BRIDGE_NAME}$) || sudo ovs-vsctl add-br ${BRIDGE_NAME}
-# remove bridge before replacing it.
+# Remove bridge before replacing it.
(virsh net-list | grep "${BRIDGE_NAME} ") && virsh net-destroy ${BRIDGE_NAME}
(virsh net-list --inactive | grep "${BRIDGE_NAME} ") && virsh net-undefine ${BRIDGE_NAME}
diff --git a/tools/outfilter.py b/tools/outfilter.py
index 9686a38..f82939b 100755
--- a/tools/outfilter.py
+++ b/tools/outfilter.py
@@ -14,8 +14,8 @@
# License for the specific language governing permissions and limitations
# under the License.
-# This is an output filter to filter and timestamp the logs from grenade and
-# devstack. Largely our awk filters got beyond the complexity level which were
+# This is an output filter to filter and timestamp the logs from Grenade and
+# DevStack. Largely our awk filters got beyond the complexity level which were
# sustainable, so this provides us much more control in a single place.
#
# The overhead of running python should be less than execing `date` a million
@@ -32,7 +32,7 @@
def get_options():
parser = argparse.ArgumentParser(
- description='Filter output by devstack and friends')
+ description='Filter output by DevStack and friends')
parser.add_argument('-o', '--outfile',
help='Output file for content',
default=None)
@@ -52,7 +52,7 @@
if opts.outfile:
outfile = open(opts.outfile, 'a', 0)
- # otherwise fileinput reprocess args as files
+ # Otherwise fileinput reprocess args as files
sys.argv = []
while True:
line = sys.stdin.readline()
@@ -63,9 +63,9 @@
if skip_line(line):
continue
- # this prevents us from nesting date lines, because
- # we'd like to pull this in directly in grenade and not double
- # up on devstack lines
+ # This prevents us from nesting date lines, because
+ # we'd like to pull this in directly in Grenade and not double
+ # up on DevStack lines
if HAS_DATE.search(line) is None:
now = datetime.datetime.utcnow()
line = ("%s | %s" % (
diff --git a/tools/worlddump.py b/tools/worlddump.py
index 9a62c0d..8dd455c 100755
--- a/tools/worlddump.py
+++ b/tools/worlddump.py
@@ -66,7 +66,7 @@
Process Listing
===============
"""
- psraw = os.popen("ps auxw").read()
+ psraw = os.popen("ps axo user,ppid,pid,pcpu,pmem,vsz,rss,tty,stat,start,time,args").read()
print psraw
diff --git a/tox.ini b/tox.ini
index bc84928..279dcd4 100644
--- a/tox.ini
+++ b/tox.ini
@@ -20,7 +20,7 @@
-name \*.sh -or \
-name \*rc -or \
-name functions\* -or \
- -wholename \*/inc/\* \ # /inc files and
+ -wholename \*/inc/\* -or \ # /inc files and
-wholename \*/lib/\* \ # /lib files are shell, but
\) \ # have no extension
-print0 | xargs -0 bashate -v"
diff --git a/unstack.sh b/unstack.sh
index a6aeec5..30981fd 100755
--- a/unstack.sh
+++ b/unstack.sh
@@ -19,7 +19,7 @@
esac
done
-# Keep track of the current devstack directory.
+# Keep track of the current DevStack directory.
TOP_DIR=$(cd $(dirname "$0") && pwd)
FILES=$TOP_DIR/files
@@ -45,6 +45,10 @@
# Configure Projects
# ==================
+# Plugin Phase 0: override_defaults - allow pluggins to override
+# defaults before other services are run
+run_phase override_defaults
+
# Import apache functions
source $TOP_DIR/lib/apache
@@ -63,7 +67,7 @@
source $TOP_DIR/lib/swift
source $TOP_DIR/lib/ceilometer
source $TOP_DIR/lib/heat
-source $TOP_DIR/lib/neutron
+source $TOP_DIR/lib/neutron-legacy
source $TOP_DIR/lib/ldap
source $TOP_DIR/lib/dstat
@@ -173,7 +177,9 @@
cleanup_trove
fi
-stop_dstat
+if is_service_enabled dstat; then
+ stop_dstat
+fi
# Clean up the remainder of the screen processes
SCREEN=$(which screen)