ironic-prometheus-exporter/devstack/plugin.sh
Julia Kreger 6a7bb474b0 devstack: fix plugin for local usage
The wsgi webserver used by the test, which is *not* a hard
requirement for the software's usage, is gunicorn, which is
not present by default unless something has already
installed it. It is in OpenStack's requirements, so it is
not impossible.

Regardless, install so the devstack plugin "just works"
when run locally on a clean/new VM.

Change-Id: I8a379aa7ca94c27211aebee77dfefc742c3f1223
2023-01-05 08:13:05 -08:00

121 lines
4.8 KiB
Bash

#!/usr/bin/env bash
# plugin.sh - DevStack plugin.sh dispatch script template
IRONIC_PROMETHEUS_EXPORTER_DIR=${IRONIC_PROMETHEUS_EXPORTER_DIR:-$DEST/ironic-prometheus-exporter}
IRONIC_PROMETHEUS_EXPORTER_PORT=${IRONIC_PROMETHEUS_EXPORTER_PORT:-9608}
IRONIC_PROMETHEUS_EXPORTER_DATA_DIR=""$DATA_DIR/ironic-prometheus-exporter""
IRONIC_PROMETHEUS_EXPORTER_SYSTEMD_SERVICE="devstack@ironic-prometheus-exporter.service"
# Location where the metrics from the baremetal nodes will be stored
IRONIC_PROMETHEUS_EXPORTER_LOCATION=${IRONIC_PROMETHEUS_EXPORTER_LOCATION:-$IRONIC_VM_LOG_DIR}
COLLECT_DATA_UNDEPLOYED_NODES=$(trueorfalse True COLLECT_DATA_UNDEPLOYED_NODES)
IRONIC_CONFIG=${IRONIC_CONFIG:-$IRONIC_CONF_FILE}
IPE_ACCESS_LF="$IRONIC_VM_LOG_DIR/ipe_access.log"
IPE_ERROR_LF="$IRONIC_VM_LOG_DIR/ipe_errors.log"
function install_ironic_prometheus_exporter {
git_clone_by_name "ironic-prometheus-exporter"
# NOTE(TheJulia): Version and use requirement is not established
# for gunicorn. It just so happens to be what the CI job uses,
# and is not an operational requirement.
pip_install gunicorn
setup_dev_lib "ironic-prometheus-exporter"
}
function configure_ironic_prometheus_exporter {
# Update ironic configuration file to use the exporter
iniset $IRONIC_CONF_FILE conductor send_sensor_data true
iniset $IRONIC_CONF_FILE conductor send_sensor_data_for_undeployed_nodes $COLLECT_DATA_UNDEPLOYED_NODES
iniset $IRONIC_CONF_FILE conductor send_sensor_data_interval 90
iniset $IRONIC_CONF_FILE oslo_messaging_notifications driver prometheus_exporter
iniset $IRONIC_CONF_FILE oslo_messaging_notifications transport_url fake://
iniset $IRONIC_CONF_FILE oslo_messaging_notifications location $IRONIC_PROMETHEUS_EXPORTER_LOCATION
local gunicorn_ipe_cmd
gunicorn_ipe_cmd=$(which gunicorn)
gunicorn_ipe_cmd+=" -b ${HOST_IP}:${IRONIC_PROMETHEUS_EXPORTER_PORT}"
gunicorn_ipe_cmd+=" --env IRONIC_CONFIG=$IRONIC_CONFIG"
gunicorn_ipe_cmd+=" --env FLASK_DEBUG=1 -w 4"
gunicorn_ipe_cmd+=" --access-logfile=$IPE_ACCESS_LF --error-logfile=$IPE_ERROR_LF"
gunicorn_ipe_cmd+=" -D ironic_prometheus_exporter.app.wsgi:application"
write_user_unit_file $IRONIC_PROMETHEUS_EXPORTER_SYSTEMD_SERVICE "$gunicorn_ipe_cmd" "" "$STACK_USER"
enable_service $IRONIC_PROMETHEUS_EXPORTER_SYSTEMD_SERVICE
}
function start_ironic_prometheus_exporter {
start_service $IRONIC_PROMETHEUS_EXPORTER_SYSTEMD_SERVICE
}
function stop_ironic_prometheus_exporter {
stop_service $IRONIC_PROMETHEUS_EXPORTER_SYSTEMD_SERVICE
}
function cleanup_ironic_prometheus_exporter {
stop_ironic_prometheus_exporter
disable_service $IRONIC_PROMETHEUS_EXPORTER_SYSTEMD_SERVICE
sudo rm -rf $IRONIC_PROMETHEUS_EXPORTER_DATA_DIR
local unitfile="$SYSTEMD_DIR/$IRONIC_PROMETHEUS_EXPORTER_SYSTEMD_SERVICE"
sudo rm -f $unitfile
$SYSTEMCTL daemon-reload
}
function wait_for_data {
# Sleep for more than the [conductor]send_sensor_data_interval value
# to verify if we can get data from the baremetal
# FIXME(iurygregory): Add some logic to verify if the data already exists
sleep 240
}
function check_data {
local node_file="node-0-hardware.redfish.metrics"
if [ -f "$IRONIC_PROMETHEUS_EXPORTER_LOCATION/$node_file" ]; then
echo "Found $node_file in $IRONIC_PROMETHEUS_EXPORTER_LOCATION"
if curl -s --head --request GET "http://$HOST_IP:$IRONIC_PROMETHEUS_EXPORTER_PORT/metrics" | grep "200 OK" > /dev/null; then
echo "Data successfully retrived from ironic-prometheus-exporter application"
else
die $LINENO "Couldn't get data from ironic-prometheus-exporter application"
fi
else
die $LINENO "Couldn't find $node_file in $IRONIC_PROMETHEUS_EXPORTER_LOCATION"
fi
}
echo_summary "ironic-prometheus-exporter devstack plugin.sh called: $1/$2"
if is_service_enabled ironic-prometheus-exporter; then
if [[ "$1" == "stack" ]]; then
case "$2" in
install)
echo_summary "Installing Ironic Prometheus Exporter"
install_ironic_prometheus_exporter
;;
post-config)
echo_summary "Configuring Ironic Prometheus Exporter Application"
configure_ironic_prometheus_exporter
;;
extra)
echo_summary "Starting Ironic Prometheus Exporter Application"
start_ironic_prometheus_exporter
echo_summary "Give time to baremetal to provide data"
wait_for_data
check_data
;;
esac
fi
if [[ "$1" == "unstack" ]]; then
echo_summary "Stopping Ironic Prometheus Exporter Application"
stop_ironic_prometheus_exporter
echo_summary "Cleaning Ironic Prometheus Exporter"
cleanup_ironic_prometheus_exporter
fi
fi