Merge "Fixed path for calling build_uec_ramdisk.sh from build_usb_boot.sh"
diff --git a/files/apts/quantum b/files/apts/quantum
index 39f4561..64fc1bf 100644
--- a/files/apts/quantum
+++ b/files/apts/quantum
@@ -1,6 +1,7 @@
ebtables
iptables
iputils-ping
+iputils-arping
mysql-server #NOPRIME
sudo
python-boto
diff --git a/files/keystone_data.sh b/files/keystone_data.sh
index 9520b17..3da11bf 100755
--- a/files/keystone_data.sh
+++ b/files/keystone_data.sh
@@ -2,18 +2,19 @@
#
# Initial data for Keystone using python-keystoneclient
#
-# Tenant User Roles
+# Tenant User Roles
# ------------------------------------------------------------------
-# admin admin admin
-# service glance admin
-# service nova admin, [ResellerAdmin (swift only)]
-# service quantum admin # if enabled
-# service swift admin # if enabled
-# service cinder admin # if enabled
-# service heat admin # if enabled
-# demo admin admin
-# demo demo Member, anotherrole
-# invisible_to_admin demo Member
+# admin admin admin
+# service glance admin
+# service nova admin, [ResellerAdmin (swift only)]
+# service quantum admin # if enabled
+# service swift admin # if enabled
+# service cinder admin # if enabled
+# service heat admin # if enabled
+# service ceilometer admin # if enabled
+# demo admin admin
+# demo demo Member, anotherrole
+# invisible_to_admin demo Member
# Tempest Only:
# alt_demo alt_demo Member
#
@@ -262,7 +263,14 @@
fi
fi
-if [[ "$ENABLED_SERVICES" =~ "ceilometer-api" ]]; then
+if [[ "$ENABLED_SERVICES" =~ "ceilometer" ]]; then
+ CEILOMETER_USER=$(get_id keystone user-create --name=ceilometer \
+ --pass="$SERVICE_PASSWORD" \
+ --tenant_id $SERVICE_TENANT \
+ --email=ceilometer@example.com)
+ keystone user-role-add --tenant_id $SERVICE_TENANT \
+ --user_id $CEILOMETER_USER \
+ --role_id $ADMIN_ROLE
if [[ "$KEYSTONE_CATALOG_BACKEND" = 'sql' ]]; then
CEILOMETER_SERVICE=$(get_id keystone service-create \
--name=ceilometer \
@@ -345,4 +353,3 @@
--internalurl "http://$SERVICE_HOST:8776/v1/\$(tenant_id)s"
fi
fi
-
diff --git a/functions b/functions
index 0da8299..c7f65db 100644
--- a/functions
+++ b/functions
@@ -7,6 +7,7 @@
# ``GLANCE_HOSTPORT``
# ``OFFLINE``
# ``PIP_DOWNLOAD_CACHE``
+# ``PIP_USE_MIRRORS``
# ``RECLONE``
# ``TRACK_DEPENDS``
# ``http_proxy``, ``https_proxy``, ``no_proxy``
@@ -578,7 +579,8 @@
# Wrapper for ``pip install`` to set cache and proxy environment variables
-# Uses globals ``OFFLINE``, ``PIP_DOWNLOAD_CACHE``, ``TRACK_DEPENDES``, ``*_proxy`
+# Uses globals ``OFFLINE``, ``PIP_DOWNLOAD_CACHE``, ``PIP_USE_MIRRORS``,
+# ``TRACK_DEPENDS``, ``*_proxy`
# pip_install package [package ...]
function pip_install {
[[ "$OFFLINE" = "True" || -z "$@" ]] && return
@@ -597,11 +599,14 @@
CMD_PIP=/usr/bin/pip-python
fi
fi
+ if [[ "$PIP_USE_MIRRORS" != "False" ]]; then
+ PIP_MIRROR_OPT="--use-mirrors"
+ fi
$SUDO_PIP PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE:-/var/cache/pip} \
HTTP_PROXY=$http_proxy \
HTTPS_PROXY=$https_proxy \
NO_PROXY=$no_proxy \
- $CMD_PIP install --use-mirrors $@
+ $CMD_PIP install $PIP_MIRROR_OPT $@
}
@@ -894,7 +899,7 @@
local FLOATING_IP=$3
local DEFAULT_INSTANCE_USER=$4
local ACTIVE_TIMEOUT=$5
- local probe_cmd = ""
+ local probe_cmd=""
if ! timeout $ACTIVE_TIMEOUT sh -c "while ! ssh -o StrictHostKeyChecking=no -i $KEY_FILE ${DEFAULT_INSTANCE_USER}@$FLOATING_IP echo success ; do sleep 1; done"; then
echo "server didn't become ssh-able!"
exit 1
diff --git a/lib/ceilometer b/lib/ceilometer
index b0f0377..2b014b0 100644
--- a/lib/ceilometer
+++ b/lib/ceilometer
@@ -6,8 +6,9 @@
# Dependencies:
# - functions
-# - OS_USERNAME, OS_PASSWORD, OS_TENANT_NAME, OS_AUTH_URL set for admin credentials
+# - OS_AUTH_URL for auth in api
# - DEST set to the destination directory
+# - SERVICE_PASSWORD, SERVICE_TENANT_NAME for auth in api
# stack.sh
# ---------
@@ -61,7 +62,15 @@
iniset $CEILOMETER_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
iniset $CEILOMETER_CONF DEFAULT sql_connection $BASE_SQL_CONN/nova?charset=utf8
+ # Install the policy file for the API server
+ cp $CEILOMETER_DIR/etc/ceilometer/policy.json $CEILOMETER_CONF_DIR
+ iniset $CEILOMETER_CONF DEFAULT policy_file $CEILOMETER_CONF_DIR/policy.json
+
iniset $CEILOMETER_CONF keystone_authtoken auth_protocol http
+ iniset $CEILOMETER_CONF keystone_authtoken admin_user ceilometer
+ iniset $CEILOMETER_CONF keystone_authtoken admin_password $SERVICE_PASSWORD
+ iniset $CEILOMETER_CONF keystone_authtoken admin_tenant_name $SERVICE_TENANT_NAME
+
cleanup_ceilometer
}
@@ -73,7 +82,7 @@
# start_ceilometer() - Start running processes, including screen
function start_ceilometer() {
screen_it ceilometer-acompute "cd $CEILOMETER_DIR && sg libvirtd \"$CEILOMETER_BIN_DIR/ceilometer-agent-compute --config-file $CEILOMETER_CONF\""
- screen_it ceilometer-acentral "export OS_USERNAME=$OS_USERNAME OS_PASSWORD=$OS_PASSWORD OS_TENANT_NAME=$OS_TENANT_NAME OS_AUTH_URL=$OS_AUTH_URL && cd $CEILOMETER_DIR && $CEILOMETER_BIN_DIR/ceilometer-agent-central --config-file $CEILOMETER_CONF"
+ screen_it ceilometer-acentral "export OS_USERNAME=ceilometer OS_PASSWORD=$SERVICE_PASSWORD OS_TENANT_NAME=$SERVICE_TENANT_NAME OS_AUTH_URL=$OS_AUTH_URL && cd $CEILOMETER_DIR && $CEILOMETER_BIN_DIR/ceilometer-agent-central --config-file $CEILOMETER_CONF"
screen_it ceilometer-collector "cd $CEILOMETER_DIR && $CEILOMETER_BIN_DIR/ceilometer-collector --config-file $CEILOMETER_CONF"
screen_it ceilometer-api "cd $CEILOMETER_DIR && $CEILOMETER_BIN_DIR/ceilometer-api -d -v --log-dir=$CEILOMETER_API_LOG_DIR --config-file $CEILOMETER_CONF"
}
diff --git a/lib/cinder b/lib/cinder
index 81bfbfe..c2cf15b 100644
--- a/lib/cinder
+++ b/lib/cinder
@@ -125,6 +125,10 @@
iniset $CINDER_CONF DEFAULT osapi_volume_extension cinder.api.openstack.volume.contrib.standard_extensions
iniset $CINDER_CONF DEFAULT state_path $CINDER_STATE_PATH
+ if [ "$SYSLOG" != "False" ]; then
+ iniset $CINDER_CONF DEFAULT use_syslog True
+ fi
+
if is_service_enabled qpid ; then
iniset $CINDER_CONF DEFAULT rpc_backend cinder.openstack.common.rpc.impl_qpid
elif is_service_enabled zeromq; then
@@ -134,6 +138,10 @@
iniset $CINDER_CONF DEFAULT rabbit_password $RABBIT_PASSWORD
fi
+ if [[ "$CINDER_SECURE_DELETE" == "False" ]]; then
+ iniset $CINDER_CONF DEFAULT secure_delete False
+ fi
+
if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then
# Add color to logging output
iniset $CINDER_CONF DEFAULT logging_context_format_string "%(asctime)s %(color)s%(levelname)s %(name)s [[01;36m%(request_id)s [00;36m%(user_id)s %(project_id)s%(color)s] [01;35m%(instance)s%(color)s%(message)s[00m"
diff --git a/stack.sh b/stack.sh
index 1cd1e1a..04037e8 100755
--- a/stack.sh
+++ b/stack.sh
@@ -12,13 +12,12 @@
# developer install.
# To keep this script simple we assume you are running on a recent **Ubuntu**
-# (11.10 Oneiric or 12.04 Precise) or **Fedora** (F16 or F17) machine. It
+# (11.10 Oneiric or newer) or **Fedora** (F16 or newer) machine. It
# should work in a VM or physical server. Additionally we put the list of
# ``apt`` and ``rpm`` dependencies and other configuration files in this repo.
# Learn more and get the most recent version at http://devstack.org
-
# Keep track of the devstack directory
TOP_DIR=$(cd $(dirname "$0") && pwd)
@@ -33,6 +32,7 @@
# Import database library (must be loaded before stackrc which sources localrc)
source $TOP_DIR/lib/database
+
# Settings
# ========
@@ -107,9 +107,8 @@
fi
fi
-# Disallow qpid on oneiric
+# Qpid was introduced to Ubuntu in precise, disallow it on oneiric
if [ "${DISTRO}" = "oneiric" ] && is_service_enabled qpid ; then
- # Qpid was introduced in precise
echo "You must use Ubuntu Precise or newer for Qpid support."
exit 1
fi
@@ -356,6 +355,11 @@
# Ryu Applications
RYU_APPS=${RYU_APPS:-ryu.app.simple_isolation,ryu.app.rest}
+# Should cinder perform secure deletion of volumes?
+# Defaults to true, can be set to False to avoid this bug when testing:
+# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1023755
+CINDER_SECURE_DELETE=`trueorfalse True $CINDER_SECURE_DELETE`
+
# Name of the LVM volume group to use/create for iscsi volumes
VOLUME_GROUP=${VOLUME_GROUP:-stack-volumes}
VOLUME_NAME_PREFIX=${VOLUME_NAME_PREFIX:-volume-}
@@ -448,14 +452,16 @@
# fail.
#
# If you are running on a single node and don't need to access the VMs from
-# devices other than that node, you can set FLAT_INTERFACE=
-# This will stop nova from bridging any interfaces into FLAT_NETWORK_BRIDGE.
+# devices other than that node, you can set ``FLAT_INTERFACE=``
+# This will stop nova from bridging any interfaces into ``FLAT_NETWORK_BRIDGE``.
FLAT_INTERFACE=${FLAT_INTERFACE-$GUEST_INTERFACE_DEFAULT}
## FIXME(ja): should/can we check that FLAT_INTERFACE is sane?
-# Using Quantum networking:
-#
+
+# Quantum Networking
+# ------------------
+
# Make sure that quantum is enabled in ENABLED_SERVICES. If you want
# to run Quantum on this host, make sure that q-svc is also in
# ENABLED_SERVICES.
@@ -473,18 +479,20 @@
# With Quantum networking the NET_MAN variable is ignored.
-# Database configuration
+# Database Configuration
# ----------------------
+
# To select between database backends, add a line to localrc like:
#
# use_database postgresql
#
-# The available database backends are defined in the DATABASE_BACKENDS
+# The available database backends are defined in the ``DATABASE_BACKENDS``
# variable defined in stackrc. By default, MySQL is enabled as the database
# backend.
initialize_database_backends && echo "Using $DATABASE_TYPE database backend" || echo "No database enabled"
+
# RabbitMQ or Qpid
# --------------------------
@@ -536,7 +544,7 @@
S3_SERVICE_PORT=${S3_SERVICE_PORT:-8080}
fi
# We only ask for Swift Hash if we have enabled swift service.
- # SWIFT_HASH is a random unique string for a swift cluster that
+ # ``SWIFT_HASH`` is a random unique string for a swift cluster that
# can never change.
read_password SWIFT_HASH "ENTER A RANDOM SWIFT HASH."
fi
@@ -551,7 +559,7 @@
# The ``SERVICE_TOKEN`` is used to bootstrap the Keystone database. It is
# just a string and is not a 'real' Keystone token.
read_password SERVICE_TOKEN "ENTER A SERVICE_TOKEN TO USE FOR THE SERVICE ADMIN TOKEN."
-# Services authenticate to Identity with servicename/SERVICE_PASSWORD
+# Services authenticate to Identity with servicename/``SERVICE_PASSWORD``
read_password SERVICE_PASSWORD "ENTER A SERVICE_PASSWORD TO USE FOR THE SERVICE AUTHENTICATION."
# Horizon currently truncates usernames and passwords at 20 characters
read_password ADMIN_PASSWORD "ENTER A PASSWORD TO USE FOR HORIZON AND KEYSTONE (20 CHARS OR LESS)."
@@ -560,7 +568,6 @@
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service}
-
# Horizon
# -------
@@ -574,10 +581,9 @@
# ---------
# Draw a spinner so the user knows something is happening
-function spinner()
-{
+function spinner() {
local delay=0.75
- local spinstr='|/-\'
+ local spinstr='/-\|'
printf "..." >&3
while [ true ]; do
local temp=${spinstr#?}
@@ -632,6 +638,7 @@
SUMFILE=$LOGFILE.${CURRENT_LOG_TIME}.summary
# Redirect output according to config
+
# Copy stdout to fd 3
exec 3>&1
if [[ "$VERBOSE" == "True" ]]; then
@@ -762,7 +769,7 @@
if is_service_enabled q-agt; then
if is_quantum_ovs_base_plugin "$Q_PLUGIN"; then
# Install deps
- # FIXME add to files/apts/quantum, but don't install if not needed!
+ # FIXME add to ``files/apts/quantum``, but don't install if not needed!
if [[ "$os_PACKAGE" = "deb" ]]; then
kernel_version=`cat /proc/version | cut -d " " -f3`
install_package make fakeroot dkms openvswitch-switch openvswitch-datapath-dkms linux-headers-$kernel_version
@@ -805,6 +812,7 @@
echo_summary "Installing OpenStack project source"
+# Grab clients first
install_keystoneclient
install_glanceclient
install_novaclient
@@ -866,6 +874,7 @@
git_clone $RYU_REPO $RYU_DIR $RYU_BRANCH
fi
+
# Initialization
# ==============
@@ -967,10 +976,15 @@
# Configure database
# ------------------
+
if is_service_enabled $DATABASE_BACKENDS; then
configure_database
fi
+
+# Configure screen
+# ----------------
+
if [ -z "$SCREEN_HARDSTATUS" ]; then
SCREEN_HARDSTATUS='%{= .} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
fi
@@ -980,9 +994,11 @@
if [[ -e $SCREENRC ]]; then
echo -n > $SCREENRC
fi
+
# Create a new named screen to run processes in
screen -d -m -S $SCREEN_NAME -t shell -s /bin/bash
sleep 1
+
# Set a reasonable status bar
screen -r $SCREEN_NAME -X hardstatus alwayslastline "$SCREEN_HARDSTATUS"
@@ -1092,6 +1108,7 @@
# Ryu
# ---
+
# Ryu is not a part of OpenStack project. Please ignore following block if
# you are not interested in Ryu.
# launch ryu manager
@@ -1118,11 +1135,10 @@
# Quantum
# -------
+# Quantum Network Configuration
if is_service_enabled quantum; then
echo_summary "Configuring Quantum"
- #
- # Quantum Network Configuration
- #
+
# The following variables control the Quantum openvswitch and
# linuxbridge plugins' allocation of tenant networks and
# availability of provider networks. If these are not configured
@@ -1150,7 +1166,7 @@
# allocated. An external network switch must be configured to
# trunk these VLANs between hosts for multi-host connectivity.
#
- # Example: TENANT_VLAN_RANGE=1000:1999
+ # Example: ``TENANT_VLAN_RANGE=1000:1999``
TENANT_VLAN_RANGE=${TENANT_VLAN_RANGE:-}
# If using VLANs for tenant networks, or if using flat or VLAN
@@ -1159,7 +1175,7 @@
# openvswitch agent or LB_PHYSICAL_INTERFACE for the linuxbridge
# agent, as described below.
#
- # Example: PHYSICAL_NETWORK=default
+ # Example: ``PHYSICAL_NETWORK=default``
PHYSICAL_NETWORK=${PHYSICAL_NETWORK:-}
# With the openvswitch plugin, if using VLANs for tenant networks,
@@ -1169,7 +1185,7 @@
# physical interface must be manually added to the bridge as a
# port for external connectivity.
#
- # Example: OVS_PHYSICAL_BRIDGE=br-eth1
+ # Example: ``OVS_PHYSICAL_BRIDGE=br-eth1``
OVS_PHYSICAL_BRIDGE=${OVS_PHYSICAL_BRIDGE:-}
# With the linuxbridge plugin, if using VLANs for tenant networks,
@@ -1177,13 +1193,13 @@
# the name of the network interface to use for the physical
# network.
#
- # Example: LB_PHYSICAL_INTERFACE=eth1
+ # Example: ``LB_PHYSICAL_INTERFACE=eth1``
LB_PHYSICAL_INTERFACE=${LB_PHYSICAL_INTERFACE:-}
# With the openvswitch plugin, set to True in localrc to enable
- # provider GRE tunnels when ENABLE_TENANT_TUNNELS is False.
+ # provider GRE tunnels when ``ENABLE_TENANT_TUNNELS`` is False.
#
- # Example: OVS_ENABLE_TUNNELING=True
+ # Example: ``OVS_ENABLE_TUNNELING=True``
OVS_ENABLE_TUNNELING=${OVS_ENABLE_TUNNELING:-$ENABLE_TENANT_TUNNELS}
# Put config files in ``/etc/quantum`` for everyone to find
@@ -1271,7 +1287,7 @@
echo "WARNING - The openvswitch plugin is using local tenant networks, with no connectivity between hosts."
fi
- # Override OVS_VLAN_RANGES and OVS_BRIDGE_MAPPINGS in localrc
+ # Override ``OVS_VLAN_RANGES`` and ``OVS_BRIDGE_MAPPINGS`` in ``localrc``
# for more complex physical network configurations.
if [[ "$OVS_VLAN_RANGES" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then
OVS_VLAN_RANGES=$PHYSICAL_NETWORK
@@ -1294,7 +1310,7 @@
echo "WARNING - The linuxbridge plugin is using local tenant networks, with no connectivity between hosts."
fi
- # Override LB_VLAN_RANGES and LB_INTERFACE_MAPPINGS in localrc
+ # Override ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc``
# for more complex physical network configurations.
if [[ "$LB_VLAN_RANGES" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then
LB_VLAN_RANGES=$PHYSICAL_NETWORK
@@ -1334,7 +1350,7 @@
fi
# Setup physical network bridge mappings. Override
- # OVS_VLAN_RANGES and OVS_BRIDGE_MAPPINGS in localrc for more
+ # ``OVS_VLAN_RANGES`` and ``OVS_BRIDGE_MAPPINGS`` in ``localrc`` for more
# complex physical network configurations.
if [[ "$OVS_BRIDGE_MAPPINGS" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]] && [[ "$OVS_PHYSICAL_BRIDGE" != "" ]]; then
OVS_BRIDGE_MAPPINGS=$PHYSICAL_NETWORK:$OVS_PHYSICAL_BRIDGE
@@ -1348,7 +1364,7 @@
AGENT_BINARY="$QUANTUM_DIR/bin/quantum-openvswitch-agent"
elif [[ "$Q_PLUGIN" = "linuxbridge" ]]; then
# Setup physical network interface mappings. Override
- # LB_VLAN_RANGES and LB_INTERFACE_MAPPINGS in localrc for more
+ # ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc`` for more
# complex physical network configurations.
if [[ "$LB_INTERFACE_MAPPINGS" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]] && [[ "$LB_PHYSICAL_INTERFACE" != "" ]]; then
LB_INTERFACE_MAPPINGS=$PHYSICAL_NETWORK:$LB_PHYSICAL_INTERFACE
@@ -1449,6 +1465,7 @@
fi
fi
+
# Nova
# ----
@@ -1802,6 +1819,7 @@
fi
add_nova_opt "glance_api_servers=$GLANCE_HOSTPORT"
+
# XenServer
# ---------
@@ -1911,7 +1929,7 @@
fi
fi
-elif is_service_enabled $DATABASE_BACKENDS && is_service_enabled nova; then
+elif is_service_enabled $DATABASE_BACKENDS && is_service_enabled n-net; then
# Create a small network
$NOVA_BIN_DIR/nova-manage network create "$PRIVATE_NETWORK_NAME" $FIXED_RANGE 1 $FIXED_NETWORK_SIZE $NETWORK_CREATE_ARGS
diff --git a/tools/configure_tempest.sh b/tools/configure_tempest.sh
index 1e35036..070bc0b 100755
--- a/tools/configure_tempest.sh
+++ b/tools/configure_tempest.sh
@@ -47,6 +47,7 @@
fi
# Source params
+source $TOP_DIR/lib/database
source $TOP_DIR/openrc
# Where Openstack code lives
@@ -186,7 +187,7 @@
# TODO(jaypipes): Create the key file here... right now, no whitebox
# tests actually use a key.
COMPUTE_PATH_TO_PRIVATE_KEY=$TEMPEST_DIR/id_rsa
-COMPUTE_DB_URI=mysql://root:$MYSQL_PASSWORD@localhost/nova
+COMPUTE_DB_URI=$BASE_SQL_CONN/nova
# Image test configuration options...
IMAGE_HOST=${IMAGE_HOST:-127.0.0.1}
diff --git a/tools/get_uec_image.sh b/tools/get_uec_image.sh
index ca74a03..156fd43 100755
--- a/tools/get_uec_image.sh
+++ b/tools/get_uec_image.sh
@@ -5,7 +5,7 @@
# Download and prepare Ubuntu UEC images
CACHEDIR=${CACHEDIR:-/opt/stack/cache}
-ROOTSIZE=${ROOTSIZE:-2000}
+ROOTSIZE=${ROOTSIZE:-2000M}
# Keep track of the current directory
TOOLS_DIR=$(cd $(dirname "$0") && pwd)
@@ -24,7 +24,7 @@
echo "$0 [-r rootsize] release imagefile [kernel]"
echo ""
echo "-r size - root fs size (min 2000MB)"
- echo "release - Ubuntu release: jaunty - oneric"
+ echo "release - Ubuntu release: lucid - quantal"
echo "imagefile - output image file"
echo "kernel - output kernel"
exit 1
@@ -64,6 +64,8 @@
KERNEL=$3
case $DIST_NAME in
+ quantal) ;;
+ percise) ;;
oneiric) ;;
natty) ;;
maverick) ;;
@@ -90,7 +92,7 @@
# Get the UEC image
UEC_NAME=$DIST_NAME-server-cloudimg-amd64
-if [ ! -d $CACHEDIR ]; then
+if [ ! -d $CACHEDIR/$DIST_NAME ]; then
mkdir -p $CACHEDIR/$DIST_NAME
fi
if [ ! -e $CACHEDIR/$DIST_NAME/$UEC_NAME.tar.gz ]; then
diff --git a/tools/xen/install_os_domU.sh b/tools/xen/install_os_domU.sh
index 0bb6ac8..c78c6f2 100755
--- a/tools/xen/install_os_domU.sh
+++ b/tools/xen/install_os_domU.sh
@@ -57,8 +57,8 @@
fi
# get nova
-nova_zipball=$(echo $NOVA_REPO | sed "s:\.git$::;s:$:/zipball/$NOVA_BRANCH:g")
-wget $nova_zipball -O nova-zipball --no-check-certificate
+NOVA_ZIPBALL_URL=${NOVA_ZIPBALL_URL:-$(echo $NOVA_REPO | sed "s:\.git$::;s:$:/zipball/$NOVA_BRANCH:g")}
+wget $NOVA_ZIPBALL_URL -O nova-zipball --no-check-certificate
unzip -o nova-zipball -d ./nova
# install xapi plugins