blob: 7d0a4fee200577a5f7b2edbb3b310a07678879dd [file] [log] [blame]
#!/usr/bin/env bash
# This script runs the balloon framework on a cluster using the cgroups
# isolator and checks that the framework returns a status of 1.
source ${MESOS_SOURCE_DIR}/support/colors.sh
source ${MESOS_SOURCE_DIR}/support/atexit.sh
source ${MESOS_HELPER_DIR}/colors.sh
source ${MESOS_HELPER_DIR}/atexit.sh
EXISTING_MEMORY_HIERARCHY=$(cat /proc/mounts | grep memory | cut -f 2 -d ' ')
if [[ -n ${EXISTING_MEMORY_HIERARCHY} ]]; then
# Strip off the subsystem component.
TEST_CGROUP_HIERARCHY=${EXISTING_MEMORY_HIERARCHY%/*}
else
TEST_CGROUP_HIERARCHY=/tmp/mesos_test_cgroup
fi
TEST_CGROUP_ROOT=mesos_test
# Check if the hierarchy exists. If it doesn't, we want to make sure we
# remove it, since we will create it.
unmount=false
if [[ ! -d ${TEST_CGROUP_HIERARCHY} ]]; then
unmount=true
fi
MASTER_PID=
AGENT_PID=
MESOS_WORK_DIR=
MESOS_RUNTIME_DIR=
# This function ensures that we first kill the agent (if present) and
# then cleanup the cgroups. This is necessary because a running agent
# holds an advisory lock that disallows cleaning up cgroups.
# This function is not pure, but depends on state from the environment
# (e.g. ${AGENT_PID}) because we do not all possible values about when we
# register with 'atexit'.
function cleanup() {
# Make sure we kill the master on exit.
if [[ ! -z ${MASTER_PID} ]]; then
kill ${MASTER_PID}
fi
# Make sure we kill the agent on exit.
if [[ ! -z ${AGENT_PID} ]]; then
kill ${AGENT_PID}
fi
# Make sure we cleanup any cgroups we created on exiting.
find ${TEST_CGROUP_HIERARCHY}/*/${TEST_CGROUP_ROOT} -mindepth 1 -depth -type d -exec rmdir '{}' \+
# Make sure we cleanup the hierarchy, if we created it.
# NOTE: We do a sleep here, to ensure the hierarchy is not busy.
if ${unmount}; then
rmdir ${TEST_CGROUP_HIERARCHY}/${TEST_CGROUP_ROOT} && sleep 1 && umount ${TEST_CGROUP_HIERARCHY} && rmdir ${TEST_CGROUP_HIERARCHY}
fi
if [[ -d "${MESOS_WORK_DIR}" ]]; then
rm -rf ${MESOS_WORK_DIR};
fi
if [[ -d "${MESOS_RUNTIME_DIR}" ]]; then
rm -rf ${MESOS_RUNTIME_DIR};
fi
}
atexit cleanup
export LD_LIBRARY_PATH=${MESOS_BUILD_DIR}/src/.libs
MASTER=${MESOS_SBIN_DIR}/mesos-master
AGENT=${MESOS_SBIN_DIR}/mesos-agent
BALLOON_FRAMEWORK=${MESOS_HELPER_DIR}/balloon-framework
# The mesos binaries expect MESOS_ prefixed environment variables
# to correspond to flags, so we unset these here.
unset MESOS_BUILD_DIR
unset MESOS_SOURCE_DIR
unset MESOS_HELPER_DIR
#unset MESOS_LAUNCHER_DIR # leave this so we can find mesos-fetcher.
unset MESOS_VERBOSE
MESOS_WORK_DIR=`mktemp -d -t mesos-XXXXXX`
MESOS_RUNTIME_DIR=`mktemp -d -t mesos-XXXXXX`
# Launch master.
${MASTER} \
--ip=127.0.0.1 \
--port=5432 \
--work_dir=${MESOS_WORK_DIR} &
MASTER_PID=${!}
echo "${GREEN}Launched master at ${MASTER_PID}${NORMAL}"
sleep 2
# Check the master is still running after 2 seconds.
kill -0 ${MASTER_PID} >/dev/null 2>&1
STATUS=${?}
if [[ ${STATUS} -ne 0 ]]; then
echo "${RED}Master crashed; failing test${NORMAL}"
exit 2
fi
EXECUTOR_ENVIRONMENT_VARIABLES="{\"LD_LIBRARY_PATH\":\"${LD_LIBRARY_PATH}\"}"
# Launch agent.
${AGENT} \
--work_dir=${MESOS_WORK_DIR} \
--runtime_dir=${MESOS_RUNTIME_DIR} \
--master=127.0.0.1:5432 \
--isolation=cgroups/mem \
--cgroups_hierarchy=${TEST_CGROUP_HIERARCHY} \
--cgroups_root=${TEST_CGROUP_ROOT} \
--executor_environment_variables=${EXECUTOR_ENVIRONMENT_VARIABLES} \
--resources="cpus:1;mem:96" &
AGENT_PID=${!}
echo "${GREEN}Launched agent at ${AGENT_PID}${NORMAL}"
sleep 2
# Check the agent is still running after 2 seconds.
kill -0 ${AGENT_PID} >/dev/null 2>&1
STATUS=${?}
if [[ ${STATUS} -ne 0 ]]; then
echo "${RED}Slave crashed; failing test${NORMAL}"
exit 2
fi
# The main event!
${BALLOON_FRAMEWORK} \
--master=127.0.0.1:5432 \
--task_memory_usage_limit=1024MB \
--task_memory=32MB
STATUS=${?}
# Make sure the balloon framework "failed".
if [[ ! ${STATUS} -eq 1 ]]; then
echo "${RED} Balloon framework returned ${STATUS} not 1${NORMAL}"
exit 1
fi
# And make sure the agent is still running!
kill -0 ${AGENT_PID} >/dev/null 2>&1
STATUS=${?}
if [[ ${STATUS} -ne 0 ]]; then
echo "${RED}Slave crashed; failing test${NORMAL}"
exit 2
fi
exit 0