health-cmdapi-test.sh.in 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #!/usr/bin/env bash
  2. # shellcheck disable=SC1117,SC2034,SC2059,SC2086,SC2181
  3. NETDATA_USER_CONFIG_DIR="@configdir_POST@"
  4. NETDATA_STOCK_CONFIG_DIR="@libconfigdir_POST@"
  5. NETDATA_VARLIB_DIR="@varlibdir_POST@"
  6. printhelp () {
  7. echo "Usage: health-cmdapi-test.sh [OPTIONS]
  8. -s SETUP config files for python example tests
  9. -c CLEANUP config files from python example tests
  10. -r RESTART netdata after SETUP and CLEANUP, using systemctl restart netdata.
  11. -t TEST scenarios execution
  12. -u <URL> changes the host:port from localhost:19999 to <URL>
  13. "
  14. }
  15. check () {
  16. echo -e "${GRAY}Check: '${1}' in 2 sec"
  17. sleep 2
  18. resp=$(curl -s "http://$URL/api/v1/alarms?all")
  19. r=$(echo "${resp}" | \
  20. python3 -c "import sys, json; d=json.load(sys.stdin); \
  21. print(\
  22. d['alarms']['example.random.example_alarm1']['disabled'], \
  23. d['alarms']['example.random.example_alarm1']['silenced'] , \
  24. d['alarms']['example.random.example_alarm2']['disabled'], \
  25. d['alarms']['example.random.example_alarm2']['silenced'], \
  26. d['alarms']['system.load.load_trigger']['disabled'], \
  27. d['alarms']['system.load.load_trigger']['silenced'], \
  28. );" 2>&1)
  29. if [ $? -ne 0 ] ; then
  30. echo -e "${RED}ERROR: Unexpected response '$resp'"
  31. err=$((err+1))
  32. elif [ "${r}" != "${2}" ] ; then
  33. echo -e "${RED}ERROR: 'Got ${r}'. Expected '${2}'"
  34. err=$((err+1))
  35. else
  36. echo -e "${GREEN}Success"
  37. fi
  38. }
  39. cmd () {
  40. echo -e "${WHITE}Cmd '${1}', expecting '${2}'"
  41. RESPONSE=$(curl -s "http://$URL/api/v1/manage/health?${1}" -H "X-Auth-Token: $TOKEN" 2>&1)
  42. if [ "${RESPONSE}" != "${2}" ] ; then
  43. echo -e "${RED}ERROR: Response '${RESPONSE}' != '${2}'"
  44. err=$((err+1))
  45. else
  46. echo -e "${GREEN}Success"
  47. fi
  48. }
  49. WHITE='\033[0;37m'
  50. RED='\033[0;31m'
  51. GREEN='\033[0;32m'
  52. GRAY='\033[0;37m'
  53. SETUP=0
  54. RESTART=0
  55. CLEANUP=0
  56. TEST=0
  57. URL="localhost:19999"
  58. while getopts :srctu: option
  59. do
  60. case "$option" in
  61. s)
  62. SETUP=1
  63. ;;
  64. r)
  65. RESTART=1
  66. ;;
  67. c)
  68. CLEANUP=1
  69. ;;
  70. t)
  71. TEST=1
  72. ;;
  73. u)
  74. URL=$OPTARG
  75. ;;
  76. *)
  77. printhelp
  78. exit 1
  79. ;;
  80. esac
  81. done
  82. if [ $SETUP -eq 1 ] ; then
  83. echo "Preparing netdata configuration for testing"
  84. # Prep netdata for tests
  85. if [ -f "${NETDATA_USER_CONFIG_DIR}/python.d.conf" ] ; then
  86. cp -f "${NETDATA_USER_CONFIG_DIR}/python.d.conf" /tmp/python.d.conf
  87. else
  88. cp "${NETDATA_STOCK_CONFIG_DIR}/python.d.conf" "${NETDATA_USER_CONFIG_DIR}/"
  89. fi
  90. sed -i -e "s/example: no/example: yes/g" "${NETDATA_USER_CONFIG_DIR}/python.d.conf"
  91. mypath=$(cd ${0%/*} && echo $PWD)
  92. cp -f "${mypath}/python-example.conf" "${NETDATA_USER_CONFIG_DIR}/health.d/"
  93. # netdata.conf
  94. if [ -f "${NETDATA_USER_CONFIG_DIR}/netdata.conf" ] ; then
  95. cp -f "${NETDATA_USER_CONFIG_DIR}/netdata.conf" /tmp/netdata.conf
  96. fi
  97. printf "[health]\nrun at least every seconds = 1\n" > "${NETDATA_USER_CONFIG_DIR}/netdata.conf"
  98. chmod +r "${NETDATA_USER_CONFIG_DIR}/python.d.conf" "${NETDATA_USER_CONFIG_DIR}/netdata.conf" "${NETDATA_USER_CONFIG_DIR}/health.d/python-example.conf" "${NETDATA_STOCK_CONFIG_DIR}/health.d/load.conf"
  99. # Restart netdata
  100. if [ $RESTART -eq 1 ] ; then
  101. echo "Restarting netdata"
  102. systemctl restart netdata
  103. fi
  104. fi
  105. err=0
  106. # Execute tests
  107. if [ $TEST -eq 1 ] ; then
  108. HEALTH_CMDAPI_MSG_AUTHERROR="Auth Error"
  109. HEALTH_CMDAPI_MSG_SILENCEALL="All alarm notifications are silenced"
  110. HEALTH_CMDAPI_MSG_DISABLEALL="All health checks are disabled"
  111. HEALTH_CMDAPI_MSG_RESET="All health checks and notifications are enabled"
  112. HEALTH_CMDAPI_MSG_DISABLE="Health checks disabled for alarms matching the selectors"
  113. HEALTH_CMDAPI_MSG_SILENCE="Alarm notifications silenced for alarms matching the selectors"
  114. HEALTH_CMDAPI_MSG_ADDED="Alarm selector added"
  115. HEALTH_CMDAPI_MSG_INVALID_KEY="Invalid key. Ignoring it."
  116. HEALTH_CMDAPI_MSG_STYPEWARNING="WARNING: Added alarm selector to silence/disable alarms without a SILENCE or DISABLE command."
  117. HEALTH_CMDAPI_MSG_NOSELECTORWARNING="WARNING: SILENCE or DISABLE command is ineffective without defining any alarm selectors."
  118. if [ -f "${NETDATA_VARLIB_DIR}/netdata.api.key" ] ;then
  119. read -r CORRECT_TOKEN < "${NETDATA_VARLIB_DIR}/netdata.api.key"
  120. else
  121. echo "${NETDATA_VARLIB_DIR}/netdata.api.key not found"
  122. exit 1
  123. fi
  124. # Set correct token
  125. TOKEN="${CORRECT_TOKEN}"
  126. # Test default state
  127. cmd "cmd=RESET" "$HEALTH_CMDAPI_MSG_RESET"
  128. check "Default State" "False False False False False False"
  129. # Test auth failure
  130. TOKEN="Wrong token"
  131. cmd "cmd=DISABLE ALL" "$HEALTH_CMDAPI_MSG_AUTHERROR"
  132. check "Default State" "False False False False False False"
  133. # Set correct token
  134. TOKEN="${CORRECT_TOKEN}"
  135. # Test disable
  136. cmd "cmd=DISABLE ALL" "$HEALTH_CMDAPI_MSG_DISABLEALL"
  137. check "All disabled" "True False True False True False"
  138. # Reset
  139. cmd "cmd=RESET" "$HEALTH_CMDAPI_MSG_RESET"
  140. check "Default State" "False False False False False False"
  141. # Test silence
  142. cmd "cmd=SILENCE ALL" "$HEALTH_CMDAPI_MSG_SILENCEALL"
  143. check "All silenced" "False True False True False True"
  144. # Reset
  145. cmd "cmd=RESET" "$HEALTH_CMDAPI_MSG_RESET"
  146. check "Default State" "False False False False False False"
  147. # Add silencer by name
  148. printf -v resp "$HEALTH_CMDAPI_MSG_SILENCE\n$HEALTH_CMDAPI_MSG_ADDED"
  149. cmd "cmd=SILENCE&alarm=*example_alarm1 *load_trigger" "${resp}"
  150. check "Silence notifications for alarm1 and load_trigger" "False True False False False True"
  151. # Convert to disable health checks
  152. cmd "cmd=DISABLE" "$HEALTH_CMDAPI_MSG_DISABLE"
  153. check "Disable notifications for alarm1 and load_trigger" "True False False False True False"
  154. # Convert back to silence notifications
  155. cmd "cmd=SILENCE" "$HEALTH_CMDAPI_MSG_SILENCE"
  156. check "Silence notifications for alarm1 and load_trigger" "False True False False False True"
  157. # Add second silencer by name
  158. cmd "alarm=*example_alarm2" "$HEALTH_CMDAPI_MSG_ADDED"
  159. check "Silence notifications for alarm1,alarm2 and load_trigger" "False True False True False True"
  160. # Reset
  161. cmd "cmd=RESET" "$HEALTH_CMDAPI_MSG_RESET"
  162. # Add silencer by chart
  163. printf -v resp "$HEALTH_CMDAPI_MSG_DISABLE\n$HEALTH_CMDAPI_MSG_ADDED"
  164. cmd "cmd=DISABLE&chart=system.load" "${resp}"
  165. check "Default State" "False False False False True False"
  166. # Add silencer by context
  167. cmd "context=random" "$HEALTH_CMDAPI_MSG_ADDED"
  168. check "Default State" "True False True False True False"
  169. # Reset
  170. cmd "cmd=RESET" "$HEALTH_CMDAPI_MSG_RESET"
  171. # Add second condition to a selector (AND)
  172. printf -v resp "$HEALTH_CMDAPI_MSG_SILENCE\n$HEALTH_CMDAPI_MSG_ADDED"
  173. cmd "cmd=SILENCE&alarm=*example_alarm1 *load_trigger&chart=system.load" "${resp}"
  174. check "Silence notifications load_trigger" "False False False False False True"
  175. # Add second selector with two conditions
  176. cmd "alarm=*example_alarm1 *load_trigger&context=random" "$HEALTH_CMDAPI_MSG_ADDED"
  177. check "Silence notifications load_trigger" "False True False False False True"
  178. # Reset
  179. cmd "cmd=RESET" "$HEALTH_CMDAPI_MSG_RESET"
  180. # Add silencer without a command to disable or silence alarms
  181. printf -v resp "$HEALTH_CMDAPI_MSG_ADDED\n$HEALTH_CMDAPI_MSG_STYPEWARNING"
  182. cmd "families=load" "${resp}"
  183. check "Family selector with no command" "False False False False False False"
  184. # Add silence command
  185. cmd "cmd=SILENCE" "$HEALTH_CMDAPI_MSG_SILENCE"
  186. check "Silence family load" "False False False False False True"
  187. # Reset
  188. cmd "cmd=RESET" "$HEALTH_CMDAPI_MSG_RESET"
  189. # Add command without silencers
  190. printf -v resp "$HEALTH_CMDAPI_MSG_SILENCE\n$HEALTH_CMDAPI_MSG_NOSELECTORWARNING"
  191. cmd "cmd=SILENCE" "${resp}"
  192. check "Command with no selector" "False False False False False False"
  193. # Add hosts silencer
  194. cmd "hosts=*" "$HEALTH_CMDAPI_MSG_ADDED"
  195. check "Silence all hosts" "False True False True False True"
  196. # Reset
  197. cmd "cmd=RESET" "$HEALTH_CMDAPI_MSG_RESET"
  198. fi
  199. # Cleanup
  200. if [ $CLEANUP -eq 1 ] ; then
  201. echo -e "${WHITE}Restoring netdata configuration"
  202. for f in "python.d.conf" "netdata.conf" ; do
  203. if [ -f "/tmp/$f" ] ; then
  204. mv -f "/tmp/$f" "${NETDATA_USER_CONFIG_DIR}/"
  205. else
  206. rm -f "${NETDATA_USER_CONFIG_DIR}/$f"
  207. fi
  208. done
  209. rm -f "${NETDATA_USER_CONFIG_DIR}/health.d/python-example.conf"
  210. # Restart netdata
  211. if [ $RESTART -eq 1 ] ; then
  212. echo "Restarting netdata"
  213. systemctl restart netdata
  214. fi
  215. fi
  216. if [ $err -gt 0 ] ; then
  217. echo "$err error(s) found"
  218. exit 1
  219. fi