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.
145 lines
3.5 KiB
145 lines
3.5 KiB
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 |
|
|
|
|