f628ca0055
As part of Train community goal 'Support IPv6-Only Deployments and Testing'[1], we need to define the integration job which deploy services on IPv6 and perform testing to make sure service listen and communicate over IPv6 properly. Vitrage has legacy zuul jobs only so base zuulv3 IPv6 job 'devstack-ipv6' and 'devstack-tempest-ipv6' cannot be used and we have to copy the whole run.yaml to set the IPv6 setting and run the IPv6 verification script via post_test_hook. This commit adds the new job 'vitrage-dsvm-api-ipv6-only' run on gate and set the required IPv6 setting'. Story: #2005477 Task: #35938 [1] https://governance.openstack.org/tc/goals/train/ipv6-support-and-testing.html Depends-On: https://review.opendev.org/#/c/701105/ Change-Id: I343b5ad52b0c70da94d94898b9de201fffe6ce6b
392 lines
13 KiB
Bash
392 lines
13 KiB
Bash
# Install and start **Vitrage** service in devstack
|
|
#
|
|
# To enable vitrage behavior add an entry to local.conf that
|
|
# looks like
|
|
#
|
|
# [[local|localrc]]
|
|
# enable_plugin vitrage https://opendev.org/openstack/vitrage
|
|
#
|
|
# By default all vitrage services are started (see
|
|
# devstack/settings).
|
|
#
|
|
|
|
# Defaults
|
|
# --------
|
|
GITDIR["python-vitrageclient"]=$DEST/python-vitrageclient
|
|
GITREPO["python-vitrageclient"]=${VITRAGECLIENT_REPO:-${GIT_BASE}/openstack/python-vitrageclient.git}
|
|
GITBRANCH["vitrage"]=${VITRAGE_BRANCH:-$TARGET_BRANCH}
|
|
GITBRANCH["python-vitrageclient"]=${VITRAGECLIENT_BRANCH:-$TARGET_BRANCH}
|
|
|
|
# Support potential entry-points console scripts in VENV or not
|
|
if [[ ${USE_VENV} = True ]]; then
|
|
PROJECT_VENV["vitrage"]=${VITRAGE_DIR}.venv
|
|
VITRAGE_BIN_DIR=${PROJECT_VENV["vitrage"]}/bin
|
|
else
|
|
VITRAGE_BIN_DIR=$(get_python_exec_prefix)
|
|
fi
|
|
|
|
# VITRAGE_DEPLOY defines how vitrage is deployed, allowed values:
|
|
# - mod_wsgi : Run vitrage under Apache HTTPd mod_wsgi
|
|
# - uwsgi : Run vitrage under uwsgi
|
|
if [[ "$WSGI_MODE" == "uwsgi" ]]; then
|
|
VITRAGE_DEPLOY=${VITRAGE_DEPLOY:-uwsgi}
|
|
else
|
|
VITRAGE_DEPLOY=${VITRAGE_DEPLOY:-mod_wsgi}
|
|
fi
|
|
|
|
# Test if any Vitrage services are enabled
|
|
# is_vitrage_enabled
|
|
function is_vitrage_enabled {
|
|
[[ ,${ENABLED_SERVICES} =~ ,"vitrage-" ]] && return 0
|
|
return 1
|
|
}
|
|
|
|
function vitrage_service_url {
|
|
if [[ "$VITRAGE_DEPLOY" == "mod_wsgi" ]]; then
|
|
echo "$VITRAGE_SERVICE_PROTOCOL://$VITRAGE_SERVICE_HOST:$VITRAGE_SERVICE_PORT"
|
|
else
|
|
echo "$VITRAGE_SERVICE_PROTOCOL://$VITRAGE_SERVICE_HOST/rca"
|
|
fi
|
|
}
|
|
|
|
|
|
# Configure mod_wsgi
|
|
function _vitrage_config_apache_wsgi {
|
|
sudo mkdir -p $VITRAGE_WSGI_DIR
|
|
|
|
local vitrage_apache_conf=$(apache_site_config_for vitrage)
|
|
local venv_path=""
|
|
|
|
# Copy proxy vhost and wsgi file
|
|
sudo cp $VITRAGE_DIR/vitrage/api/app.wsgi $VITRAGE_WSGI_DIR/app
|
|
|
|
if [[ ${USE_VENV} = True ]]; then
|
|
venv_path="python-path=${PROJECT_VENV["vitrage"]}/lib/$(python_version)/site-packages"
|
|
fi
|
|
|
|
sudo cp $VITRAGE_DIR/devstack/apache-vitrage.template $vitrage_apache_conf
|
|
|
|
sudo sed -e "
|
|
s|%PORT%|$VITRAGE_SERVICE_PORT|g;
|
|
s|%APACHE_NAME%|$APACHE_NAME|g;
|
|
s|%WSGIAPP%|$VITRAGE_WSGI_DIR/app|g;
|
|
s|%USER%|$STACK_USER|g;
|
|
s|%APIWORKERS%|$API_WORKERS|g;
|
|
s|%VIRTUALENV%|$venv_path|g
|
|
" -i $vitrage_apache_conf
|
|
}
|
|
|
|
|
|
# Create vitrage related accounts in Keystone
|
|
function _vitrage_create_accounts {
|
|
if is_service_enabled vitrage-api; then
|
|
|
|
get_or_create_user "vitrage" "$ADMIN_PASSWORD" "$ADMIN_DOMAIN_NAME"
|
|
get_or_add_user_project_role "admin" "vitrage" "$SERVICE_PROJECT_NAME" "$SERVICE_DOMAIN_NAME" "$SERVICE_DOMAIN_NAME"
|
|
get_or_add_user_project_role "admin" "vitrage" "admin" "$ADMIN_DOMAIN_NAME" "$ADMIN_DOMAIN_NAME"
|
|
|
|
local vitrage_service=$(get_or_create_service "vitrage" \
|
|
"rca" "Root Cause Analysis Service")
|
|
get_or_create_endpoint $vitrage_service \
|
|
"$REGION_NAME" \
|
|
"$(vitrage_service_url)" \
|
|
"$(vitrage_service_url)" \
|
|
"$(vitrage_service_url)"
|
|
fi
|
|
}
|
|
|
|
# Activities to do before vitrage has been installed.
|
|
function preinstall_vitrage {
|
|
# Nothing for now
|
|
:
|
|
}
|
|
|
|
# Remove WSGI files, disable and remove Apache vhost file
|
|
function _vitrage_cleanup_apache_wsgi {
|
|
sudo rm -f $VITRAGE_WSGI_DIR/*
|
|
sudo rm -f $(apache_site_config_for vitrage)
|
|
}
|
|
|
|
# cleanup_vitrage() - Remove residual data files, anything left over
|
|
# from previous runs that a clean run would need to clean up
|
|
function cleanup_vitrage {
|
|
if [[ "$VITRAGE_DEPLOY" == "mod_wsgi" ]]; then
|
|
_vitrage_cleanup_apache_wsgi
|
|
else
|
|
remove_uwsgi_config "$VITRAGE_UWSGI_FILE" "$VITRAGE_PUBLIC_UWSGI"
|
|
fi
|
|
|
|
# delete all vitrage configurations
|
|
sudo rm -rf /etc/vitrage/*
|
|
}
|
|
|
|
function disable_vitrage_datasource {
|
|
|
|
local enabled_datasources=",${VITRAGE_DEFAULT_DATASOURCES},"
|
|
local datasource
|
|
for datasource in $@; do
|
|
enabled_datasources=${enabled_datasources//,$datasource,/,}
|
|
done
|
|
VITRAGE_DEFAULT_DATASOURCES=$(_cleanup_service_list "$enabled_datasources")
|
|
|
|
}
|
|
|
|
# Set configuration for database backend.
|
|
function vitrage_configure_db_backend {
|
|
if [[ "$VITRAGE_DATABASE" = 'mysql' ]] || [[ "$VITRAGE_DATABASE" = 'postgresql' ]] ; then
|
|
iniset $VITRAGE_CONF database connection $(database_connection_url vitrage)
|
|
else
|
|
die $LINENO "Unable to configure unknown VITRAGE_DATABASE $VITRAGE_DATABASE"
|
|
fi
|
|
}
|
|
|
|
# Configure Vitrage
|
|
function configure_vitrage {
|
|
iniset_rpc_backend vitrage $VITRAGE_CONF
|
|
|
|
iniset $VITRAGE_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
|
|
|
|
# Set up logging
|
|
if [[ "$SYSLOG" != "False" ]]; then
|
|
iniset $VITRAGE_CONF DEFAULT use_syslog "True"
|
|
fi
|
|
|
|
# Format logging
|
|
setup_logging $VITRAGE_CONF
|
|
|
|
cp $VITRAGE_DIR/etc/vitrage/api-paste.ini $VITRAGE_CONF_DIR
|
|
|
|
# Service credentials - openstack clients using keystone
|
|
iniset $VITRAGE_CONF service_credentials auth_type password
|
|
iniset $VITRAGE_CONF service_credentials username vitrage
|
|
iniset $VITRAGE_CONF service_credentials user_domain_id default
|
|
iniset $VITRAGE_CONF service_credentials project_domain_id default
|
|
iniset $VITRAGE_CONF service_credentials password $ADMIN_PASSWORD
|
|
iniset $VITRAGE_CONF service_credentials project_name admin
|
|
iniset $VITRAGE_CONF service_credentials region_name $REGION_NAME
|
|
iniset $VITRAGE_CONF service_credentials auth_url $KEYSTONE_SERVICE_URI
|
|
|
|
# Configured db
|
|
vitrage_configure_db_backend
|
|
|
|
# remove neutron vitrage datasource if neutron datasource not installed
|
|
if ! is_service_enabled neutron; then
|
|
disable_vitrage_datasource neutron.network neutron.port
|
|
fi
|
|
|
|
# remove aodh vitrage datasource if aodh datasource not installed
|
|
if ! is_service_enabled aodh; then
|
|
disable_vitrage_datasource aodh
|
|
fi
|
|
|
|
# remove heat vitrage datasource if heat datasource not installed
|
|
if ! is_service_enabled heat; then
|
|
disable_vitrage_datasource heat.stack
|
|
fi
|
|
|
|
# remove trove vitrage datasource if trove datasource not installed
|
|
if ! is_service_enabled trove; then
|
|
disable_vitrage_datasource trove.instance trove.cluster
|
|
fi
|
|
|
|
# remove monasca vitrage datasource if nagios datasource not installed
|
|
if ! is_service_enabled monasca; then
|
|
disable_vitrage_datasource monasca
|
|
fi
|
|
|
|
# remove nagios vitrage datasource if nagios datasource not installed
|
|
if [[ "$VITRAGE_USE_NAGIOS" == "False" ]]; then
|
|
disable_vitrage_datasource nagios
|
|
fi
|
|
|
|
# remove static vitrage datasource if it's not enabled
|
|
if [[ "$VITRAGE_USE_STATIC" == "False" ]]; then
|
|
disable_vitrage_datasource static
|
|
fi
|
|
|
|
# remove doctor vitrage datasource if it's not enabled
|
|
if [[ "$VITRAGE_USE_DOCTOR" == "False" ]]; then
|
|
disable_vitrage_datasource doctor
|
|
fi
|
|
|
|
# remove prometheus vitrage datasource if it's not enabled
|
|
if [[ "$VITRAGE_USE_PROMETHEUS" == "False" ]]; then
|
|
disable_vitrage_datasource prometheus
|
|
fi
|
|
|
|
# add default datasources
|
|
iniset $VITRAGE_CONF datasources types $VITRAGE_DEFAULT_DATASOURCES
|
|
|
|
# create some folders
|
|
mkdir -p $VITRAGE_CONF_DIR/datasources_values
|
|
mkdir -p $VITRAGE_CONF_DIR/static_datasources
|
|
|
|
# copy datasources
|
|
cp $VITRAGE_DIR/etc/vitrage/datasources_values/*.yaml $VITRAGE_CONF_DIR/datasources_values
|
|
|
|
configure_auth_token_middleware $VITRAGE_CONF vitrage $VITRAGE_AUTH_CACHE_DIR
|
|
|
|
iniset $VITRAGE_CONF "keystone_authtoken" password $ADMIN_PASSWORD
|
|
iniset $VITRAGE_CONF "keystone_authtoken" user_domain_name $admin_domain_name
|
|
iniset $VITRAGE_CONF "keystone_authtoken" project_name $admin_project_name
|
|
iniset $VITRAGE_CONF "keystone_authtoken" project_domain_name $admin_domain_name
|
|
|
|
if [[ "$VITRAGE_DEPLOY" == "mod_wsgi" ]]; then
|
|
_vitrage_config_apache_wsgi
|
|
else
|
|
write_uwsgi_config "$VITRAGE_UWSGI_FILE" "$VITRAGE_PUBLIC_UWSGI" "/rca"
|
|
fi
|
|
|
|
if [[ ! -z "$VITRAGE_COORDINATION_URL" ]]; then
|
|
iniset $VITRAGE_CONF coordination backend_url "$VITRAGE_COORDINATION_URL"
|
|
elif is_service_enabled etcd3; then
|
|
iniset $VITRAGE_CONF coordination backend_url "etcd3+http://${SERVICE_HOST}:$ETCD_PORT"
|
|
fi
|
|
}
|
|
|
|
# init_vitrage() - Initialize etc.
|
|
function init_vitrage {
|
|
# Get vitrage keystone settings in place
|
|
_vitrage_create_accounts
|
|
|
|
# Create and upgrade database only when used
|
|
if is_service_enabled mysql postgresql; then
|
|
if [[ "$VITRAGE_DATABASE" = 'mysql' ]] || [[ "$VITRAGE_DATABASE" = 'postgresql' ]] ; then
|
|
recreate_database vitrage
|
|
$VITRAGE_BIN_DIR/vitrage-dbsync
|
|
fi
|
|
fi
|
|
# Create cache dir
|
|
sudo install -d -o $STACK_USER $VITRAGE_AUTH_CACHE_DIR
|
|
rm -f $VITRAGE_AUTH_CACHE_DIR/*
|
|
|
|
}
|
|
|
|
# Install Vitrage.
|
|
function install_vitrage {
|
|
install_vitrageclient
|
|
setup_develop "$VITRAGE_DIR"
|
|
sudo install -d -o $STACK_USER -m 755 $VITRAGE_CONF_DIR
|
|
|
|
if [[ "$VITRAGE_DEPLOY" == "mod_wsgi" ]]; then
|
|
install_apache_wsgi
|
|
elif [[ "$VITRAGE_DEPLOY" == "uwsgi" ]]; then
|
|
pip_install uwsgi
|
|
fi
|
|
}
|
|
|
|
# install_vitrageclient()
|
|
function install_vitrageclient {
|
|
if use_library_from_git "python-vitrageclient"; then
|
|
git_clone_by_name "python-vitrageclient"
|
|
setup_dev_lib "python-vitrageclient"
|
|
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-vitrageclient"]}/tools/,/etc/bash_completion.d/}vitrage.bash_completion
|
|
else
|
|
pip_install_gr python-vitrageclient
|
|
fi
|
|
}
|
|
|
|
# start_vitrage() - Start running processes
|
|
function start_vitrage {
|
|
if [[ "$VITRAGE_DEPLOY" == "mod_wsgi" ]]; then
|
|
enable_apache_site vitrage
|
|
restart_apache_server
|
|
elif [[ "$VITRAGE_DEPLOY" == "uwsgi" ]]; then
|
|
run_process vitrage-api "$VITRAGE_BIN_DIR/uwsgi --procname-prefix vitrage --ini $VITRAGE_UWSGI_FILE" ""
|
|
else
|
|
run_process vitrage-api "$VITRAGE_BIN_DIR/vitrage-api -d -v --config-file $VITRAGE_CONF"
|
|
fi
|
|
|
|
# Only die on API if it was actually intended to be turned on
|
|
if is_service_enabled vitrage-api; then
|
|
echo "Waiting for vitrage-api to start..."
|
|
if ! wait_for_service $SERVICE_TIMEOUT $(vitrage_service_url)/v1/; then
|
|
die $LINENO "vitrage-api did not start"
|
|
fi
|
|
fi
|
|
|
|
run_process vitrage-graph "$VITRAGE_BIN_DIR/vitrage-graph --config-file $VITRAGE_CONF"
|
|
run_process vitrage-notifier "$VITRAGE_BIN_DIR/vitrage-notifier --config-file $VITRAGE_CONF"
|
|
run_process vitrage-ml "$VITRAGE_BIN_DIR/vitrage-ml --config-file $VITRAGE_CONF"
|
|
run_process vitrage-persistor "$VITRAGE_BIN_DIR/vitrage-persistor --config-file $VITRAGE_CONF"
|
|
run_process vitrage-snmp-parsing "$VITRAGE_BIN_DIR/vitrage-snmp-parsing --config-file $VITRAGE_CONF"
|
|
|
|
|
|
change_systemd_kill_mode vitrage-graph
|
|
}
|
|
|
|
|
|
function change_systemd_kill_mode {
|
|
local service=$1
|
|
local systemd_service="devstack@$service.service"
|
|
local unitfile="$SYSTEMD_DIR/$systemd_service"
|
|
|
|
iniset -sudo $unitfile "Service" "KillMode" "control-group"
|
|
|
|
$SYSTEMCTL daemon-reload
|
|
}
|
|
|
|
# stop_vitrage() - Stop running processes
|
|
function stop_vitrage {
|
|
if [[ "$VITRAGE_DEPLOY" == "mod_wsgi" ]]; then
|
|
disable_apache_site vitrage
|
|
restart_apache_server
|
|
fi
|
|
for serv in vitrage-api vitrage-graph vitrage-notifier vitrage-persistor vitrage-ml vitrage-snmp-parsing; do
|
|
stop_process $serv
|
|
done
|
|
}
|
|
|
|
function modify_heat_global_index_policy_rule {
|
|
if is_service_enabled heat; then
|
|
local heat_policy=/etc/heat/policy.yaml
|
|
touch $heat_policy
|
|
# List stacks globally.
|
|
# GET /v1/{tenant_id}/stacks
|
|
echo '"stacks:global_index": "rule:deny_stack_user"' >> $heat_policy
|
|
fi
|
|
}
|
|
|
|
function add_monasca_rule_to_vitrage {
|
|
if is_service_enabled monasca; then
|
|
get_or_add_user_project_role "monasca-read-only-user" "vitrage" "admin"
|
|
fi
|
|
}
|
|
|
|
# This is the main for plugin.sh
|
|
if is_service_enabled vitrage; then
|
|
if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then
|
|
# Set up other services
|
|
echo_summary "Configuring system services for Vitrage"
|
|
preinstall_vitrage
|
|
elif [[ "$1" == "stack" && "$2" == "install" ]]; then
|
|
echo_summary "Installing Vitrage"
|
|
# Use stack_install_service here to account for virtualenv
|
|
stack_install_service vitrage
|
|
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
|
|
echo_summary "Configuring Vitrage"
|
|
configure_vitrage
|
|
elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
|
|
echo_summary "Initializing Vitrage"
|
|
# enable global index
|
|
modify_heat_global_index_policy_rule
|
|
# Tidy base for vitrage
|
|
init_vitrage
|
|
# add monasca-read-only-user role to vitrage user so
|
|
# vitrage user can read monasca alarms
|
|
add_monasca_rule_to_vitrage
|
|
# Start the services
|
|
start_vitrage
|
|
fi
|
|
|
|
if [[ "$1" == "unstack" ]]; then
|
|
echo_summary "Shutting Down Vitrage"
|
|
stop_vitrage
|
|
fi
|
|
|
|
if [[ "$1" == "clean" ]]; then
|
|
echo_summary "Cleaning Vitrage"
|
|
cleanup_vitrage
|
|
fi
|
|
fi
|