Slawek Kaplonski 310eddd59b Always create keystone admin endpoint when tobiko is used
Tobiko requires keystone admin endpoint to be created. It was disabled
to be created by default in Devstack by [1].
This patch forces this option to be enabled when tobiko is going to be
installed by devstack.

[1] b538b3267c

Change-Id: I62a25e3de2db8b0aab42eac34bc881822177db15
2023-04-03 09:58:16 +02:00

271 lines
8.2 KiB
Bash

# Directory where this plugin.sh file is
TOBIKO_PLUGIN_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# NOTE(slaweq): Tobiko requires admin endpoint for keystone to be enabled,
# creation of such endpoint was disabled by default with:
# https://github.com/openstack/devstack/commit/b538b3267cec11f0b345ce101607bbd36ada8f32
# so let's enable it always when Tobiko is installed
KEYSTONE_ADMIN_ENDPOINT=True
function install_tobiko_deps {
install_python3
git_clone "${TOBIKO_REPO}" "${TOBIKO_DIR}" "${TOBIKO_VERSION}"
install_bindep "${TOBIKO_DIR}/bindep.txt" test
pip_install 'tox>=3.8.0'
}
function configure_libguestfs_tools {
local target_path
if is_ubuntu; then
target_path=/boot/vmlinuz-`uname -r`
if ! dpkg-statoverride --list "${target_path}"; then
sudo dpkg-statoverride --update --add root root 0644 \
"${target_path}"
fi
fi
}
function configure_tobiko {
# Ensure any user can write to log file
local log_dir
log_dir=$(dirname ${TOBIKO_LOG_FILE})
if ! [ -d "${log_dir}" ]; then
sudo mkdir -p "${log_dir}"
fi
if ! [ -w "${TOBIKO_LOG_FILE}" ]; then
sudo touch "${TOBIKO_LOG_FILE}"
sudo chmod ugo+rw "${TOBIKO_LOG_FILE}"
fi
# Write configuration to a new temporary file
local tobiko_conf_file
tobiko_conf_file=$(mktemp)
if [ -f "${TOBIKO_CONF_FILE}" ]; then
# Start from existing tobiko.conf file
cp "${TOBIKO_CONF_FILE}" "${tobiko_conf_file}"
fi
configure_tobiko_default "${tobiko_conf_file}"
configure_tobiko_cirros "${tobiko_conf_file}"
configure_tobiko_glance "${tobiko_conf_file}"
configure_tobiko_keystone "${tobiko_conf_file}"
configure_tobiko_nova "${tobiko_conf_file}"
configure_tobiko_neutron "${tobiko_conf_file}"
configure_tobiko_ssh "${tobiko_conf_file}"
configure_tobiko_tripleo "${tobiko_conf_file}"
echo_summary "Apply changes to actual ${TOBIKO_CONF_FILE} file."
sudo mkdir -p $(dirname "${TOBIKO_CONF_FILE}")
sudo mv "${tobiko_conf_file}" "${TOBIKO_CONF_FILE}"
sudo chmod ugo+r "${TOBIKO_CONF_FILE}"
echo "${TOBIKO_CONF_FILE} file content:"
echo --------------------------------
cat "${TOBIKO_CONF_FILE}"
echo --------------------------------
}
function configure_tobiko_cirros {
echo_summary "Write [cirros] section to ${TOBIKO_CONF_FILE}"
local tobiko_conf_file=$1
iniset_nonempty "${tobiko_conf_file}" cirros name \
"${TOBIKO_CIRROS_IMAGE_NAME}"
iniset_nonempty "${tobiko_conf_file}" cirros url \
"${TOBIKO_CIRROS_IMAGE_URL}"
iniset_nonempty "${tobiko_conf_file}" cirros file \
"${TOBIKO_CIRROS_IMAGE_FILE}"
iniset_nonempty "${tobiko_conf_file}" cirros username \
"${TOBIKO_CIRROS_USERNAME}"
iniset_nonempty "${tobiko_conf_file}" cirros password \
"${TOBIKO_CIRROS_PASSWORD}"
}
function configure_tobiko_default {
echo_summary "Write [DEFAULT] section to ${TOBIKO_CONF_FILE}"
local tobiko_conf_file=$1
setup_logging "${tobiko_conf_file}"
iniset ${tobiko_conf_file} DEFAULT debug "${TOBIKO_DEBUG}"
iniset ${tobiko_conf_file} DEFAULT log_dir $(dirname "${TOBIKO_LOG_FILE}")
iniset ${tobiko_conf_file} DEFAULT log_file \
$(basename "${TOBIKO_LOG_FILE}")
}
function configure_tobiko_glance {
echo_summary "Write [glance] section to ${TOBIKO_CONF_FILE}"
local tobiko_conf_file=$1
iniset_nonempty "${tobiko_conf_file}" glance image_dir \
"${TOBIKO_GLANCE_IMAGE_DIR}"
ensure_boot_files_permissions
}
function ensure_boot_files_permissions {
if [ -f /boot/vmlinuz ]; then
sudo chmod ugo+r /boot/vmlinuz
fi
}
function configure_tobiko_keystone {
echo_summary "Write [keystone] section to ${TOBIKO_CONF_FILE}"
local tobiko_conf_file=$1
local api_version=${IDENTITY_API_VERSION}
if [ "${api_version}" == '2' ]; then
local auth_url=${KEYSTONE_AUTH_URI/v2.0}
else
local auth_url=${KEYSTONE_AUTH_URI_V3:-${KEYSTONE_AUTH_URI/v3}}
fi
local project_id
project_id=$(get_or_create_project \
"${TOBIKO_KEYSTONE_PROJECT_NAME}" \
"${TOBIKO_KEYSTONE_PROJECT_DOMAIN_NAME}")
local user_id
user_id=$(get_or_create_user \
"${TOBIKO_KEYSTONE_USERNAME}" \
"${TOBIKO_KEYSTONE_PASSWORD}" \
"${TOBIKO_KEYSTONE_USER_DOMAIN_NAME}")
local user_project_role_id
user_project_role_id=$(get_or_add_user_project_role \
"${TOBIKO_KEYSTONE_USER_ROLE}" \
"${user_id}" \
"${project_id}")
local user_domain_role_id
user_domain_role_id=$(get_or_add_user_domain_role \
"${TOBIKO_KEYSTONE_USER_ROLE}" \
"${user_id}" \
"${TOBIKO_KEYSTONE_USER_DOMAIN_NAME}")
iniset "${tobiko_conf_file}" keystone cloud_name \
"${TOBIKO_KEYSTONE_CLOUD_NAME}"
iniset "${tobiko_conf_file}" keystone api_version "${api_version}"
iniset "${tobiko_conf_file}" keystone auth_url "${auth_url}"
iniset "${tobiko_conf_file}" keystone username \
"${TOBIKO_KEYSTONE_USERNAME}"
iniset "${tobiko_conf_file}" keystone password \
"${TOBIKO_KEYSTONE_PASSWORD}"
iniset "${tobiko_conf_file}" keystone project_name \
"${TOBIKO_KEYSTONE_PROJECT_NAME}"
if [ "${api_version}" != '2' ]; then
iniset "${tobiko_conf_file}" keystone domain_name \
"${TOBIKO_KEYSTONE_DOMAIN_NAME}"
iniset "${tobiko_conf_file}" keystone user_domain_name \
"${TOBIKO_KEYSTONE_USER_DOMAIN_NAME}"
iniset "${tobiko_conf_file}" keystone project_domain_name \
"${TOBIKO_KEYSTONE_PROJECT_DOMAIN_NAME}"
iniset "${tobiko_conf_file}" keystone trust_id \
"${TOBIKO_KEYSTONE_TRUST_ID}"
fi
}
function configure_tobiko_nova {
echo_summary "Write [nova] section to ${TOBIKO_CONF_FILE}"
local tobiko_conf_file=$1
(
cd $(dirname "${tobiko_conf_file}")
configure_key_file "${tobiko_conf_file}" nova key_file \
"${TOBIKO_NOVA_KEY_FILE}"
)
}
function configure_tobiko_neutron {
echo_summary "Write [neutron] section to ${TOBIKO_CONF_FILE}"
local tobiko_conf_file=$1
iniset_nonempty "${tobiko_conf_file}" neutron external_network \
"${TOBIKO_NEUTRON_EXTERNAL_NETWORK}"
iniset_nonempty "${tobiko_conf_file}" neutron floating_network \
"${TOBIKO_NEUTRON_FLOATING_NETWORK}"
iniset_nonempty "${tobiko_conf_file}" neutron ipv4_dns_nameservers \
"${TOBIKO_NEUTRON_IPV4_DNS_NAMESERVERS}"
iniset_nonempty "${tobiko_conf_file}" neutron ipv6_dns_nameservers \
"${TOBIKO_NEUTRON_IPV6_DNS_NAMESERVERS}"
}
function configure_tobiko_ssh {
echo_summary "Write [ssh] section to ${TOBIKO_CONF_FILE}"
local tobiko_conf_file=$1
(
cd $(dirname "${tobiko_conf_file}")
configure_key_file "${tobiko_conf_file}" ssh key_file \
"${TOBIKO_SSH_KEY_FILE}"
)
}
function configure_tobiko_tripleo {
echo_summary "Write [tripleo] section to ${TOBIKO_CONF_FILE}"
local tobiko_conf_file=$1
# Ensure Tobiko will skip looking for the undercloud node
iniset "${tobiko_conf_file}" tripleo undercloud_ssh_hostname ""
}
function configure_key_file {
local tobiko_conf_file=$1
ensure_key_file "${key_file}"
iniset_nonempty "$@"
}
function ensure_key_file {
local key_file=${1:-~/.ssh/id_rsa}
# Ensure key file exists
if ! [ -r "${key_file}" ]; then
mkdir -p $(dirname "${key_file}")
ssh-keygen -f "${key_file}" -N ""
fi
# Ensure Tobiko can SSH localhost using key file
local pub_key
pub_key=$(cat "${key_file}.pub")
if ! grep "${pub_key}" ~/.ssh/authorized_keys; then
cat "${key_file}.pub" >> ~/.ssh/authorized_keys
fi
chmod 600 "${key_file}" "${key_file}.pub" ~/.ssh/authorized_keys
}
function iniset_nonempty {
# Calls iniset only when option value is not an empty string
if [ -n "$4" ]; then
iniset "$@"
fi
}
if [[ "$1" == "stack" ]]; then
case "$2" in
install)
echo_summary "Installing Tobiko dependencies"
install_tobiko_deps
configure_libguestfs_tools
;;
test-config)
echo_summary "Configuring Tobiko test cases"
configure_tobiko
;;
esac
fi