Merge "Allow devstack plugins to specify prereq packages"
This commit is contained in:
commit
d9a7ae8056
@ -179,3 +179,24 @@ functions:
|
|||||||
- ``start_nova_hypervisor`` - start any external services
|
- ``start_nova_hypervisor`` - start any external services
|
||||||
- ``stop_nova_hypervisor`` - stop any external services
|
- ``stop_nova_hypervisor`` - stop any external services
|
||||||
- ``cleanup_nova_hypervisor`` - remove transient data and cache
|
- ``cleanup_nova_hypervisor`` - remove transient data and cache
|
||||||
|
|
||||||
|
System Packages
|
||||||
|
===============
|
||||||
|
|
||||||
|
Devstack provides a framework for getting packages installed at an early
|
||||||
|
phase of its execution. This packages may be defined in a plugin as files
|
||||||
|
that contain new-line separated lists of packages required by the plugin
|
||||||
|
|
||||||
|
Supported packaging systems include apt and yum across multiple distributions.
|
||||||
|
To enable a plugin to hook into this and install package dependencies, packages
|
||||||
|
may be listed at the following locations in the top-level of the plugin
|
||||||
|
repository:
|
||||||
|
|
||||||
|
- ``./devstack/files/debs/$plugin_name`` - Packages to install when running
|
||||||
|
on Ubuntu, Debian or Linux Mint.
|
||||||
|
|
||||||
|
- ``./devstack/files/rpms/$plugin_name`` - Packages to install when running
|
||||||
|
on Red Hat, Fedora, CentOS or XenServer.
|
||||||
|
|
||||||
|
- ``./devstack/files/rpms-suse/$plugin_name`` - Packages to install when
|
||||||
|
running on SUSE Linux or openSUSE.
|
||||||
|
183
functions-common
183
functions-common
@ -774,13 +774,18 @@ function get_or_create_endpoint {
|
|||||||
|
|
||||||
# _get_package_dir
|
# _get_package_dir
|
||||||
function _get_package_dir {
|
function _get_package_dir {
|
||||||
|
local base_dir=$1
|
||||||
local pkg_dir
|
local pkg_dir
|
||||||
|
|
||||||
|
if [[ -z "$base_dir" ]]; then
|
||||||
|
base_dir=$FILES
|
||||||
|
fi
|
||||||
if is_ubuntu; then
|
if is_ubuntu; then
|
||||||
pkg_dir=$FILES/debs
|
pkg_dir=$base_dir/debs
|
||||||
elif is_fedora; then
|
elif is_fedora; then
|
||||||
pkg_dir=$FILES/rpms
|
pkg_dir=$base_dir/rpms
|
||||||
elif is_suse; then
|
elif is_suse; then
|
||||||
pkg_dir=$FILES/rpms-suse
|
pkg_dir=$base_dir/rpms-suse
|
||||||
else
|
else
|
||||||
exit_distro_not_supported "list of packages"
|
exit_distro_not_supported "list of packages"
|
||||||
fi
|
fi
|
||||||
@ -806,84 +811,14 @@ function apt_get {
|
|||||||
apt-get --option "Dpkg::Options::=--force-confold" --assume-yes "$@"
|
apt-get --option "Dpkg::Options::=--force-confold" --assume-yes "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
# get_packages() collects a list of package names of any type from the
|
function _parse_package_files {
|
||||||
# prerequisite files in ``files/{debs|rpms}``. The list is intended
|
local files_to_parse=$@
|
||||||
# to be passed to a package installer such as apt or yum.
|
|
||||||
#
|
|
||||||
# Only packages required for the services in 1st argument will be
|
|
||||||
# included. Two bits of metadata are recognized in the prerequisite files:
|
|
||||||
#
|
|
||||||
# - ``# NOPRIME`` defers installation to be performed later in `stack.sh`
|
|
||||||
# - ``# dist:DISTRO`` or ``dist:DISTRO1,DISTRO2`` limits the selection
|
|
||||||
# of the package to the distros listed. The distro names are case insensitive.
|
|
||||||
function get_packages {
|
|
||||||
local xtrace=$(set +o | grep xtrace)
|
|
||||||
set +o xtrace
|
|
||||||
local services=$@
|
|
||||||
local package_dir=$(_get_package_dir)
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
if [[ -z "$DISTRO" ]]; then
|
if [[ -z "$DISTRO" ]]; then
|
||||||
GetDistro
|
GetDistro
|
||||||
fi
|
fi
|
||||||
for service in ${services//,/ }; do
|
|
||||||
# Allow individual services to specify dependencies
|
|
||||||
if [[ -e ${package_dir}/${service} ]]; then
|
|
||||||
file_to_parse="${file_to_parse} $service"
|
|
||||||
fi
|
|
||||||
# NOTE(sdague) n-api needs glance for now because that's where
|
|
||||||
# glance client is
|
|
||||||
if [[ $service == n-api ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ nova ]]; then
|
|
||||||
file_to_parse="${file_to_parse} nova"
|
|
||||||
fi
|
|
||||||
if [[ ! $file_to_parse =~ glance ]]; then
|
|
||||||
file_to_parse="${file_to_parse} glance"
|
|
||||||
fi
|
|
||||||
elif [[ $service == c-* ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ cinder ]]; then
|
|
||||||
file_to_parse="${file_to_parse} cinder"
|
|
||||||
fi
|
|
||||||
elif [[ $service == ceilometer-* ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ ceilometer ]]; then
|
|
||||||
file_to_parse="${file_to_parse} ceilometer"
|
|
||||||
fi
|
|
||||||
elif [[ $service == s-* ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ swift ]]; then
|
|
||||||
file_to_parse="${file_to_parse} swift"
|
|
||||||
fi
|
|
||||||
elif [[ $service == n-* ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ nova ]]; then
|
|
||||||
file_to_parse="${file_to_parse} nova"
|
|
||||||
fi
|
|
||||||
elif [[ $service == g-* ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ glance ]]; then
|
|
||||||
file_to_parse="${file_to_parse} glance"
|
|
||||||
fi
|
|
||||||
elif [[ $service == key* ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ keystone ]]; then
|
|
||||||
file_to_parse="${file_to_parse} keystone"
|
|
||||||
fi
|
|
||||||
elif [[ $service == q-* ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ neutron ]]; then
|
|
||||||
file_to_parse="${file_to_parse} neutron"
|
|
||||||
fi
|
|
||||||
elif [[ $service == ir-* ]]; then
|
|
||||||
if [[ ! $file_to_parse =~ ironic ]]; then
|
|
||||||
file_to_parse="${file_to_parse} ironic"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
for file in ${file_to_parse}; do
|
for fname in ${files_to_parse}; do
|
||||||
local fname=${package_dir}/${file}
|
|
||||||
local OIFS line package distros distro
|
local OIFS line package distros distro
|
||||||
[[ -e $fname ]] || continue
|
[[ -e $fname ]] || continue
|
||||||
|
|
||||||
@ -927,6 +862,102 @@ function get_packages {
|
|||||||
done
|
done
|
||||||
IFS=$OIFS
|
IFS=$OIFS
|
||||||
done
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# get_packages() collects a list of package names of any type from the
|
||||||
|
# prerequisite files in ``files/{debs|rpms}``. The list is intended
|
||||||
|
# to be passed to a package installer such as apt or yum.
|
||||||
|
#
|
||||||
|
# Only packages required for the services in 1st argument will be
|
||||||
|
# included. Two bits of metadata are recognized in the prerequisite files:
|
||||||
|
#
|
||||||
|
# - ``# NOPRIME`` defers installation to be performed later in `stack.sh`
|
||||||
|
# - ``# dist:DISTRO`` or ``dist:DISTRO1,DISTRO2`` limits the selection
|
||||||
|
# of the package to the distros listed. The distro names are case insensitive.
|
||||||
|
function get_packages {
|
||||||
|
local xtrace=$(set +o | grep xtrace)
|
||||||
|
set +o xtrace
|
||||||
|
local services=$@
|
||||||
|
local package_dir=$(_get_package_dir)
|
||||||
|
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
|
||||||
|
fi
|
||||||
|
for service in ${services//,/ }; do
|
||||||
|
# Allow individual services to specify dependencies
|
||||||
|
if [[ -e ${package_dir}/${service} ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/${service}"
|
||||||
|
fi
|
||||||
|
# NOTE(sdague) n-api needs glance for now because that's where
|
||||||
|
# glance client is
|
||||||
|
if [[ $service == n-api ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ nova ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/nova"
|
||||||
|
fi
|
||||||
|
if [[ ! $file_to_parse =~ glance ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/glance"
|
||||||
|
fi
|
||||||
|
elif [[ $service == c-* ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ cinder ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/cinder"
|
||||||
|
fi
|
||||||
|
elif [[ $service == ceilometer-* ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ ceilometer ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/ceilometer"
|
||||||
|
fi
|
||||||
|
elif [[ $service == s-* ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ swift ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/swift"
|
||||||
|
fi
|
||||||
|
elif [[ $service == n-* ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ nova ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/nova"
|
||||||
|
fi
|
||||||
|
elif [[ $service == g-* ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ glance ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/glance"
|
||||||
|
fi
|
||||||
|
elif [[ $service == key* ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ keystone ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/keystone"
|
||||||
|
fi
|
||||||
|
elif [[ $service == q-* ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ neutron ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/neutron"
|
||||||
|
fi
|
||||||
|
elif [[ $service == ir-* ]]; then
|
||||||
|
if [[ ! $file_to_parse =~ ironic ]]; then
|
||||||
|
file_to_parse="${file_to_parse} ${package_dir}/ironic"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "$(_parse_package_files $file_to_parse)"
|
||||||
|
$xtrace
|
||||||
|
}
|
||||||
|
|
||||||
|
# get_plugin_packages() collects a list of package names of any type from a
|
||||||
|
# plugin's prerequisite files in ``$PLUGIN/devstack/files/{debs|rpms}``. The
|
||||||
|
# list is intended to be passed to a package installer such as apt or yum.
|
||||||
|
#
|
||||||
|
# Only packages required for enabled and collected plugins will included.
|
||||||
|
#
|
||||||
|
# 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)
|
||||||
|
set +o xtrace
|
||||||
|
local files_to_parse=""
|
||||||
|
local package_dir=""
|
||||||
|
for plugin in ${DEVSTACK_PLUGINS//,/ }; do
|
||||||
|
local package_dir="$(_get_package_dir ${GITDIR[$plugin]}/devstack/files)"
|
||||||
|
files_to_parse+="$package_dir/$plugin"
|
||||||
|
done
|
||||||
|
echo "$(_parse_package_files $files_to_parse)"
|
||||||
$xtrace
|
$xtrace
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +62,8 @@ export_proxy_variables
|
|||||||
|
|
||||||
# Install package requirements
|
# Install package requirements
|
||||||
PACKAGES=$(get_packages general $ENABLED_SERVICES)
|
PACKAGES=$(get_packages general $ENABLED_SERVICES)
|
||||||
|
PACKAGES="$PACKAGES $(get_plugin_packages)"
|
||||||
|
|
||||||
if is_ubuntu && echo $PACKAGES | grep -q dkms ; then
|
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)"
|
PACKAGES="$PACKAGES linux-headers-$(uname -r)"
|
||||||
|
Loading…
Reference in New Issue
Block a user