| #!/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 |