
1.The passenv parsing requires the list to be comma-separated. Since the names are case-insensitive, duplicates are removed. 2.Update tox version and use py3 as the default runtime for tox, and make tox actually run the tests rather than just install the deps. 3.Fix following pylint error, "No name 'migration' in module 'oslo_db.sqlalchemy'" 4.Ignore base python conflict 5. Python 3.11 job runs on Debian and do not have mysql package available out of the box. So let's use mariadb for consistency 6. Migrates from sqlalchemy-migrate towards alembic Change-Id: I69d46d7f0f6b404262c5b7f633bd70e6d7d8d1bc
331 lines
10 KiB
Bash
331 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/*
|
|
|
|
# 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-file $FREEZER_API_DIR/freezer_api/cmd/wsgi.py
|
|
|
|
# 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
|