Changes in python packaging tooling mean that the wsgi_scripts functionality via PBR may not longer function. We migrate freezer to use wsgi modules to ensure consistent behavior and achieve the community goal. For more details see the proposed OpenStack goal [1]. We also fix compatability with Falcon 4.1 which is a requirements for 2026.1 [1] https://review.opendev.org/c/openstack/governance/+/902807 Change-Id: I6f73ee5fe6194d2a5390dfb5389e336719332cb1 Signed-off-by: Dmitriy Rabotyagov <noonedeadpunk@gmail.com>
336 lines
10 KiB
Bash
336 lines
10 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# (c) Copyright 2014,2015 Hewlett-Packard Development Company, L.P.
|
|
#
|
|
# 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.
|
|
|
|
# Install and start Freezer service
|
|
|
|
# add the following to localrc:
|
|
# enable_service freezer-api
|
|
#
|
|
# Dependencies:
|
|
# - functions
|
|
# - OS_AUTH_URL for auth in api
|
|
# - DEST set to the destination directory
|
|
# - SERVICE_PASSWORD, SERVICE_TENANT_NAME for auth in api
|
|
# - STACK_USER service user
|
|
|
|
# functions called by the plugin.sh script
|
|
# source plugin.sh <mode> [phase]
|
|
# ---------
|
|
# - <stack>
|
|
# - <stack> [pre-install]
|
|
# - <stack> [install]
|
|
# - install_freezer_api
|
|
# - <stack> [post-config]
|
|
# - configure_freezer_api
|
|
# - create_freezer_api_accounts
|
|
# - <stack> [extra]
|
|
# - init_freezer_api
|
|
# - start_freezer_api
|
|
# - <unstack>
|
|
# - stop_freezer_api
|
|
# - <clean>
|
|
# - cleanup_freezer_api
|
|
|
|
# Save trace setting
|
|
XTRACE=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
|
|
source $FREEZER_API_DIR/devstack/lib/elasticsearch.sh
|
|
|
|
# Functions
|
|
# ---------
|
|
|
|
function is_freezer_api_enabled {
|
|
[[ ,${ENABLED_SERVICES} =~ ,"freezer-api" ]] && return 0
|
|
return 1
|
|
}
|
|
|
|
|
|
# executed during: clean
|
|
function cleanup_freezer_api {
|
|
disable_apache_site freezer-api
|
|
sudo rm -f $(apache_site_config_for freezer-api)
|
|
if [[ "${FREEZER_BACKEND}" != "sqlalchemy" ]]; then
|
|
uninstall_elasticsearch
|
|
fi
|
|
sudo rm -rf $FREEZER_API_AUTH_CACHE_DIR $FREEZER_API_CONF_DIR
|
|
}
|
|
|
|
# executed during: stack install
|
|
function install_freezer_api {
|
|
|
|
git_clone $FREEZER_API_REPO $FREEZER_API_DIR $FREEZER_API_BRANCH
|
|
|
|
if [[ "${FREEZER_BACKEND}" != "sqlalchemy" ]]; then
|
|
download_elasticsearch
|
|
install_elasticsearch
|
|
fi
|
|
|
|
setup_develop $FREEZER_API_DIR
|
|
|
|
if [[ "${FREEZER_API_SERVER_TYPE}" == "uwsgi" ]]; then
|
|
pip_install 'uwsgi'
|
|
fi
|
|
}
|
|
|
|
# Setup python-freezerclient
|
|
function install_freezerclient {
|
|
|
|
git_clone $FREEZERCLIENT_REPO $FREEZERCLIENT_DIR $FREEZERCLIENT_BRANCH
|
|
setup_develop $FREEZERCLIENT_DIR
|
|
}
|
|
|
|
# executed during: stack post-config
|
|
function configure_freezer_api {
|
|
|
|
[ ! -d $FREEZER_API_CONF_DIR ] && sudo mkdir -m 755 -p $FREEZER_API_CONF_DIR
|
|
sudo chown $USER $FREEZER_API_CONF_DIR
|
|
|
|
[ ! -d $FREEZER_API_LOG_DIR ] && sudo mkdir -m 755 -p $FREEZER_API_LOG_DIR
|
|
sudo chown $USER $FREEZER_API_LOG_DIR
|
|
|
|
sudo cp $FREEZER_API_DIR/etc/freezer/freezer-api.conf.sample $FREEZER_API_CONF_DIR/freezer-api.conf
|
|
sudo cp $FREEZER_API_DIR/etc/freezer/freezer-paste.ini $FREEZER_API_CONF_DIR/freezer-paste.ini
|
|
|
|
# enable debuging
|
|
iniset $FREEZER_API_CONF 'DEFAULT' debug True
|
|
iniset $FREEZER_API_CONF 'DEFAULT' log_file $FREEZER_API_LOG_DIR/freezer-api.log
|
|
|
|
# set paste configuration
|
|
iniset $FREEZER_API_CONF 'paste_deploy' config_file $FREEZER_API_CONF_DIR/freezer-paste.ini
|
|
|
|
# make sure the stack user has the right permissions on the config folder
|
|
sudo chown -R $USER $FREEZER_API_CONF_DIR
|
|
|
|
if [[ "${FREEZER_BACKEND}" == "sqlalchemy" ]]; then
|
|
|
|
#set sqlalchemy configuration
|
|
|
|
iniset $FREEZER_API_CONF 'storage' backend sqlalchemy
|
|
iniset $FREEZER_API_CONF 'storage' driver sqlalchemy
|
|
iniset $FREEZER_API_CONF 'database' connection `database_connection_url freezer`
|
|
|
|
else
|
|
#set elasticsearch configuration
|
|
|
|
iniset $FREEZER_API_CONF 'storage' backend elasticsearch
|
|
iniset $FREEZER_API_CONF 'storage' driver elasticsearch
|
|
|
|
iniset $FREEZER_API_CONF 'elasticsearch' index freezer
|
|
iniset $FREEZER_API_CONF 'elasticsearch' number_of_replicas 0
|
|
iniset $FREEZER_API_CONF 'elasticsearch' hosts http://$SERVICE_HOST:9200
|
|
|
|
fi
|
|
|
|
# create freezer_api_cache_dir
|
|
sudo mkdir -p $FREEZER_API_AUTH_CACHE_DIR/api
|
|
sudo chown $STACK_USER $FREEZER_API_AUTH_CACHE_DIR/api
|
|
rm -f $FREEZER_API_AUTH_CACHE_DIR/api/*
|
|
sudo mkdir -p $FREEZER_API_AUTH_CACHE_DIR/registry
|
|
sudo chown $STACK_USER $FREEZER_API_AUTH_CACHE_DIR/registry
|
|
rm -f $FREEZER_API_AUTH_CACHE_DIR/registry/*
|
|
|
|
# configure logs
|
|
if [ -n "$BASE" ] && [ -d "$BASE/logs" ]; then
|
|
sudo ln -sf $FREEZER_API_LOG_DIR/freezer-api.log $BASE/logs/freezer-api-post.log
|
|
fi
|
|
|
|
# set keystone configuration
|
|
configure_auth_token_middleware $FREEZER_API_CONF freezer $FREEZER_API_AUTH_CACHE_DIR/api
|
|
|
|
if [[ "${FREEZER_API_SERVER_TYPE}" == "apache2" ]]; then
|
|
echo_summary "Configuring Freezer API wsgi app in Apache"
|
|
configure_apache_freezer_app
|
|
elif [[ "${FREEZER_API_SERVER_TYPE}" == "uwsgi" ]]; then
|
|
echo_summary "Configuring Freezer API wsgi app in Uwsgi"
|
|
configure_uwsgi_freezer_api_app
|
|
fi
|
|
|
|
# TODO certs and more recent options such as elasticsearch connection parameters
|
|
}
|
|
|
|
|
|
# executed during: stack extra
|
|
function init_freezer_api {
|
|
|
|
if [[ "${FREEZER_BACKEND}" == "sqlalchemy" ]]; then
|
|
recreate_database freezer utf8
|
|
freezer-manage db sync
|
|
else
|
|
|
|
# this also waits for elasticsearch to start
|
|
start_elasticsearch
|
|
# put elasticsearch mappings
|
|
freezer-manage db update
|
|
freezer-manage db show
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
# executed during: stack extra
|
|
function start_freezer_api {
|
|
|
|
if [[ "${FREEZER_API_SERVER_TYPE}" == "uwsgi" ]]; then
|
|
# @todo (szaher) use apache2 proxy template to run api with uwsgi
|
|
run_process freezer-api "$FREEZER_API_BIN_DIR/uwsgi --ini $FREEZER_API_UWSGI_CONF --pidfile2 $FREEZER_API_UWSGI_MASTER_PIDFILE"
|
|
sleep 1
|
|
enable_apache_site freezer-api
|
|
restart_apache_server
|
|
|
|
# tail_log freezer-api /var/log/$APACHE_NAME/freezer-api.log
|
|
|
|
elif [[ "${FREEZER_API_SERVER_TYPE}" == "apache2" ]]; then
|
|
|
|
enable_apache_site freezer-api
|
|
restart_apache_server
|
|
# tail_log freezer-api /var/log/$APACHE_NAME/freezer-api.log
|
|
# tail_log freezer-access /var/log/$APACHE_NAME/freezer-api_access.log
|
|
fi
|
|
}
|
|
|
|
|
|
# executed during: stop
|
|
function stop_freezer_api {
|
|
|
|
if [[ "${FREEZER_BACKEND}" != "sqlalchemy" ]]; then
|
|
stop_elasticsearch
|
|
fi
|
|
|
|
if [[ "${FREEZER_API_SERVER_TYPE}" == "uwsgi" ]]; then
|
|
uwsgi --stop $FREEZER_API_UWSGI_MASTER_PIDFILE
|
|
killall -9 uwsgi
|
|
fi
|
|
|
|
disable_apache_site freezer-api
|
|
stop_process freezer-api
|
|
}
|
|
|
|
|
|
# utility function
|
|
function get_id {
|
|
echo `"$@" | awk '/ id / { print $4 }'`
|
|
}
|
|
|
|
|
|
# executed during: stack post-config
|
|
function create_freezer_api_accounts {
|
|
#
|
|
# Setup admin user
|
|
#
|
|
SERVICE_TENANT_NAME=${SERVICE_TENANT_NAME:-service}
|
|
local admin_role=$(get_or_create_role "admin")
|
|
|
|
local freezer_user=$(get_or_create_user freezer \
|
|
"$SERVICE_PASSWORD" "default" "freezer@example.com")
|
|
|
|
get_or_add_user_project_role $admin_role $freezer_user $SERVICE_TENANT_NAME
|
|
|
|
#
|
|
# freezer backup service registration
|
|
#
|
|
local freezer_service=$(get_or_create_service "freezer" "backup" "Freezer Backup Service")
|
|
|
|
#
|
|
# freezer backup endpoint registration
|
|
#
|
|
|
|
if [[ "${FREEZER_API_SERVER_TYPE}" == "uwsgi" ]]; then
|
|
get_or_create_endpoint "$freezer_service" \
|
|
"$REGION_NAME" \
|
|
"$FREEZER_API_SERVICE_PROTOCOL://$SERVICE_HOST/backup" \
|
|
"$FREEZER_API_SERVICE_PROTOCOL://$SERVICE_HOST/backup" \
|
|
"$FREEZER_API_SERVICE_PROTOCOL://$SERVICE_HOST/backup"
|
|
|
|
elif [[ "${FREEZER_API_SERVER_TYPE}" == "apache2" ]]; then
|
|
get_or_create_endpoint "$freezer_service" \
|
|
"$REGION_NAME" \
|
|
"$FREEZER_API_SERVICE_PROTOCOL://$SERVICE_HOST:$FREEZER_API_PORT" \
|
|
"$FREEZER_API_SERVICE_PROTOCOL://$SERVICE_HOST:$FREEZER_API_PORT" \
|
|
"$FREEZER_API_SERVICE_PROTOCOL://$SERVICE_HOST:$FREEZER_API_PORT"
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
function configure_apache_freezer_app {
|
|
local freezer_api_apache_conf=$(apache_site_config_for freezer-api)
|
|
|
|
# Add a %LOCAL_LISTEN% parameter to conditionally listen 127.0.0.1 when
|
|
# not already doing so to allow monitoring checks
|
|
local local_listen="Listen 127.0.0.1:$FREEZER_API_PORT"
|
|
if [[ "${SERVICE_HOST}" == "127.0.0.1" ]] || [[ "${SERVICE_HOST}" == "localhost" ]]; then
|
|
local_listen=""
|
|
fi
|
|
|
|
sudo cp $FREEZER_API_FILES/apache-freezer-api.template $freezer_api_apache_conf
|
|
sudo sed -e "
|
|
s|%FREEZER_API_PORT%|$FREEZER_API_PORT|g;
|
|
s|%SERVICE_HOST%|$SERVICE_HOST|g;
|
|
s|%USER%|$STACK_USER|g;
|
|
s|%FREEZER_API_DIR%|$FREEZER_API_DIR|g;
|
|
s|%APACHE_NAME%|$APACHE_NAME|g;
|
|
s|%VIRTUALENV%|$venv_path|g;
|
|
s|%LOCAL_LISTEN%|$local_listen|g
|
|
" -i $freezer_api_apache_conf
|
|
}
|
|
|
|
|
|
function configure_uwsgi_freezer_api_app {
|
|
|
|
local freezer_api_apache_conf=$(apache_site_config_for freezer-api)
|
|
|
|
# copy the uwsgi.conf to /etc/freezer/
|
|
sudo cp $FREEZER_API_DIR/etc/freezer/uwsgi.conf $FREEZER_API_UWSGI_CONF
|
|
|
|
local local_http="${SERVICE_HOST}:$FREEZER_API_PORT"
|
|
if [[ "${SERVICE_HOST}" == "127.0.0.1" ]] || [[ "${SERVICE_HOST}" == "localhost" ]]; then
|
|
local_http=":$FREEZER_API_PORT"
|
|
fi
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' http $local_http
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' processes 2
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' threads 2
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' wsgi freezer_api.wsgi:application
|
|
|
|
# Make sure the client doesn't try to re-use the connection.
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' add-header "Connection: close"
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' master true
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' socket /var/run/uwsgi/freezer-api-wsgi.socket
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' chmod-socket 666
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' lazy-apps true
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' enable-threads true
|
|
|
|
# Set die-on-term & exit-on-reload so that uwsgi shuts down
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' exit-on-reload true
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' die-on-term true
|
|
|
|
# uwsgi recommends this to prevent thundering herd on accept.
|
|
iniset $FREEZER_API_UWSGI_CONF 'uwsgi' thunder-lock true
|
|
|
|
# print the content of the uwsgi.conf after replacing values
|
|
cat $FREEZER_API_UWSGI_CONF
|
|
|
|
echo_summary "Configuring freezer-api uwsgi site"
|
|
|
|
sudo cp $FREEZER_API_FILES/apache2-freezer-api.conf $freezer_api_apache_conf
|
|
|
|
|
|
}
|
|
|
|
# Restore xtrace
|
|
$XTRACE
|