test_healthcheck.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. import pytest
  2. from render import Render
  3. @pytest.fixture
  4. def mock_values():
  5. return {
  6. "images": {
  7. "test_image": {
  8. "repository": "nginx",
  9. "tag": "latest",
  10. }
  11. },
  12. }
  13. def test_disable_healthcheck(mock_values):
  14. render = Render(mock_values)
  15. c1 = render.add_container("test_container", "test_image")
  16. c1.healthcheck.disable()
  17. output = render.render()
  18. assert output["services"]["test_container"]["healthcheck"] == {"disable": True}
  19. def test_use_built_in_healthcheck(mock_values):
  20. render = Render(mock_values)
  21. c1 = render.add_container("test_container", "test_image")
  22. c1.healthcheck.use_built_in()
  23. output = render.render()
  24. assert "healthcheck" not in output["services"]["test_container"]
  25. def test_set_custom_test(mock_values):
  26. render = Render(mock_values)
  27. c1 = render.add_container("test_container", "test_image")
  28. c1.healthcheck.set_custom_test("echo $1")
  29. output = render.render()
  30. assert output["services"]["test_container"]["healthcheck"] == {
  31. "test": "echo $$1",
  32. "interval": "30s",
  33. "timeout": "5s",
  34. "retries": 5,
  35. "start_period": "15s",
  36. "start_interval": "2s",
  37. }
  38. def test_set_custom_test_array(mock_values):
  39. render = Render(mock_values)
  40. c1 = render.add_container("test_container", "test_image")
  41. c1.healthcheck.set_custom_test(["CMD", "echo", "1"])
  42. output = render.render()
  43. assert output["services"]["test_container"]["healthcheck"] == {
  44. "test": ["CMD", "echo", "1"],
  45. "interval": "30s",
  46. "timeout": "5s",
  47. "retries": 5,
  48. "start_period": "15s",
  49. "start_interval": "2s",
  50. }
  51. def test_CMD_with_var_should_fail(mock_values):
  52. render = Render(mock_values)
  53. c1 = render.add_container("test_container", "test_image")
  54. with pytest.raises(Exception):
  55. c1.healthcheck.set_custom_test(["CMD", "echo", "$1"])
  56. def test_set_options(mock_values):
  57. render = Render(mock_values)
  58. c1 = render.add_container("test_container", "test_image")
  59. c1.healthcheck.set_custom_test(["CMD", "echo", "123$567"])
  60. c1.healthcheck.set_interval(9)
  61. c1.healthcheck.set_timeout(8)
  62. c1.healthcheck.set_retries(7)
  63. c1.healthcheck.set_start_period(6)
  64. c1.healthcheck.set_start_interval(5)
  65. output = render.render()
  66. assert output["services"]["test_container"]["healthcheck"] == {
  67. "test": ["CMD", "echo", "123$$567"],
  68. "interval": "9s",
  69. "timeout": "8s",
  70. "retries": 7,
  71. "start_period": "6s",
  72. "start_interval": "5s",
  73. }
  74. def test_adding_test_when_disabled(mock_values):
  75. render = Render(mock_values)
  76. c1 = render.add_container("test_container", "test_image")
  77. c1.healthcheck.disable()
  78. with pytest.raises(Exception):
  79. c1.healthcheck.set_custom_test("echo $1")
  80. def test_not_adding_test(mock_values):
  81. render = Render(mock_values)
  82. render.add_container("test_container", "test_image")
  83. with pytest.raises(Exception):
  84. render.render()
  85. def test_invalid_path(mock_values):
  86. render = Render(mock_values)
  87. c1 = render.add_container("test_container", "test_image")
  88. with pytest.raises(Exception):
  89. c1.healthcheck.set_test("http", {"port": 8080, "path": "invalid"})
  90. def test_http_healthcheck(mock_values):
  91. render = Render(mock_values)
  92. c1 = render.add_container("test_container", "test_image")
  93. c1.healthcheck.set_test("http", {"port": 8080})
  94. output = render.render()
  95. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  96. "CMD-SHELL",
  97. f"""/bin/bash -c 'exec {{hc_fd}}<>/dev/tcp/127.0.0.1/8080 && echo -e "GET / HTTP/1.1\\r\\nHost: 127.0.0.1\\r\\nConnection: close\\r\\n\\r\\n" >&$${{hc_fd}} && cat <&$${{hc_fd}} | grep "HTTP" | grep -q "200"'""", # noqa
  98. ]
  99. def test_curl_healthcheck_as_CMD(mock_values):
  100. render = Render(mock_values)
  101. c1 = render.add_container("test_container", "test_image")
  102. c1.healthcheck.set_test("curl", {"port": 8080, "path": "/health", "data": {"test": "val"}, "exec_type": "CMD"})
  103. output = render.render()
  104. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  105. "CMD",
  106. "curl",
  107. "--request",
  108. "GET",
  109. "--silent",
  110. "--output",
  111. "/dev/null",
  112. "--show-error",
  113. "--fail",
  114. "--data",
  115. '{"test": "val"}',
  116. "http://127.0.0.1:8080/health",
  117. ]
  118. def test_curl_healthcheck(mock_values):
  119. render = Render(mock_values)
  120. c1 = render.add_container("test_container", "test_image")
  121. c1.healthcheck.set_test("curl", {"port": 8080, "path": "/health", "data": {"test": "val"}})
  122. output = render.render()
  123. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  124. "CMD",
  125. "curl",
  126. "--request",
  127. "GET",
  128. "--silent",
  129. "--output",
  130. "/dev/null",
  131. "--show-error",
  132. "--fail",
  133. "--data",
  134. '{"test": "val"}',
  135. "http://127.0.0.1:8080/health",
  136. ]
  137. def test_curl_healthcheck_with_headers_and_method_and_data(mock_values):
  138. render = Render(mock_values)
  139. c1 = render.add_container("test_container", "test_image")
  140. c1.healthcheck.set_test(
  141. "curl", {"port": 8080, "path": "/health", "method": "POST", "headers": [("X-Test", "some-value")], "data": {}}
  142. )
  143. output = render.render()
  144. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  145. "CMD",
  146. "curl",
  147. "--request",
  148. "POST",
  149. "--silent",
  150. "--output",
  151. "/dev/null",
  152. "--show-error",
  153. "--fail",
  154. "--header",
  155. "X-Test: some-value",
  156. "--data",
  157. "{}",
  158. "http://127.0.0.1:8080/health",
  159. ]
  160. def test_wget_healthcheck(mock_values):
  161. render = Render(mock_values)
  162. c1 = render.add_container("test_container", "test_image")
  163. c1.healthcheck.set_test("wget", {"port": 8080, "path": "/health"})
  164. output = render.render()
  165. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  166. "CMD",
  167. "wget",
  168. "--quiet",
  169. "--spider",
  170. "http://127.0.0.1:8080/health",
  171. ]
  172. def test_wget_healthcheck_no_spider(mock_values):
  173. render = Render(mock_values)
  174. c1 = render.add_container("test_container", "test_image")
  175. c1.healthcheck.set_test("wget", {"port": 8080, "path": "/health", "spider": False})
  176. output = render.render()
  177. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  178. "CMD",
  179. "wget",
  180. "--quiet",
  181. "-O",
  182. "/dev/null",
  183. "http://127.0.0.1:8080/health",
  184. ]
  185. def test_netcat_healthcheck(mock_values):
  186. render = Render(mock_values)
  187. c1 = render.add_container("test_container", "test_image")
  188. c1.healthcheck.set_test("netcat", {"port": 8080})
  189. output = render.render()
  190. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  191. "CMD",
  192. "nc",
  193. "-z",
  194. "-w",
  195. "1",
  196. "127.0.0.1",
  197. "8080",
  198. ]
  199. def test_netcat_udp_healthcheck(mock_values):
  200. render = Render(mock_values)
  201. c1 = render.add_container("test_container", "test_image")
  202. c1.healthcheck.set_test("netcat", {"port": 8080, "udp": True})
  203. output = render.render()
  204. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  205. "CMD",
  206. "nc",
  207. "-z",
  208. "-w",
  209. "1",
  210. "-u",
  211. "127.0.0.1",
  212. "8080",
  213. ]
  214. def test_tcp_healthcheck(mock_values):
  215. render = Render(mock_values)
  216. c1 = render.add_container("test_container", "test_image")
  217. c1.healthcheck.set_test("tcp", {"port": 8080})
  218. output = render.render()
  219. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  220. "CMD",
  221. "timeout",
  222. "1",
  223. "bash",
  224. "-c",
  225. "cat < /dev/null > /dev/tcp/127.0.0.1/8080",
  226. ]
  227. def test_redis_healthcheck(mock_values):
  228. render = Render(mock_values)
  229. c1 = render.add_container("test_container", "test_image")
  230. c1.healthcheck.set_test("redis", {"password": "test"})
  231. output = render.render()
  232. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  233. "CMD",
  234. "redis-cli",
  235. "-h",
  236. "127.0.0.1",
  237. "-p",
  238. "6379",
  239. "-a",
  240. "test",
  241. "ping",
  242. ]
  243. def test_redis_healthcheck_no_password(mock_values):
  244. render = Render(mock_values)
  245. c1 = render.add_container("test_container", "test_image")
  246. c1.healthcheck.set_test("redis", {"password": ""})
  247. output = render.render()
  248. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  249. "CMD",
  250. "redis-cli",
  251. "-h",
  252. "127.0.0.1",
  253. "-p",
  254. "6379",
  255. "ping",
  256. ]
  257. def test_postgres_healthcheck(mock_values):
  258. render = Render(mock_values)
  259. c1 = render.add_container("test_container", "test_image")
  260. c1.healthcheck.set_test("postgres", {"user": "test-user", "db": "test-db"})
  261. output = render.render()
  262. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  263. "CMD",
  264. "pg_isready",
  265. "-h",
  266. "127.0.0.1",
  267. "-p",
  268. "5432",
  269. "-U",
  270. "test-user",
  271. "-d",
  272. "test-db",
  273. ]
  274. def test_mariadb_healthcheck(mock_values):
  275. render = Render(mock_values)
  276. c1 = render.add_container("test_container", "test_image")
  277. c1.healthcheck.set_test("mariadb", {"password": "test-pass"})
  278. output = render.render()
  279. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  280. "CMD",
  281. "mariadb-admin",
  282. "--user=root",
  283. "--host=127.0.0.1",
  284. "--port=3306",
  285. "--password=test-pass",
  286. "ping",
  287. ]
  288. def test_mongodb_healthcheck(mock_values):
  289. render = Render(mock_values)
  290. c1 = render.add_container("test_container", "test_image")
  291. c1.healthcheck.set_test("mongodb", {"db": "test-db"})
  292. output = render.render()
  293. assert output["services"]["test_container"]["healthcheck"]["test"] == [
  294. "CMD",
  295. "mongosh",
  296. "--host",
  297. "127.0.0.1",
  298. "--port",
  299. "27017",
  300. "test-db",
  301. "--eval",
  302. 'db.adminCommand("ping")',
  303. "--quiet",
  304. ]