#!/bin/bash # # SPDX-License-Identifier: Apache-2.0 # # Copyright (C) 2019 Intel Corporation # # lib/fault # Functions to control the configuration and operation of the **fault** service # Dependencies: # # - The update plugin must be enabled # ``stack.sh`` calls the entry points in this order: # # - install_fault # - configure_fault # - init_fault # - start_fault # - stop_fault # - cleanup_fault _XTRACE_STX_FAULT=$(set +o | grep xtrace) set -o xtrace # Defaults # -------- STX_FAULT_DIR=${GITDIR[$STX_FAULT_NAME]} STX_FAULT_CONF_DIR=/etc/fm FM_RESTAPI_CONF=$STX_FAULT_CONF_DIR/fm.conf FM_RESTAPI_PASTE_INI=$STX_FAULT_CONF_DIR/api-paste.ini FM_EVENT_YAML=$STX_FAULT_CONF_DIR/events.yaml FM_RESTAPI_AUTH_CACHE_DIR=${FM_RESTAPI_AUTH_CACHE_DIR:-/var/cache/fault} FM_RESTAPI_DIR=$STX_FAULT_DIR/fm-rest-api/fm if is_service_enabled tls-proxy; then FM_RESTAPI_SERVICE_PROTOCOL="https" fi FM_RESTAPI_SERVICE_PROTOCOL=${FM_RESTAPI_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL} FM_RESTAPI_SERVICE_HOST=${FM_RESTAPI_SERVICE_HOST:-$SERVICE_HOST} FM_RESTAPI_SERVICE_PORT=${FM_RESTAPI_SERVICE_PORT:-18002} FM_RESTAPI_WORKERS=${FM_RESTAPI_WORKERS:-4} # STX_INST_DIR should be a non-root-writable place to install build artifacts STX_INST_DIR=${STX_INST_DIR:-/usr/local} STX_BIN_DIR=${STX_BIN_DIR:-$STX_INST_DIR/bin} STX_SBIN_DIR=${STX_SBIN_DIR:-$STX_INST_DIR/sbin} # Set up so we don't use sudo for installs when not necessary STX_SUDO="sudo" [[ -w $STX_INST_DIR ]] && STX_SUDO="env" PYTHON_SITE_DIR=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") # Functions # --------- function build_fm_common { pushd $STX_FAULT_DIR/fm-common/sources local major minor version x if [[ -z $1 || -z $2 ]]; then # get fm-common version read x version <<< $(grep '^Version: ' $STX_FAULT_DIR/fm-common/PKG-INFO) major=${version%%.*} minor=${version##*.} else major=$1 minor=$2 fi # build make MAJOR=$major MINOR=$minor python setup.py build popd } function build_fm_mgr { pushd $STX_FAULT_DIR/fm-mgr/sources local x version local major minor version x if [[ -z $1 || -z $2 ]]; then # get fm-mgr version read x version <<< $(grep '^Version: ' $STX_FAULT_DIR/fm-mgr/PKG-INFO) local major=${version%%.*} local minor=${version##*.} else major=$1 minor=$2 fi # build CPATH=$STX_INST_DIR/include LIBRARY_PATH=$STX_INST_DIR/lib make \ MAJOR=$major \ MINOR=$minor popd } function cleanup_fault { stop_fault if is_service_enabled fm-client || is_service_enabled fm-common; then cleanup_fm_client fi if is_service_enabled fm-api; then cleanup_fm_api fi if is_service_enabled fm-mgr; then cleanup_fm_mgr fi if is_service_enabled fm-rest-api; then cleanup_fm_rest_api fi if is_service_enabled fm-common; then cleanup_fm_common fi } function cleanup_fm_api { sudo pip uninstall -y fm_api } function cleanup_fm_client { sudo pip uninstall -y fmclient } function cleanup_fm_common { local x version # get fm-common version read x version <<< $(grep '^Version: ' $STX_FAULT_DIR/fm-common/PKG-INFO) local major=${version%%.*} local minor=${version##*.} sudo rm /etc/ld.so.conf.d/stx-fault.conf sudo pip uninstall -y fm-core pushd $STX_FAULT_DIR/fm-common/sources $STX_SUDO make \ DESTDIR=$STX_INST_DIR \ BINDIR=/bin \ LIBDIR=/lib \ INCDIR=/include \ MAJOR=$major \ MINOR=$minor \ clean $STX_SUDO rm $STX_BIN_DIR/fm_db_sync_event_suppression.py \ $STX_INST_DIR/include/fmConfig.h \ $STX_INST_DIR/include/fmLog.h popd } function cleanup_fm_mgr { local x version # get fm-mgr version read x version <<< $(grep '^Version: ' $STX_FAULT_DIR/fm-mgr/PKG-INFO) local major=${version%%.*} local minor=${version##*.} pushd $STX_FAULT_DIR/fm-mgr/sources $STX_SUDO make \ DESTDIR=$STX_INST_DIR \ BINDIR=/bin \ MAJOR=$major \ MINOR=$minor \ clean popd } function cleanup_fm_rest_api { sudo pip uninstall -y fm sudo rm -rf $FM_RESTAPI_AUTH_CACHE_DIR $FM_RESTAPI_CONF $FM_RESTAPI_PASTE_INI $FM_EVENT_YAML dropdb -h 127.0.0.1 -Uroot fm } function configure_fault { if is_service_enabled fm-mgr || is_service_enabled fm-rest-api; then configure_fm_rest_api create_fault_user_group create_fault_accounts fi } function configure_fm_rest_api { sudo install -d -o $STACK_USER -m 755 $STX_FAULT_CONF_DIR cp -p $STX_FAULT_DIR/devstack/files/api-paste.ini $FM_RESTAPI_PASTE_INI cp -p $STX_FAULT_DIR/fm-doc/fm_doc/events.yaml $FM_EVENT_YAML configure_auth_token_middleware $FM_RESTAPI_CONF fm $FM_RESTAPI_AUTH_CACHE_DIR iniset $FM_RESTAPI_CONF database connection $(database_connection_url fm) iniset $FM_RESTAPI_CONF api api_paste_config $FM_RESTAPI_PASTE_INI iniset $FM_RESTAPI_CONF api api_workers $FM_RESTAPI_WORKERS iniset $FM_RESTAPI_CONF api bind_host $FM_RESTAPI_SERVICE_HOST iniset $FM_RESTAPI_CONF api bind_port $FM_RESTAPI_SERVICE_PORT iniset $FM_RESTAPI_CONF oslo_middleware enable_proxy_headers_parsing True if [ "$SYSLOG" != "False" ]; then iniset $FM_RESTAPI_CONF DEFAULT use_syslog True # stx specific? iniset $FM_RESTAPI_CONF DEFAULT syslog_log_facility local2 fi # Additional things set in stx config iniset $FM_RESTAPI_CONF DEFAULT region_name RegionOne iniset $FM_RESTAPI_CONF DEFAULT event_log_max_size 4000 iniset $FM_RESTAPI_CONF DEFAULT system_name $(hostname) iniset $FM_RESTAPI_CONF DEFAULT sql_connection $(database_connection_url fm) iniset $FM_RESTAPI_CONF database idle_timeout 60 iniset $FM_RESTAPI_CONF database max_pool_size 1 iniset $FM_RESTAPI_CONF database max_overflow 20 iniset $FM_RESTAPI_CONF keystone_authtoken region_name RegionOne # sysinv settings to move there... iniset $FM_RESTAPI_CONF sysinv catalog_info platform:sysinv:internalURL iniset $FM_RESTAPI_CONF sysinv os_region_name RegionOne } function create_fault_accounts { create_service_user "fm" get_or_create_service "fm" "faultmanagement" "Fault Management Service" get_or_create_endpoint \ "faultmanagement" \ "$REGION_NAME" \ "$FM_RESTAPI_SERVICE_PROTOCOL://$FM_RESTAPI_SERVICE_HOST:$FM_RESTAPI_SERVICE_PORT/v1" } function create_fault_cache_dir { # Create cache dir sudo install -d -o $STACK_USER $FM_RESTAPI_AUTH_CACHE_DIR rm -f $FM_RESTAPI_AUTH_CACHE_DIR/* } function create_fault_user_group { : } function init_fault { create_fault_cache_dir if is_service_enabled fm-rest-api && is_service_enabled config; then init_rest_api fi } function init_rest_api { # create db for fm createdb -h 127.0.0.1 -Uroot -l C -T template0 -E utf8 fm fm-dbsync --config-file $FM_RESTAPI_CONF } function install_fault { if is_service_enabled fm-common; then install_fm_common fi if is_service_enabled fm-client || is_service_enabled fm-common; then install_fm_client fi if is_service_enabled fm-api; then install_fm_api fi if is_service_enabled fm-mgr; then install_fm_mgr fi if is_service_enabled fm-rest-api && is_service_enabled config; then install_fm_rest_api fi } function install_fm_api { pushd $STX_FAULT_DIR/fm-api sudo python setup.py install \ --root=/ \ --install-lib=$PYTHON_SITE_DIR \ --prefix=/usr \ --install-data=/usr/share \ --single-version-externally-managed popd } function install_fm_client { pushd $STX_FAULT_DIR/python-fmclient/fmclient sudo python setup.py install \ --root=/ \ --install-lib=$PYTHON_SITE_DIR \ --prefix=/usr \ --install-data=/usr/share \ --single-version-externally-managed popd } function install_fm_common { pushd $STX_FAULT_DIR/fm-common/sources local major minor version x # get fm-common version read x version <<< $(grep '^Version: ' $STX_FAULT_DIR/fm-common/PKG-INFO) major=${version%%.*} minor=${version##*.} build_fm_common $major $minor # install to STX_INST_DIR # Note that DESTDIR prefixes the other locations in the Makefile $STX_SUDO make \ DESTDIR=$STX_INST_DIR \ BINDIR=/bin \ LIBDIR=/lib \ INCDIR=/include \ MAJOR=$major \ MINOR=$minor \ install sudo python setup.py install \ --root=/ \ --install-lib=$PYTHON_SITE_DIR \ --prefix=/usr \ --install-data=/usr/share \ # This _is_ still a little nasty, clean it up $STX_SUDO install -m 755 fm_db_sync_event_suppression.py \ $STX_BIN_DIR/fm_db_sync_event_suppression.py # install the headers that used by fm-mgr package $STX_SUDO install -m 644 -p -D fmConfig.h $STX_INST_DIR/include/fmConfig.h $STX_SUDO install -m 644 -p -D fmLog.h $STX_INST_DIR/include/fmLog.h # Make sure we can find it later # TODO: this should be managed better echo $STX_INST_DIR/lib | sudo tee /etc/ld.so.conf.d/stx-fault.conf sudo ldconfig # in fm-common/sources/fmMsgServer.cpp,requst get "getaddrinfo(host.c_str()," # hostname "controller" ip, so change hosname to controller ADD_LINE="$HOST_IP controller" grep "$ADD_LINE" /etc/hosts || sudo sed -i "/127.0.0.1 */a$ADD_LINE" /etc/hosts popd } function install_fm_mgr { pushd $STX_FAULT_DIR/fm-mgr/sources local major minor version x # get fm-mgr version read x version <<< $(grep '^Version: ' $STX_FAULT_DIR/fm-mgr/PKG-INFO) major=${version%%.*} minor=${version##*.} build_fm_mgr $major $minor # install to STX_INST_DIR # Note that DESTDIR prefixes the other locations in the Makefile $STX_SUDO make \ DESTDIR=$STX_INST_DIR \ BINDIR=/bin \ MAJOR=$major \ MINOR=$minor \ install popd } function install_fm_rest_api { setup_develop $FM_RESTAPI_DIR } function start_fault { if is_service_enabled fm-rest-api; then run_process fm-rest-api "$STX_BIN_DIR/fm-api --config-file $FM_RESTAPI_CONF" fi if is_service_enabled fm-mgr; then run_process fm-mgr "$STX_BIN_DIR/fmManager start -c $FM_RESTAPI_CONF" fi } function stop_fault { if is_service_enabled fm-rest-api; then stop_process fm-rest-api fi if is_service_enabled fm-mgr; then stop_process fm-mgr fi } $_XTRACE_STX_FAULT