OpenSearch/qa/os/bats/oss/70_sysv_initd.bats

193 lines
6.3 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env bats
# This file is used to test the elasticsearch init.d scripts.
# 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
}
# The test case can be executed with the Bash Automated
# Testing System tool available at https://github.com/sstephenson/bats
# Thanks to Sam Stephenson!
# 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.
# Load test utilities
Add Vagrant Gradle plugin This commit changes the current :elactisearch:qa:vagrant build file and transforms it into a Gradle plugin in order to reuse it in other projects. Most of the code from the build.gradle file has been moved into the VagrantTestPlugin class. To avoid duplicated VMs when running vagrant tests, the Gradle plugin sets the following environment variables before running vagrant commands: VAGRANT_CWD: absolute path to the folder that contains the Vagrantfile VAGRANT_PROJECT_DIR: absolute path to the Gradle project that use the VagrantTestPlugin The VAGRANT_PROJECT_DIR is used to share project folders and files with the vagrant VM. These folders and files are exported when running the task `gradle vagrantSetUp` which: - collects all project archives dependencies and copies them into `${project.buildDir}/bats/archives` - copy all project bats testing files from 'src/test/resources/packaging/tests' into `${project.buildDir}/bats/tests` - copy all project bats utils files from 'src/test/resources/packaging/utils' into `${project.buildDir}/bats/utils` It is also possible to inherit and grab the archives/tests/utils files from project dependencies using the plugin configuration: apply plugin: 'elasticsearch.vagrant' esvagrant { inheritTestUtils true|false inheritTestArchives true|false inheritTests true|false } dependencies { // Inherit Bats test utils from :qa:vagrant project bats project(path: ':qa:vagrant', configuration: 'bats') } The folders `${project.buildDir}/bats/archives`, `${project.buildDir}/bats/tests` and `${project.buildDir}/bats/utils` are then exported to the vagrant VMs and mapped to the BATS_ARCHIVES, BATS_TESTS and BATS_UTILS environnement variables. The following Gradle tasks have also be renamed: * gradle vagrantSetUp This task copies all the necessary files to the project build directory (was `prepareTestRoot`) * gradle vagrantSmokeTest This task starts the VMs and echoes a "Hello world" within each VM (was: `smokeTest`)
2016-10-19 04:01:13 -04:00
load $BATS_UTILS/utils.bash
load $BATS_UTILS/packages.bash
load $BATS_UTILS/plugins.bash
# Cleans everything for the 1st execution
setup() {
skip_not_sysvinit
skip_not_dpkg_or_rpm
export_elasticsearch_paths
}
@test "[INIT.D] remove any leftover configuration to start elasticsearch on restart" {
# This configuration can be added with a command like:
# $ sudo update-rc.d elasticsearch defaults 95 10
# but we want to test that the RPM and deb _don't_ add it on its own.
# Note that it'd be incorrect to use:
# $ sudo update-rc.d elasticsearch disable
# here because that'd prevent elasticsearch from installing the symlinks
# that cause it to be started on restart.
sudo update-rc.d -f elasticsearch remove || true
sudo chkconfig elasticsearch off || true
}
@test "[INIT.D] install elasticsearch" {
clean_before_test
install_package
}
@test "[INIT.D] elasticsearch fails if startup script is not executable" {
local INIT="/etc/init.d/elasticsearch"
local DAEMON="$ESHOME/bin/elasticsearch"
sudo chmod -x "$DAEMON"
run "$INIT"
sudo chmod +x "$DAEMON"
[ "$status" -eq 1 ]
[[ "$output" == *"The elasticsearch startup script does not exists or it is not executable, tried: $DAEMON"* ]]
}
@test "[INIT.D] daemon isn't enabled on restart" {
# Rather than restart the VM which would be slow we check for the symlinks
# that init.d uses to restart the application on startup.
! find /etc/rc[0123456].d | grep elasticsearch
# Note that we don't use -iname above because that'd have to look like:
# [ $(find /etc/rc[0123456].d -iname "elasticsearch*" | wc -l) -eq 0 ]
# Which isn't really clearer than what we do use.
}
@test "[INIT.D] start" {
service elasticsearch start
wait_for_elasticsearch_status
assert_file_exist "/var/run/elasticsearch/elasticsearch.pid"
}
@test "[INIT.D] status (running)" {
service elasticsearch status
}
##################################
# Check that Elasticsearch is working
##################################
@test "[INIT.D] test elasticsearch" {
run_elasticsearch_tests
}
@test "[INIT.D] restart" {
service elasticsearch restart
wait_for_elasticsearch_status
service elasticsearch status
}
@test "[INIT.D] stop (running)" {
service elasticsearch stop
}
@test "[INIT.D] status (stopped)" {
run service elasticsearch status
# precise returns 4, trusty 3
[ "$status" -eq 3 ] || [ "$status" -eq 4 ]
}
@test "[INIT.D] start Elasticsearch with custom JVM options" {
assert_file_exist $ESENVFILE
local temp=`mktemp -d`
cp "$ESCONFIG"/elasticsearch.yml "$temp"
cp "$ESCONFIG"/log4j2.properties "$temp"
touch "$temp/jvm.options"
chown -R elasticsearch:elasticsearch "$temp"
echo "-Xms512m" >> "$temp/jvm.options"
echo "-Xmx512m" >> "$temp/jvm.options"
# we have to disable Log4j from using JMX lest it will hit a security
# manager exception before we have configured logging; this will fail
# startup since we detect usages of logging before it is configured
echo "-Dlog4j2.disable.jmx=true" >> "$temp/jvm.options"
cp $ESENVFILE "$temp/elasticsearch"
echo "ES_PATH_CONF=\"$temp\"" >> $ESENVFILE
echo "ES_JAVA_OPTS=\"-XX:-UseCompressedOops\"" >> $ESENVFILE
service elasticsearch start
wait_for_elasticsearch_status
curl -s -XGET localhost:9200/_nodes | fgrep '"heap_init_in_bytes":536870912'
curl -s -XGET localhost:9200/_nodes | fgrep '"using_compressed_ordinary_object_pointers":"false"'
service elasticsearch stop
cp "$temp/elasticsearch" $ESENVFILE
}
# Simulates the behavior of a system restart:
# the PID directory is deleted by the operating system
# but it should not block ES from starting
# see https://github.com/elastic/elasticsearch/issues/11594
@test "[INIT.D] delete PID_DIR and restart" {
rm -rf /var/run/elasticsearch
service elasticsearch start
wait_for_elasticsearch_status
assert_file_exist "/var/run/elasticsearch/elasticsearch.pid"
service elasticsearch stop
}
@test "[INIT.D] GC logs exist" {
start_elasticsearch_service
assert_file_exist /var/log/elasticsearch/gc.log.0.current
stop_elasticsearch_service
}
# Ensures that if $MAX_MAP_COUNT is less than the set value on the OS
# it will be updated
@test "[INIT.D] sysctl is run when the value set is too small" {
# intentionally a ridiculously low number
sysctl -q -w vm.max_map_count=100
start_elasticsearch_service
max_map_count=$(sysctl -n vm.max_map_count)
stop_elasticsearch_service
[ $max_map_count = 262144 ]
}
# Ensures that if $MAX_MAP_COUNT is greater than the set vaule on the OS
# we do not attempt to update it.
@test "[INIT.D] sysctl is not run when it already has a larger or equal value set" {
# intentionally set to the default +1
sysctl -q -w vm.max_map_count=262145
start_elasticsearch_service
max_map_count=$(sysctl -n vm.max_map_count)
stop_elasticsearch_service
# default value +1
[ $max_map_count = 262145 ]
}