|
1 | 1 | #!/bin/bash
|
2 | 2 |
|
| 3 | +probe_name="lifecycle.${1:-"preStop"}" |
| 4 | + |
| 5 | +max_time=3 |
| 6 | + |
| 7 | +ID=$(echo $RANDOM) |
| 8 | +tmp_node_file="/tmp/nodeProbe${ID}" |
| 9 | + |
3 | 10 | function on_exit() {
|
4 |
| - rm -rf /tmp/preStopOutput |
| 11 | + rm -rf ${tmp_node_file} |
5 | 12 | }
|
6 | 13 | trap on_exit EXIT
|
7 | 14 |
|
| 15 | +function init_file() { |
| 16 | + echo "{}" > ${tmp_node_file} |
| 17 | +} |
| 18 | +init_file |
| 19 | + |
8 | 20 | # Set headers if Node Registration Secret is set
|
9 |
| -if [ ! -z "${SE_REGISTRATION_SECRET}" ]; |
10 |
| -then |
| 21 | +if [ ! -z "${SE_REGISTRATION_SECRET}" ]; then |
11 | 22 | HEADERS="X-REGISTRATION-SECRET: ${SE_REGISTRATION_SECRET}"
|
12 | 23 | else
|
13 | 24 | HEADERS="X-REGISTRATION-SECRET;"
|
|
16 | 27 | function is_full_distributed_mode() {
|
17 | 28 | if [ -n "${SE_DISTRIBUTOR_HOST}" ] && [ -n "${SE_DISTRIBUTOR_PORT}" ]; then
|
18 | 29 | DISTRIBUTED_MODE=true
|
19 |
| - echo "Detected full distributed mode: ${DISTRIBUTED_MODE}. Since SE_DISTRIBUTOR_HOST and SE_DISTRIBUTOR_PORT are set in Node ConfigMap" |
| 30 | + echo "$(date +%FT%T%Z) [${probe_name}] - Detected full distributed mode: ${DISTRIBUTED_MODE}. Since SE_DISTRIBUTOR_HOST and SE_DISTRIBUTOR_PORT are set in Node ConfigMap" |
20 | 31 | else
|
21 | 32 | DISTRIBUTED_MODE=false
|
22 |
| - echo "Detected full distributed mode: ${DISTRIBUTED_MODE}" |
| 33 | + echo "$(date +%FT%T%Z) [${probe_name}] - Detected full distributed mode: ${DISTRIBUTED_MODE}" |
23 | 34 | fi
|
24 | 35 | }
|
25 | 36 | is_full_distributed_mode
|
26 | 37 |
|
| 38 | +function get_grid_url() { |
| 39 | + if [ -z "${SE_HUB_HOST:-$SE_ROUTER_HOST}" ] || [ -z "${SE_HUB_PORT:-$SE_ROUTER_PORT}" ]; then |
| 40 | + echo "$(date +%FT%T%Z) [${probe_name}] - There is no configured HUB or ROUTER host. preStop ignores to send drain request to upstream." |
| 41 | + grid_url="" |
| 42 | + fi |
| 43 | + if [ -n "${SE_BASIC_AUTH}" ] && [ "${SE_BASIC_AUTH}" != "*@" ]; then |
| 44 | + SE_BASIC_AUTH="${SE_BASIC_AUTH}@" |
| 45 | + fi |
| 46 | + if [ "${SE_SUB_PATH}" = "/" ]; then |
| 47 | + SE_SUB_PATH="" |
| 48 | + fi |
| 49 | + grid_url=${SE_SERVER_PROTOCOL}://${SE_BASIC_AUTH}${SE_HUB_HOST:-$SE_ROUTER_HOST}:${SE_HUB_PORT:-$SE_ROUTER_PORT}${SE_SUB_PATH} |
| 50 | + grid_url_checks=$(curl -m ${max_time} -s -o /dev/null -w "%{http_code}" ${grid_url}) |
| 51 | + if [ "${grid_url_checks}" = "401" ]; then |
| 52 | + echo "$(date +%FT%T%Z) [${probe_name}] - Host requires Basic Auth. Please add the credentials to the SE_BASIC_AUTH variable (e.g: user:password). preStop ignores to send drain request to upstream." |
| 53 | + grid_url="" |
| 54 | + fi |
| 55 | + if [ "${grid_url_checks}" = "404" ]; then |
| 56 | + echo "$(date +%FT%T%Z) [${probe_name}] - The Grid is not available or it might have /subPath configured. Please wait a moment or check the SE_SUB_PATH variable if needed." |
| 57 | + fi |
| 58 | +} |
| 59 | + |
27 | 60 | function signal_distributor_to_drain_node() {
|
28 | 61 | if [ "${DISTRIBUTED_MODE}" = true ]; then
|
29 |
| - echo "Signaling Distributor to drain node" |
30 |
| - set -x |
31 |
| - curl -k -X POST ${SE_SERVER_PROTOCOL}://${SE_DISTRIBUTOR_HOST}:${SE_DISTRIBUTOR_PORT}/se/grid/distributor/node/${NODE_ID}/drain --header "${HEADERS}" |
32 |
| - set +x |
| 62 | + echo "$(date +%FT%T%Z) [${probe_name}] - Signaling Distributor to drain node" |
| 63 | + curl -m ${max_time} -k -X POST ${SE_SERVER_PROTOCOL}://${SE_DISTRIBUTOR_HOST}:${SE_DISTRIBUTOR_PORT}/se/grid/distributor/node/${NODE_ID}/drain --header "${HEADERS}" |
33 | 64 | fi
|
34 | 65 | }
|
35 | 66 |
|
36 | 67 | function signal_hub_to_drain_node() {
|
37 | 68 | if [ "${DISTRIBUTED_MODE}" = false ]; then
|
38 |
| - echo "Signaling Hub to drain node" |
39 |
| - curl -k -X POST ${SE_GRID_URL}/se/grid/distributor/node/${NODE_ID}/drain --header "${HEADERS}" |
| 69 | + get_grid_url |
| 70 | + if [ -n "${grid_url}" ]; then |
| 71 | + echo "$(date +%FT%T%Z) [${probe_name}] - Signaling Hub to drain node" |
| 72 | + curl -m ${max_time} -k -X POST ${grid_url}/se/grid/distributor/node/${NODE_ID}/drain --header "${HEADERS}" |
| 73 | + fi |
40 | 74 | fi
|
41 | 75 | }
|
42 | 76 |
|
43 | 77 | function signal_node_to_drain() {
|
44 |
| - echo "Signaling Node to drain itself" |
45 |
| - curl -k -X POST ${SE_SERVER_PROTOCOL}://127.0.0.1:${SE_NODE_PORT}/se/grid/node/drain --header "${HEADERS}" |
| 78 | + echo "$(date +%FT%T%Z) [${probe_name}] - Signaling Node to drain itself" |
| 79 | + curl -m ${max_time} -k -X POST ${SE_SERVER_PROTOCOL}://127.0.0.1:${SE_NODE_PORT}/se/grid/node/drain --header "${HEADERS}" |
46 | 80 | }
|
47 | 81 |
|
48 |
| -function replace_localhost_by_service_name() { |
49 |
| - internal="${SE_HUB_HOST:-$SE_ROUTER_HOST}:${SE_HUB_PORT:-$SE_ROUTER_PORT}" |
50 |
| - echo "SE_NODE_GRID_URL: ${SE_NODE_GRID_URL}" |
51 |
| - if [[ "${SE_NODE_GRID_URL}" == *"/localhost"* ]]; then |
52 |
| - SE_GRID_URL=${SE_NODE_GRID_URL//localhost/${internal}} |
53 |
| - elif [[ "${SE_NODE_GRID_URL}" == *"/127.0.0.1"* ]]; then |
54 |
| - SE_GRID_URL=${SE_NODE_GRID_URL//127.0.0.1/${internal}} |
55 |
| - elif [[ "${SE_NODE_GRID_URL}" == *"/0.0.0.0"* ]]; then |
56 |
| - SE_GRID_URL=${SE_NODE_GRID_URL//0.0.0.0/${internal}} |
57 |
| - else |
58 |
| - SE_GRID_URL=${SE_NODE_GRID_URL} |
59 |
| - fi |
60 |
| - echo "Set SE_GRID_URL internally: ${SE_GRID_URL}" |
61 |
| -} |
62 |
| -replace_localhost_by_service_name |
63 |
| - |
64 |
| -if curl -sfk ${SE_SERVER_PROTOCOL}://127.0.0.1:${SE_NODE_PORT}/status > /tmp/preStopOutput; then |
65 |
| - NODE_ID=$(jq -r '.value.node.nodeId' /tmp/preStopOutput) |
| 82 | +if curl -m ${max_time} -sfk ${SE_SERVER_PROTOCOL}://127.0.0.1:${SE_NODE_PORT}/status > ${tmp_node_file}; then |
| 83 | + NODE_ID=$(jq -r '.value.node.nodeId' ${tmp_node_file} || "") |
66 | 84 | if [ -n "${NODE_ID}" ]; then
|
67 |
| - echo "Current Node ID is: ${NODE_ID}" |
68 |
| - signal_hub_to_drain_node |
| 85 | + echo "$(date +%FT%T%Z) [${probe_name}] - Current Node ID is: ${NODE_ID}" |
69 | 86 | signal_distributor_to_drain_node
|
| 87 | + signal_hub_to_drain_node |
70 | 88 | echo
|
71 | 89 | fi
|
72 | 90 | signal_node_to_drain
|
73 | 91 | # Wait for the current session to be finished if any
|
74 |
| - while curl -sfk ${SE_SERVER_PROTOCOL}://127.0.0.1:${SE_NODE_PORT}/status -o /tmp/preStopOutput; |
| 92 | + while curl -m ${max_time} -sfk ${SE_SERVER_PROTOCOL}://127.0.0.1:${SE_NODE_PORT}/status -o ${tmp_node_file}; |
75 | 93 | do
|
76 |
| - echo "Node preStop is waiting for current session to be finished if any. Node details: message: $(jq -r '.value.message' /tmp/preStopOutput || "unknown"), availability: $(jq -r '.value.node.availability' /tmp/preStopOutput || "unknown")" |
77 |
| - sleep 1; |
| 94 | + SLOT_HAS_SESSION=$(jq -e ".value.node.slots[]|select(.session != null).id.id" ${tmp_node_file} | tr -d '"' || "") |
| 95 | + if [ -z "${SLOT_HAS_SESSION}" ]; then |
| 96 | + echo "$(date +%FT%T%Z) [${probe_name}] - There is no session running. Node is ready to be terminated." |
| 97 | + echo "$(date +%FT%T%Z) [${probe_name}] - $(cat ${tmp_node_file} || "")" |
| 98 | + echo |
| 99 | + exit 0 |
| 100 | + else |
| 101 | + echo "$(date +%FT%T%Z) [${probe_name}] - Node preStop is waiting for current session on slot ${SLOT_HAS_SESSION} to be finished. Node details: message: $(jq -r '.value.message' ${tmp_node_file} || "unknown"), availability: $(jq -r '.value.node.availability' ${tmp_node_file} || "unknown")" |
| 102 | + sleep 1; |
| 103 | + fi |
78 | 104 | done
|
79 | 105 | else
|
80 |
| - echo "Node is already drained. Shutting down gracefully!" |
| 106 | + echo "$(date +%FT%T%Z) [${probe_name}] - Node is already drained. Shutting down gracefully!" |
81 | 107 | fi
|
0 commit comments