Add support for placement API to devstack
Uses lib/placement, but relies on some functionality from lib/nova. This leads to some weirdness since the nova has special status in stack.sh. If/when placement is extracted it may be good to follow the devstack plugin structure instead. Because the placement code is currently a part of nova, there are dependencies in lib/placement on a some $NOVA_* variable and, if virtenv is being used, the virtualenv used by nova. Because placement currently runs using nova's configuration settings, not a lot actually happens in lib/placement: apache is configured and keystone accounts and endpoints are created. If PLACEMENT_DB_ENABLED is true then a separate placement db will be configured. When complete the initial version of the placement service will provide support for managing resource providers, inventories and allocations. The placement api only runs under mod-wsgi. Change-Id: I53dd3e6b41de17387a0e179fc9ac64c143b6a9eb
This commit is contained in:
parent
23fc4e0342
commit
4d6017566a
1
clean.sh
1
clean.sh
@ -46,6 +46,7 @@ source $TOP_DIR/lib/horizon
|
|||||||
source $TOP_DIR/lib/keystone
|
source $TOP_DIR/lib/keystone
|
||||||
source $TOP_DIR/lib/glance
|
source $TOP_DIR/lib/glance
|
||||||
source $TOP_DIR/lib/nova
|
source $TOP_DIR/lib/nova
|
||||||
|
source $TOP_DIR/lib/placement
|
||||||
source $TOP_DIR/lib/cinder
|
source $TOP_DIR/lib/cinder
|
||||||
source $TOP_DIR/lib/swift
|
source $TOP_DIR/lib/swift
|
||||||
source $TOP_DIR/lib/heat
|
source $TOP_DIR/lib/heat
|
||||||
|
25
files/apache-placement-api.template
Normal file
25
files/apache-placement-api.template
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
Listen %PUBLICPORT%
|
||||||
|
|
||||||
|
<VirtualHost *:%PUBLICPORT%>
|
||||||
|
WSGIDaemonProcess placement-api processes=%APIWORKERS% threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV%
|
||||||
|
WSGIProcessGroup placement-api
|
||||||
|
WSGIScriptAlias / %PUBLICWSGI%
|
||||||
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
WSGIPassAuthorization On
|
||||||
|
<IfVersion >= 2.4>
|
||||||
|
ErrorLogFormat "%M"
|
||||||
|
</IfVersion>
|
||||||
|
ErrorLog /var/log/%APACHE_NAME%/placement-api.log
|
||||||
|
%SSLENGINE%
|
||||||
|
%SSLCERTFILE%
|
||||||
|
%SSLKEYFILE%
|
||||||
|
</VirtualHost>
|
||||||
|
|
||||||
|
Alias /placement %PUBLICWSGI%
|
||||||
|
<Location /placement>
|
||||||
|
SetHandler wsgi-script
|
||||||
|
Options +ExecCGI
|
||||||
|
WSGIProcessGroup placement-api
|
||||||
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
WSGIPassAuthorization On
|
||||||
|
</Location>
|
201
lib/placement
Normal file
201
lib/placement
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# lib/placement
|
||||||
|
# Functions to control the configuration and operation of the **Placement** service
|
||||||
|
#
|
||||||
|
# Currently the placement service is embedded in nova. Eventually we
|
||||||
|
# expect this to change so this file is started as a separate entity
|
||||||
|
# despite making use of some *NOVA* variables and files.
|
||||||
|
|
||||||
|
# Dependencies:
|
||||||
|
#
|
||||||
|
# - ``functions`` file
|
||||||
|
# - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
|
||||||
|
# - ``FILES``
|
||||||
|
|
||||||
|
# ``stack.sh`` calls the entry points in this order:
|
||||||
|
#
|
||||||
|
# - install_placement
|
||||||
|
# - cleanup_placement
|
||||||
|
# - configure_placement
|
||||||
|
# - init_placement
|
||||||
|
# - start_placement
|
||||||
|
# - stop_placement
|
||||||
|
|
||||||
|
# Save trace setting
|
||||||
|
_XTRACE_LIB_PLACEMENT=$(set +o | grep xtrace)
|
||||||
|
set +o xtrace
|
||||||
|
|
||||||
|
# Defaults
|
||||||
|
# --------
|
||||||
|
|
||||||
|
PLACEMENT_CONF_DIR=/etc/nova
|
||||||
|
PLACEMENT_CONF=$PLACEMENT_CONF_DIR/nova.conf
|
||||||
|
PLACEMENT_AUTH_STRATEGY=${PLACEMENT_AUTH_STRATEGY:-placement}
|
||||||
|
|
||||||
|
|
||||||
|
# The placement service can optionally use a separate database
|
||||||
|
# connection. Set PLACEMENT_DB_ENABLED to True to use it.
|
||||||
|
# NOTE(cdent): This functionality depends on some code that is not
|
||||||
|
# yet merged in nova but is coming soon.
|
||||||
|
PLACEMENT_DB_ENABLED=$(trueorfalse False PLACEMENT_DB_ENABLED)
|
||||||
|
|
||||||
|
if is_suse; then
|
||||||
|
PLACEMENT_WSGI_DIR=${PLACEMENT_WSGI_DIR:-/srv/www/htdocs/placement}
|
||||||
|
else
|
||||||
|
PLACEMENT_WSGI_DIR=${PLACEMENT_WSGI_DIR:-/var/www/placement}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if is_ssl_enabled_service "placement-api" || is_service_enabled tls-proxy; then
|
||||||
|
PLACEMENT_SERVICE_PROTOCOL="https"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Public facing bits
|
||||||
|
PLACEMENT_SERVICE_PROTOCOL=${PLACEMENT_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
|
||||||
|
PLACEMENT_SERVICE_HOST=${PLACEMENT_SERVICE_HOST:-$SERVICE_HOST}
|
||||||
|
PLACEMENT_SERVICE_PORT=${PLACEMENT_SERVICE_PORT:-8778}
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
# ---------
|
||||||
|
|
||||||
|
# Test if any placement services are enabled
|
||||||
|
# is_placement_enabled
|
||||||
|
function is_placement_enabled {
|
||||||
|
[[ ,${ENABLED_SERVICES} =~ ,"placement-" ]] && return 0
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# cleanup_placement() - Remove residual data files, anything left over from previous
|
||||||
|
# runs that a clean run would need to clean up
|
||||||
|
function cleanup_placement {
|
||||||
|
sudo rm -f $(apache_site_config_for placement-api)
|
||||||
|
}
|
||||||
|
|
||||||
|
# _config_placement_apache_wsgi() - Set WSGI config files
|
||||||
|
function _config_placement_apache_wsgi {
|
||||||
|
sudo mkdir -p $PLACEMENT_WSGI_DIR
|
||||||
|
|
||||||
|
local placement_api_apache_conf
|
||||||
|
local placement_api_port=$PLACEMENT_SERVICE_PORT
|
||||||
|
local venv_path=""
|
||||||
|
placement_api_apache_conf=$(apache_site_config_for placement-api)
|
||||||
|
|
||||||
|
# reuse nova's cert if a cert is being used
|
||||||
|
if is_ssl_enabled_service "placement-api"; then
|
||||||
|
placement_ssl="SSLEngine On"
|
||||||
|
placement_certfile="SSLCertificateFile $NOVA_SSL_CERT"
|
||||||
|
placement_keyfile="SSLCertificateKeyFile $NOVA_SSL_KEY"
|
||||||
|
fi
|
||||||
|
# reuse nova's venv if there is one as placement code lives
|
||||||
|
# there
|
||||||
|
if [[ ${USE_VENV} = True ]]; then
|
||||||
|
venv_path="python-path=${PROJECT_VENV["nova"]}/lib/$(python_version)/site-packages"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# copy wsgi application file
|
||||||
|
sudo cp $NOVA_DIR/nova/api/openstack/placement/placement-api.py $PLACEMENT_WSGI_DIR/placement-api
|
||||||
|
|
||||||
|
sudo cp $FILES/apache-placement-api.template $placement_api_apache_conf
|
||||||
|
sudo sed -e "
|
||||||
|
s|%PUBLICPORT%|$placement_api_port|g;
|
||||||
|
s|%APACHE_NAME%|$APACHE_NAME|g;
|
||||||
|
s|%PUBLICWSGI%|$PLACEMENT_WSGI_DIR/placement-api|g;
|
||||||
|
s|%SSLENGINE%|$placement_ssl|g;
|
||||||
|
s|%SSLCERTFILE%|$placement_certfile|g;
|
||||||
|
s|%SSLKEYFILE%|$placement_keyfile|g;
|
||||||
|
s|%USER%|$STACK_USER|g;
|
||||||
|
s|%VIRTUALENV%|$venv_path|g
|
||||||
|
s|%APIWORKERS%|$API_WORKERS|g
|
||||||
|
" -i $placement_api_apache_conf
|
||||||
|
}
|
||||||
|
|
||||||
|
# configure_placement() - Set config files, create data dirs, etc
|
||||||
|
function configure_placement {
|
||||||
|
if [ "$PLACEMENT_DB_ENABLED" != False ]; then
|
||||||
|
iniset $PLACEMENT_CONF placement_database connection `database_connection_url placement`
|
||||||
|
fi
|
||||||
|
|
||||||
|
iniset $NOVA_CONF placement auth_type "password"
|
||||||
|
iniset $NOVA_CONF placement auth_url "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:$KEYSTONE_AUTH_PORT/v3"
|
||||||
|
iniset $NOVA_CONF placement username placement
|
||||||
|
iniset $NOVA_CONF placement password "$SERVICE_PASSWORD"
|
||||||
|
iniset $NOVA_CONF placement user_domain_name "Default"
|
||||||
|
iniset $NOVA_CONF placement project_name "$SERVICE_TENANT_NAME"
|
||||||
|
iniset $NOVA_CONF placement project_domain_name "Default"
|
||||||
|
iniset $NOVA_CONF placement region_name "$REGION_NAME"
|
||||||
|
# TODO(cdent): auth_strategy, which is common to see in these
|
||||||
|
# blocks is not currently used here. For the time being the
|
||||||
|
# placement api uses the auth_strategy configuration setting
|
||||||
|
# established by the nova api. This avoids, for the time, being,
|
||||||
|
# creating redundant configuration items that are just used for
|
||||||
|
# testing.
|
||||||
|
|
||||||
|
_config_placement_apache_wsgi
|
||||||
|
}
|
||||||
|
|
||||||
|
# create_placement_accounts() - Set up required placement accounts
|
||||||
|
# and service and endpoints.
|
||||||
|
function create_placement_accounts {
|
||||||
|
create_service_user "placement" "admin"
|
||||||
|
local placement_api_url="$PLACEMENT_SERVICE_PROTOCOL://$PLACEMENT_SERVICE_HOST/placement"
|
||||||
|
get_or_create_service "placement" "placement" "Placement Service"
|
||||||
|
get_or_create_endpoint \
|
||||||
|
"placement" \
|
||||||
|
"$REGION_NAME" \
|
||||||
|
"$placement_api_url" \
|
||||||
|
"$placement_api_url" \
|
||||||
|
"$placement_api_url"
|
||||||
|
}
|
||||||
|
|
||||||
|
# init_placement() - Create service user and endpoints
|
||||||
|
# If PLACEMENT_DB_ENABLED is true, create the separate placement db
|
||||||
|
# using, for now, the api_db migrations.
|
||||||
|
function init_placement {
|
||||||
|
if [ "$PLACEMENT_DB_ENABLED" != False ]; then
|
||||||
|
recreate_database placement
|
||||||
|
$NOVA_BIN_DIR/nova-manage --config-file $NOVA_CONF api_db sync
|
||||||
|
fi
|
||||||
|
create_placement_accounts
|
||||||
|
}
|
||||||
|
|
||||||
|
# install_placement() - Collect source and prepare
|
||||||
|
function install_placement {
|
||||||
|
install_apache_wsgi
|
||||||
|
if is_ssl_enabled_service "placement-api"; then
|
||||||
|
enable_mod_ssl
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# start_placement_api() - Start the API processes ahead of other things
|
||||||
|
function start_placement_api {
|
||||||
|
# Get right service port for testing
|
||||||
|
local service_port=$PLACEMENT_SERVICE_PORT
|
||||||
|
local placement_api_port=$PLACEMENT_SERVICE_PORT
|
||||||
|
|
||||||
|
enable_apache_site placement-api
|
||||||
|
restart_apache_server
|
||||||
|
tail_log placement-api /var/log/$APACHE_NAME/placement-api.log
|
||||||
|
|
||||||
|
echo "Waiting for placement-api to start..."
|
||||||
|
if ! wait_for_service $SERVICE_TIMEOUT $PLACEMENT_SERVICE_PROTOCOL://$PLACEMENT_SERVICE_HOST/placement; then
|
||||||
|
die $LINENO "placement-api did not start"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function start_placement {
|
||||||
|
start_placement_api
|
||||||
|
}
|
||||||
|
|
||||||
|
# stop_placement() - Disable the api service and stop it.
|
||||||
|
function stop_placement {
|
||||||
|
disable_apache_site placement-api
|
||||||
|
restart_apache_server
|
||||||
|
}
|
||||||
|
|
||||||
|
# Restore xtrace
|
||||||
|
$_XTRACE_LIB_PLACEMENT
|
||||||
|
|
||||||
|
# Tell emacs to use shell-script-mode
|
||||||
|
## Local variables:
|
||||||
|
## mode: shell-script
|
||||||
|
## End:
|
17
stack.sh
17
stack.sh
@ -569,6 +569,7 @@ source $TOP_DIR/lib/horizon
|
|||||||
source $TOP_DIR/lib/keystone
|
source $TOP_DIR/lib/keystone
|
||||||
source $TOP_DIR/lib/glance
|
source $TOP_DIR/lib/glance
|
||||||
source $TOP_DIR/lib/nova
|
source $TOP_DIR/lib/nova
|
||||||
|
source $TOP_DIR/lib/placement
|
||||||
source $TOP_DIR/lib/cinder
|
source $TOP_DIR/lib/cinder
|
||||||
source $TOP_DIR/lib/swift
|
source $TOP_DIR/lib/swift
|
||||||
source $TOP_DIR/lib/heat
|
source $TOP_DIR/lib/heat
|
||||||
@ -859,6 +860,13 @@ if is_service_enabled nova; then
|
|||||||
configure_nova
|
configure_nova
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if is_service_enabled placement; then
|
||||||
|
# placement api
|
||||||
|
stack_install_service placement
|
||||||
|
cleanup_placement
|
||||||
|
configure_placement
|
||||||
|
fi
|
||||||
|
|
||||||
if is_service_enabled horizon; then
|
if is_service_enabled horizon; then
|
||||||
# django openstack_auth
|
# django openstack_auth
|
||||||
install_django_openstack_auth
|
install_django_openstack_auth
|
||||||
@ -1160,6 +1168,11 @@ if is_service_enabled nova; then
|
|||||||
init_nova_cells
|
init_nova_cells
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if is_service_enabled placement; then
|
||||||
|
echo_summary "Configuring placement"
|
||||||
|
init_placement
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Extras Configuration
|
# Extras Configuration
|
||||||
# ====================
|
# ====================
|
||||||
@ -1265,6 +1278,10 @@ if is_service_enabled nova; then
|
|||||||
start_nova
|
start_nova
|
||||||
create_flavors
|
create_flavors
|
||||||
fi
|
fi
|
||||||
|
if is_service_enabled placement; then
|
||||||
|
echo_summary "Starting Placement"
|
||||||
|
start_placement
|
||||||
|
fi
|
||||||
if is_service_enabled cinder; then
|
if is_service_enabled cinder; then
|
||||||
echo_summary "Starting Cinder"
|
echo_summary "Starting Cinder"
|
||||||
start_cinder
|
start_cinder
|
||||||
|
@ -63,6 +63,7 @@ source $TOP_DIR/lib/horizon
|
|||||||
source $TOP_DIR/lib/keystone
|
source $TOP_DIR/lib/keystone
|
||||||
source $TOP_DIR/lib/glance
|
source $TOP_DIR/lib/glance
|
||||||
source $TOP_DIR/lib/nova
|
source $TOP_DIR/lib/nova
|
||||||
|
source $TOP_DIR/lib/placement
|
||||||
source $TOP_DIR/lib/cinder
|
source $TOP_DIR/lib/cinder
|
||||||
source $TOP_DIR/lib/swift
|
source $TOP_DIR/lib/swift
|
||||||
source $TOP_DIR/lib/heat
|
source $TOP_DIR/lib/heat
|
||||||
@ -111,6 +112,10 @@ if is_service_enabled nova; then
|
|||||||
stop_nova
|
stop_nova
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if is_service_enabled placement; then
|
||||||
|
stop_placement
|
||||||
|
fi
|
||||||
|
|
||||||
if is_service_enabled glance; then
|
if is_service_enabled glance; then
|
||||||
stop_glance
|
stop_glance
|
||||||
fi
|
fi
|
||||||
|
Loading…
Reference in New Issue
Block a user