You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.5 KiB
146 lines
3.5 KiB
7 years ago
|
From 804b68824372f98e23b858f6284160c1f2b0e19f Mon Sep 17 00:00:00 2001
|
||
|
From: David Vossel <dvossel@redhat.com>
|
||
|
Date: Sat, 25 Oct 2014 20:54:14 -0400
|
||
|
Subject: [PATCH 2/2] High: docker: monitor_cmd option for executing status
|
||
|
script within container
|
||
|
|
||
|
---
|
||
|
heartbeat/docker | 76 +++++++++++++++++++++++++++++++++++++++++++++++++-------
|
||
|
1 file changed, 67 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/heartbeat/docker b/heartbeat/docker
|
||
|
index cdf4e82..929b26b 100755
|
||
|
--- a/heartbeat/docker
|
||
|
+++ b/heartbeat/docker
|
||
|
@@ -106,6 +106,20 @@ it has initialized.
|
||
|
<content type="string"/>
|
||
|
</parameter>
|
||
|
|
||
|
+<parameter name="monitor_cmd" required="0" unique="0">
|
||
|
+<longdesc lang="en">
|
||
|
+Specifiy the full path of a command to launch within the container to check
|
||
|
+the health of the container. This command must return 0 to indicate that
|
||
|
+the container is healthy. A non-zero return code will indicate that the
|
||
|
+container has failed and should be recovered.
|
||
|
+
|
||
|
+The command is executed using nsenter. In the future 'docker exec' will
|
||
|
+be used once it is more widely supported.
|
||
|
+</longdesc>
|
||
|
+<shortdesc lang="en">monitor command</shortdesc>
|
||
|
+<content type="string"/>
|
||
|
+</parameter>
|
||
|
+
|
||
|
<parameter name="force_kill" required="0" unique="0">
|
||
|
<longdesc lang="en">
|
||
|
Kill a container immediately rather than waiting for it to gracefully
|
||
|
@@ -150,6 +164,22 @@ Expects to have a fully populated OCF RA-compliant environment set.
|
||
|
END
|
||
|
}
|
||
|
|
||
|
+
|
||
|
+monitor_cmd_exec()
|
||
|
+{
|
||
|
+ local rc=$OCF_SUCCESS
|
||
|
+ if [ -n "$OCF_RESKEY_monitor_cmd" ]; then
|
||
|
+ out=$(echo "$OCF_RESKEY_monitor_cmd" | nsenter --target $(docker inspect --format {{.State.Pid}} ${CONTAINER}) --mount --uts --ipc --net --pid 2>&1)
|
||
|
+ rc=$?
|
||
|
+ if [ $rc -ne 0 ]; then
|
||
|
+ ocf_log info "monitor cmd failed with exit code $rc"
|
||
|
+ ocf_log info "stdout/stderr: $out"
|
||
|
+ rc=$OCF_ERR_GENERIC
|
||
|
+ fi
|
||
|
+ fi
|
||
|
+ return $rc
|
||
|
+}
|
||
|
+
|
||
|
container_exists()
|
||
|
{
|
||
|
docker inspect $CONTAINER > /dev/null 2>&1
|
||
|
@@ -171,7 +201,7 @@ remove_container()
|
||
|
ocf_run docker rm $CONTAINER
|
||
|
}
|
||
|
|
||
|
-docker_monitor()
|
||
|
+docker_simple_status()
|
||
|
{
|
||
|
local val
|
||
|
|
||
|
@@ -195,11 +225,25 @@ docker_monitor()
|
||
|
return $OCF_NOT_RUNNING
|
||
|
}
|
||
|
|
||
|
+docker_monitor()
|
||
|
+{
|
||
|
+ local rc=0
|
||
|
+
|
||
|
+ docker_simple_status
|
||
|
+ rc=$?
|
||
|
+
|
||
|
+ if [ $rc -ne 0 ]; then
|
||
|
+ return $rc
|
||
|
+ fi
|
||
|
+
|
||
|
+ monitor_cmd_exec
|
||
|
+}
|
||
|
+
|
||
|
docker_start()
|
||
|
{
|
||
|
local run_opts="-d --name=${CONTAINER}"
|
||
|
# check to see if the container has already started
|
||
|
- docker_monitor
|
||
|
+ docker_simple_status
|
||
|
if [ $? -eq $OCF_SUCCESS ]; then
|
||
|
return $OCF_SUCCESS
|
||
|
fi
|
||
|
@@ -233,19 +277,29 @@ docker_start()
|
||
|
return $OCF_ERR_GENERIC
|
||
|
fi
|
||
|
|
||
|
- docker_monitor
|
||
|
- if [ $? -ne $OCF_SUCCESS ]; then
|
||
|
- ocf_exit_reason "Newly created docker container exited after start"
|
||
|
- return $OCF_ERR_GENERIC
|
||
|
- fi
|
||
|
|
||
|
- return $OCF_SUCCESS
|
||
|
+ # wait for monitor to pass before declaring that the container is started
|
||
|
+ while true; do
|
||
|
+ docker_simple_status
|
||
|
+ if [ $? -ne $OCF_SUCCESS ]; then
|
||
|
+ ocf_exit_reason "Newly created docker container exited after start"
|
||
|
+ return $OCF_ERR_GENERIC
|
||
|
+ fi
|
||
|
+
|
||
|
+ monitor_cmd_exec
|
||
|
+ if [ $? -eq $OCF_SUCCESS ]; then
|
||
|
+ return $OCF_SUCCESS
|
||
|
+ fi
|
||
|
+
|
||
|
+ ocf_exit_reason "waiting on monitor_cmd to pass after start"
|
||
|
+ sleep 1
|
||
|
+ done
|
||
|
}
|
||
|
|
||
|
docker_stop()
|
||
|
{
|
||
|
local timeout=60
|
||
|
- docker_monitor
|
||
|
+ docker_simple_status
|
||
|
if [ $? -eq $OCF_NOT_RUNNING ]; then
|
||
|
remove_container
|
||
|
return $OCF_SUCCESS
|
||
|
@@ -310,6 +364,10 @@ docker_validate()
|
||
|
exit $OCF_ERR_CONFIGURED
|
||
|
fi
|
||
|
|
||
|
+ if [ -n "$OCF_RESKEY_monitor_cmd" ]; then
|
||
|
+ check_binary nsenter
|
||
|
+ fi
|
||
|
+
|
||
|
image_exists
|
||
|
if [ $? -ne 0 ]; then
|
||
|
ocf_exit_reason "base image, ${OCF_RESKEY_image}, could not be found."
|
||
|
--
|
||
|
1.8.4.2
|
||
|
|