Merge "Add oslo.policy to lib/oslo and stackrc"
diff --git a/clean.sh b/clean.sh
index 50d414c..ad4525b 100755
--- a/clean.sh
+++ b/clean.sh
@@ -76,6 +76,8 @@
# ==========
# Phase: clean
+run_phase clean
+
if [[ -d $TOP_DIR/extras.d ]]; then
for i in $TOP_DIR/extras.d/*.sh; do
[[ -r $i ]] && source $i clean
@@ -119,6 +121,10 @@
sudo rm -rf $SCREEN_LOGDIR
fi
+# Clean up venvs
+DIRS_TO_CLEAN="$WHEELHOUSE ${PROJECT_VENV[@]}"
+rm -rf $DIRS_TO_CLEAN
+
# Clean up files
FILES_TO_CLEAN=".localrc.auto docs/files docs/html shocco/ stack-screenrc test*.conf* test.ini*"
diff --git a/files/debs/devlibs b/files/debs/devlibs
new file mode 100644
index 0000000..0446ceb
--- /dev/null
+++ b/files/debs/devlibs
@@ -0,0 +1,7 @@
+libffi-dev # pyOpenSSL
+libmysqlclient-dev # MySQL-python
+libpq-dev # psycopg2
+libssl-dev # pyOpenSSL
+libxml2-dev # lxml
+libxslt1-dev # lxml
+python-dev # pyOpenSSL
diff --git a/files/debs/general b/files/debs/general
index 4050191..5047c12 100644
--- a/files/debs/general
+++ b/files/debs/general
@@ -1,5 +1,4 @@
bridge-utils
-pylint
screen
unzip
wget
@@ -10,17 +9,12 @@
lsof # useful when debugging
openssh-server
openssl
-python-virtualenv
-python-unittest2
iputils-ping
wget
curl
tcpdump
-euca2ools # only for testing client
tar
-python-cmd2 # dist:precise
python-dev
-python-mock # testonly
python2.7
bc
libyaml-dev
diff --git a/files/debs/glance b/files/debs/glance
index 8db8145..9fda6a6 100644
--- a/files/debs/glance
+++ b/files/debs/glance
@@ -3,11 +3,4 @@
libssl-dev # testonly
libxml2-dev
libxslt1-dev # testonly
-python-eventlet
-python-routes
-python-greenlet
-python-sqlalchemy
-python-pastedeploy
-python-xattr
-python-iso8601
zlib1g-dev # testonly
diff --git a/files/debs/horizon b/files/debs/horizon
index f9b7d59..1f45b54 100644
--- a/files/debs/horizon
+++ b/files/debs/horizon
@@ -1,19 +1,3 @@
apache2 # NOPRIME
libapache2-mod-wsgi # NOPRIME
-python-beautifulsoup
-python-dateutil
-python-paste
-python-pastedeploy
-python-anyjson
-python-routes
-python-xattr
-python-sqlalchemy
-python-webob
-pylint
-python-eventlet
-python-nose
-python-mox
-python-coverage
-python-cherrypy3 # why?
-python-migrate
libpcre3-dev # pyScss
diff --git a/files/debs/keystone b/files/debs/keystone
index d316a42..70a5649 100644
--- a/files/debs/keystone
+++ b/files/debs/keystone
@@ -1,15 +1,7 @@
python-lxml
-python-pastescript
-python-pastedeploy
-python-paste
sqlite3
-python-pysqlite2
-python-sqlalchemy
python-mysqldb
python-mysql.connector
-python-webob
-python-greenlet
-python-routes
libldap2-dev
libsasl2-dev
libkrb5-dev
diff --git a/files/debs/n-api b/files/debs/n-api
index b4372d9..0928cd5 100644
--- a/files/debs/n-api
+++ b/files/debs/n-api
@@ -1,3 +1 @@
-python-dateutil
-msgpack-python
fping
diff --git a/files/debs/neutron b/files/debs/neutron
index 3f4b6d2..aa3d709 100644
--- a/files/debs/neutron
+++ b/files/debs/neutron
@@ -7,17 +7,8 @@
mysql-server #NOPRIME
sudo
postgresql-server-dev-all # testonly
-python-iso8601
-python-paste
-python-routes
-python-suds
-python-pastedeploy
-python-greenlet
-python-eventlet
-python-sqlalchemy
python-mysqldb
python-mysql.connector
-python-pyudev
python-qpid # NOPRIME
dnsmasq-base
dnsmasq-utils # for dhcp_release only available in dist:precise
diff --git a/files/debs/nova b/files/debs/nova
index 66f29c4..0c31385 100644
--- a/files/debs/nova
+++ b/files/debs/nova
@@ -8,7 +8,6 @@
mysql-server # NOPRIME
python-mysqldb
python-mysql.connector
-python-xattr # needed for glance which is needed for nova --- this shouldn't be here
python-lxml # needed for glance which is needed for nova --- this shouldn't be here
gawk
iptables
@@ -27,22 +26,8 @@
rabbitmq-server # NOPRIME
qpidd # NOPRIME
socat # used by ajaxterm
-python-mox
-python-paste
-python-migrate
-python-greenlet
python-libvirt # NOPRIME
python-libxml2
-python-routes
python-numpy # used by websockify for spice console
-python-pastedeploy
-python-eventlet
-python-cheetah
-python-tempita
-python-sqlalchemy
-python-suds
-python-lockfile
python-m2crypto
-python-feedparser
-python-iso8601
python-qpid # NOPRIME
diff --git a/files/debs/postgresql b/files/debs/postgresql
deleted file mode 100644
index bf19d39..0000000
--- a/files/debs/postgresql
+++ /dev/null
@@ -1 +0,0 @@
-python-psycopg2
diff --git a/files/debs/swift b/files/debs/swift
index fd51699..b32b439 100644
--- a/files/debs/swift
+++ b/files/debs/swift
@@ -1,14 +1,7 @@
curl
memcached
-python-configobj
-python-coverage
-python-eventlet
-python-greenlet
-python-netifaces
+# 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
python-nose
-python-pastedeploy
-python-simplejson
-python-webob
-python-xattr
sqlite3
xfsprogs
diff --git a/files/rpms-suse/devlibs b/files/rpms-suse/devlibs
new file mode 100644
index 0000000..c923825
--- /dev/null
+++ b/files/rpms-suse/devlibs
@@ -0,0 +1,6 @@
+libffi-devel # pyOpenSSL
+libopenssl-devel # pyOpenSSL
+libxml2-devel # lxml
+libxslt-devel # lxml
+postgresql-devel # psycopg2
+python-devel # pyOpenSSL
diff --git a/files/rpms-suse/postgresql b/files/rpms-suse/postgresql
deleted file mode 100644
index bf19d39..0000000
--- a/files/rpms-suse/postgresql
+++ /dev/null
@@ -1 +0,0 @@
-python-psycopg2
diff --git a/files/rpms/devlibs b/files/rpms/devlibs
new file mode 100644
index 0000000..42b7865
--- /dev/null
+++ b/files/rpms/devlibs
@@ -0,0 +1,8 @@
+libffi-devel # pyOpenSSL
+libxml2-devel # lxml
+libxslt-devel # lxml
+mariadb-devel # MySQL-python f20,f21,rhel7
+mysql-devel # MySQL-python rhel6
+openssl-devel # pyOpenSSL
+postgresql-devel # psycopg2
+python-devel # pyOpenSSL
diff --git a/files/rpms/postgresql b/files/rpms/postgresql
deleted file mode 100644
index bf19d39..0000000
--- a/files/rpms/postgresql
+++ /dev/null
@@ -1 +0,0 @@
-python-psycopg2
diff --git a/files/venv-requirements.txt b/files/venv-requirements.txt
new file mode 100644
index 0000000..3c50061
--- /dev/null
+++ b/files/venv-requirements.txt
@@ -0,0 +1,10 @@
+lxml
+MySQL-python
+netifaces
+numpy
+posix-ipc
+psycopg2
+pycrypto
+pyOpenSSL
+PyYAML
+xattr
diff --git a/inc/python b/inc/python
index d9451b4..dfc4d63 100644
--- a/inc/python
+++ b/inc/python
@@ -15,6 +15,13 @@
set +o xtrace
+# Global Config Variables
+
+# PROJECT_VENV contains the name of the virtual enviromnet for each
+# project. A null value installs to the system Python directories.
+declare -A PROJECT_VENV
+
+
# Python Functions
# ================
@@ -105,7 +112,6 @@
-r $test_req
fi
fi
- $xtrace
}
# get version of a package from global requirements file
diff --git a/lib/databases/mysql b/lib/databases/mysql
index c8ceec2..70073c4 100644
--- a/lib/databases/mysql
+++ b/lib/databases/mysql
@@ -151,6 +151,9 @@
else
exit_distro_not_supported "mysql installation"
fi
+
+ # Install Python client module
+ pip_install MySQL-python
}
function database_connection_url_mysql {
diff --git a/lib/databases/postgresql b/lib/databases/postgresql
index 317e0eb..e891a08 100644
--- a/lib/databases/postgresql
+++ b/lib/databases/postgresql
@@ -100,6 +100,9 @@
else
exit_distro_not_supported "postgresql installation"
fi
+
+ # Install Python client module
+ pip_install psycopg2
}
function database_connection_url_postgresql {
diff --git a/lib/lvm b/lib/lvm
index c183f09..39eed00 100644
--- a/lib/lvm
+++ b/lib/lvm
@@ -103,14 +103,17 @@
function init_lvm_volume_group {
local vg=$1
local size=$2
- # Start with a clean volume group
- _create_lvm_volume_group $vg $size
+ # Start the lvmetad and tgtd services
if is_fedora || is_suse; then
- # service is not started by default
+ # services is not started by default
+ start_service lvm2-lvmetad
start_service tgtd
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
diff --git a/lib/stack b/lib/stack
new file mode 100644
index 0000000..9a509d8
--- /dev/null
+++ b/lib/stack
@@ -0,0 +1,29 @@
+#!/bin/bash
+#
+# lib/stack
+#
+# 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.
+#
+# For clarity, all functions declared here that came from ``stack.sh``
+# shall be named with the prefix ``stack_``.
+
+
+# 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
+ rm -rf ${PROJECT_VENV[$service]}
+ source $TOP_DIR/tools/build_venv.sh ${PROJECT_VENV[$service]}
+ export PIP_VIRTUAL_ENV=${PROJECT_VENV[$service]:-}
+ fi
+ install_${service}
+ if [[ -n ${PROJECT_VENV[$service]:-} ]]; then
+ unset PIP_VIRTUAL_ENV
+ fi
+ fi
+}
diff --git a/lib/tempest b/lib/tempest
index d3b40aa..6177ffe 100644
--- a/lib/tempest
+++ b/lib/tempest
@@ -517,14 +517,23 @@
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
+ export PIP_VIRTUAL_ENV=${PROJECT_VENV["tempest"]}
+ setup_dev_lib "tempest-lib"
+ unset PIP_VIRTUAL_ENV
fi
}
# install_tempest() - Collect source and prepare
function install_tempest {
- install_tempest_lib
git_clone $TEMPEST_REPO $TEMPEST_DIR $TEMPEST_BRANCH
pip_install tox
+ pushd $TEMPEST_DIR
+ tox --notest -efull
+ PROJECT_VENV["tempest"]=${TEMPEST_DIR}/.tox/full
+ install_tempest_lib
+ popd
}
# init_tempest() - Initialize ec2 images
diff --git a/stack.sh b/stack.sh
index 753135b..f597f78 100755
--- a/stack.sh
+++ b/stack.sh
@@ -94,6 +94,9 @@
# Import config functions
source $TOP_DIR/lib/config
+# Import 'public' stack.sh functions
+source $TOP_DIR/lib/stack
+
# Determine what system we are running on. This provides ``os_VENDOR``,
# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME``
# and ``DISTRO``
@@ -671,6 +674,15 @@
source $TOP_DIR/tools/fixup_stuff.sh
+# Virtual Environment
+# -------------------
+
+# Pre-build some problematic wheels
+if [[ -n ${WHEELHOUSE:-} && ! -d ${WHEELHOUSE:-} ]]; then
+ source $TOP_DIR/tools/build_wheels.sh
+fi
+
+
# Extras Pre-install
# ------------------
@@ -727,13 +739,13 @@
if is_service_enabled keystone; then
if [ "$KEYSTONE_AUTH_HOST" == "$SERVICE_HOST" ]; then
- install_keystone
+ stack_install_service keystone
configure_keystone
fi
fi
if is_service_enabled s-proxy; then
- install_swift
+ stack_install_service swift
configure_swift
# swift3 middleware to provide S3 emulation to Swift
@@ -747,23 +759,23 @@
if is_service_enabled g-api n-api; then
# image catalog service
- install_glance
+ stack_install_service glance
configure_glance
fi
if is_service_enabled cinder; then
- install_cinder
+ stack_install_service cinder
configure_cinder
fi
if is_service_enabled neutron; then
- install_neutron
+ stack_install_service neutron
install_neutron_third_party
fi
if is_service_enabled nova; then
# compute service
- install_nova
+ stack_install_service nova
cleanup_nova
configure_nova
fi
@@ -772,19 +784,19 @@
# django openstack_auth
install_django_openstack_auth
# dashboard
- install_horizon
+ stack_install_service horizon
configure_horizon
fi
if is_service_enabled ceilometer; then
install_ceilometerclient
- install_ceilometer
+ stack_install_service ceilometer
echo_summary "Configuring Ceilometer"
configure_ceilometer
fi
if is_service_enabled heat; then
- install_heat
+ stack_install_service heat
install_heat_other
cleanup_heat
configure_heat
diff --git a/stackrc b/stackrc
index 96e6a70..83280cb 100644
--- a/stackrc
+++ b/stackrc
@@ -112,6 +112,11 @@
source $RC_DIR/.localrc.auto
fi
+# Configure wheel cache location
+export WHEELHOUSE=${WHEELHOUSE:-$DEST/.wheelhouse}
+export PIP_WHEEL_DIR=${PIP_WHEEL_DIR:-$WHEELHOUSE}
+export PIP_FIND_LINKS=${PIP_FIND_LINKS:-file://$WHEELHOUSE}
+
# This can be used to turn database query logging on and off
# (currently only implemented for MySQL backend)
DATABASE_QUERY_LOGGING=$(trueorfalse True DATABASE_QUERY_LOGGING)
diff --git a/tools/build_venv.sh b/tools/build_venv.sh
new file mode 100755
index 0000000..11d1d35
--- /dev/null
+++ b/tools/build_venv.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+#
+# **tools/build_venv.sh** - Build a Python Virtual Envirnment
+#
+# build_venv.sh venv-path [package [...]]
+#
+# 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}
+shift
+
+MORE_PACKAGES="$@"
+
+# 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
+ TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
+ FILES=$TOP_DIR/files
+
+ # Import common functions
+ source $TOP_DIR/functions
+
+ GetDistro
+
+ source $TOP_DIR/stackrc
+
+fi
+
+# Build new venv
+virtualenv $VENV_DEST
+
+# Install modern pip
+PIP_VIRTUAL_ENV=$VENV_DEST pip_install -U pip
+
+# Install additional packages
+PIP_VIRTUAL_ENV=$VENV_DEST pip_install ${MORE_PACKAGES}
diff --git a/tools/build_wheels.sh b/tools/build_wheels.sh
new file mode 100755
index 0000000..31398f9
--- /dev/null
+++ b/tools/build_wheels.sh
@@ -0,0 +1,73 @@
+#!/usr/bin/env bash
+#
+# **tools/build_wheels.sh** - Build a cache of Python wheels
+#
+# build_wheels.sh [package [...]]
+#
+# 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.
+
+# 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
+ TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
+ FILES=$TOP_DIR/files
+
+ # Import common functions
+ source $TOP_DIR/functions
+
+ GetDistro
+
+ source $TOP_DIR/stackrc
+
+ trap err_trap ERR
+
+fi
+
+# Get additional packages to build
+MORE_PACKAGES="$@"
+
+# Exit on any errors so that errors don't compound
+function err_trap {
+ local r=$?
+ set +o xtrace
+
+ rm -rf $TMP_VENV_PATH
+
+ exit $r
+}
+
+# Get system prereqs
+install_package $(get_packages devlibs)
+
+# Get a modern ``virtualenv``
+pip_install virtualenv
+
+# Prepare the workspace
+TMP_VENV_PATH=$(mktemp -d tmp-venv-XXXX)
+virtualenv $TMP_VENV_PATH
+
+# Install modern pip and wheel
+$TMP_VENV_PATH/bin/pip install -U pip wheel
+
+# 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)
+fi
+
+for pkg in ${VENV_PACKAGES,/ } ${MORE_PACKAGES}; do
+ $TMP_VENV_PATH/bin/pip wheel $pkg
+done
+
+# Clean up wheel workspace
+rm -rf $TMP_VENV_PATH