OpenSearch/qa/os/bats/utils/plugins.bash
Ryan Ernst 4af6d86c01
Rename vagrant project to os (#45509) (#45530)
The system level tests for our distributions have historically be run in
vagrant, and thus the name of the gradle project has been "vagrant".
However, as we move to running these tests in other environments (eg
GCP) the name vagrant no longer makes sense. This commit renames the
project to "os" (short for operating system), since these tests ensure
all of our distributions run correctly on our supported operating
systems.
2019-08-14 10:30:41 -07:00

190 lines
7.2 KiB
Bash

#!/bin/bash
# This file contains some utilities to test the elasticsearch
# plugin installation and uninstallation process.
# WARNING: This testing file must be executed as root and can
# dramatically change your system. It should only be executed
# in a throw-away VM like those made by the Vagrantfile at
# the root of the Elasticsearch source code. This should
# cause the script to fail if it is executed any other way:
[ -f /etc/is_vagrant_vm ] || {
>&2 echo "must be run on a vagrant VM"
exit 1
}
# Licensed to Elasticsearch under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch licenses this file to you 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 a plugin
install_plugin() {
local name=$1
local path="$2"
local umask="$3"
assert_file_exist "$path"
if [ ! -z "$ES_PATH_CONF" ] ; then
if is_dpkg; then
echo "ES_PATH_CONF=$ES_PATH_CONF" >> /etc/default/elasticsearch;
elif is_rpm; then
echo "ES_PATH_CONF=$ES_PATH_CONF" >> /etc/sysconfig/elasticsearch;
fi
fi
if [ -z "$umask" ]; then
sudo -E -u $ESPLUGIN_COMMAND_USER "$ESHOME/bin/elasticsearch-plugin" install --batch "file://$path"
else
sudo -E -u $ESPLUGIN_COMMAND_USER bash -c "umask $umask && \"$ESHOME/bin/elasticsearch-plugin\" install --batch \"file://$path\""
fi
#check we did not accidentially create a log file as root as /usr/share/elasticsearch
assert_file_not_exist "/usr/share/elasticsearch/logs"
# At some point installing or removing plugins caused elasticsearch's logs
# to be owned by root. This is bad so we want to make sure it doesn't
# happen.
if [ -e "$ESLOG" ] && [ $(stat "$ESLOG" --format "%U") == "root" ]; then
echo "$ESLOG is now owned by root! That'll break logging when elasticsearch tries to start."
false
fi
}
# Remove a plugin and make sure its plugin directory is removed.
remove_plugin() {
local name=$1
echo "Removing $name...."
sudo -E -u $ESPLUGIN_COMMAND_USER "$ESHOME/bin/elasticsearch-plugin" remove $name
assert_file_not_exist "$ESPLUGINS/$name"
# At some point installing or removing plugins caused elasticsearch's logs
# to be owned by root. This is bad so we want to make sure it doesn't
# happen.
if [ -e "$ESLOG" ] && [ $(stat "$ESLOG" --format "%U") == "root" ]; then
echo "$ESLOG is now owned by root! That'll break logging when elasticsearch tries to start."
false
fi
}
# Install a sample plugin which fully exercises the special case file placements.
install_plugin_example() {
local relativePath=${1:-$(readlink -m $BATS_PLUGINS/custom-settings-*.zip)}
install_plugin custom-settings "$relativePath" $2
bin_user=$(find "$ESHOME/bin" -maxdepth 0 -printf "%u")
bin_owner=$(find "$ESHOME/bin" -maxdepth 0 -printf "%g")
assert_file "$ESHOME/plugins/custom-settings" d $bin_user $bin_owner 755
assert_file "$ESHOME/plugins/custom-settings/custom-settings-$(cat version).jar" f $bin_user $bin_owner 644
#owner group and permissions vary depending on how es was installed
#just make sure that everything is the same as the parent bin dir, which was properly set up during install
assert_file "$ESHOME/bin/custom-settings" d $bin_user $bin_owner 755
assert_file "$ESHOME/bin/custom-settings/test" f $bin_user $bin_owner 755
#owner group and permissions vary depending on how es was installed
#just make sure that everything is the same as $CONFIG_DIR, which was properly set up during install
config_user=$(find "$ESCONFIG" -maxdepth 0 -printf "%u")
config_owner=$(find "$ESCONFIG" -maxdepth 0 -printf "%g")
# directories should user the user file-creation mask
assert_file "$ESCONFIG/custom-settings" d $config_user $config_owner 750
assert_file "$ESCONFIG/custom-settings/custom.yml" f $config_user $config_owner 660
run sudo -E -u vagrant LANG="en_US.UTF-8" cat "$ESCONFIG/custom-settings/custom.yml"
[ $status = 1 ]
[[ "$output" == *"Permission denied"* ]] || {
echo "Expected permission denied but found $output:"
false
}
echo "Running sample plugin bin script...."
"$ESHOME/bin/custom-settings/test" | grep test
}
# Remove the sample plugin which fully exercises the special cases of
# removing bin and not removing config.
remove_plugin_example() {
remove_plugin custom-settings
assert_file_not_exist "$ESHOME/bin/custom-settings"
assert_file_exist "$ESCONFIG/custom-settings"
assert_file_exist "$ESCONFIG/custom-settings/custom.yml"
}
# Install a plugin with a special prefix. For the most part prefixes are just
# useful for grouping but the "analysis" prefix is special because all
# analysis plugins come with a corresponding lucene-analyzers jar.
# $1 - the prefix
# $2 - the plugin name
# $@ - all remaining arguments are jars that must exist in the plugin's
# installation directory
install_and_check_plugin() {
local prefix=$1
shift
local name=$1
shift
if [ "$prefix" == "-" ]; then
local full_name="$name"
else
local full_name="$prefix-$name"
fi
install_plugin $full_name "$(readlink -m $BATS_PLUGINS/$full_name-*.zip)"
assert_module_or_plugin_directory "$ESPLUGINS/$full_name"
assert_file_exist "$ESPLUGINS/$full_name/plugin-descriptor.properties"
assert_file_exist "$ESPLUGINS/$full_name/$full_name"*".jar"
# analysis plugins have a corresponding analyzers jar
if [ $prefix == 'analysis' ]; then
local analyzer_jar_suffix=$name
# the name of the analyzer jar for the ukrainian plugin does
# not match the name of the plugin, so we have to make an
# exception
if [ $name == 'ukrainian' ]; then
analyzer_jar_suffix='morfologik'
fi
assert_module_or_plugin_file "$ESPLUGINS/$full_name/lucene-analyzers-$analyzer_jar_suffix-*.jar"
fi
for file in "$@"; do
assert_module_or_plugin_file "$ESPLUGINS/$full_name/$file"
done
}
# Install a meta plugin
# $1 - the plugin name
# $@ - all remaining arguments are jars that must exist in the plugin's
# installation directory
install_meta_plugin() {
local name=$1
install_plugin $name "$(readlink -m $BATS_PLUGINS/$name-*.zip)"
assert_module_or_plugin_directory "$ESPLUGINS/$name"
}
# Compare a list of plugin names to the plugins in the plugins pom and see if they are the same
# $1 the file containing the list of plugins we want to compare to
# $2 description of the source of the plugin list
compare_plugins_list() {
cat $1 | sort > /tmp/plugins
echo "Checking plugins from $2 (<) against expected plugins (>):"
diff -w /elasticsearch/qa/vagrant/build/plugins/expected /tmp/plugins
}