Files
freezer-api/devstack/lib/freezer-api
suzhengwei 72907fa5cd CI fix
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
2024-05-02 09:56:50 +02:00

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