@underpostnet/cyberia 3.2.90 → 3.3.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/.dockerignore +1 -0
  2. package/.env.example +16 -0
  3. package/.github/workflows/coverall.cyberia.ci.yml +107 -0
  4. package/.github/workflows/cyberia-client.cd.yml +6 -18
  5. package/.github/workflows/cyberia-server.cd.yml +6 -18
  6. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  7. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  8. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  9. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  10. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  11. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  12. package/.github/workflows/engine-cyberia.cd.yml +6 -78
  13. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  14. package/.github/workflows/ghpkg.ci.yml +42 -21
  15. package/.github/workflows/hardhat.ci.yml +12 -11
  16. package/.github/workflows/npmpkg.ci.yml +17 -15
  17. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -16
  18. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  19. package/.github/workflows/release.cd.yml +2 -9
  20. package/.prettierignore +1 -0
  21. package/AGENTS.md +47 -0
  22. package/CHANGELOG.md +581 -2417
  23. package/CLI-HELP.md +416 -127
  24. package/Dockerfile +25 -9
  25. package/Dockerfile.dev +25 -9
  26. package/Dockerfile.test +4 -4
  27. package/README.md +21 -1
  28. package/bin/build.js +70 -43
  29. package/bin/build.template.js +8 -3
  30. package/bin/cyberia.js +372 -135
  31. package/bin/deploy.js +18 -104
  32. package/bin/index.js +372 -135
  33. package/compose.env +16 -0
  34. package/conf.js +93 -4
  35. package/deploy/cyberia-client/deploy.sh +47 -0
  36. package/deploy/cyberia-client/package.sh +18 -0
  37. package/deploy/cyberia-client/state.sh +14 -0
  38. package/deploy/cyberia-server/deploy.sh +47 -0
  39. package/deploy/cyberia-server/package.sh +18 -0
  40. package/deploy/cyberia-server/state.sh +14 -0
  41. package/deploy/dd-cyberia/deploy.sh +22 -0
  42. package/deploy/dd-cyberia/init.sh +55 -0
  43. package/deploy/dd-cyberia/package.sh +17 -0
  44. package/deploy/dd-cyberia/state.sh +14 -0
  45. package/deploy/dd-cyberia/sync-deploy.sh +116 -0
  46. package/deploy/lib/github-actions-logging.sh +594 -0
  47. package/deploy/lib/host.sh +185 -0
  48. package/deploy/lib/state.sh +62 -0
  49. package/deploy/pwa-microservices-template/deploy.sh +45 -0
  50. package/deploy/release/deploy.sh +32 -0
  51. package/deployment.yaml +7 -2
  52. package/docker-compose.yml +31 -37
  53. package/examples/static-page/README.md +19 -19
  54. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  55. package/hardhat/hardhat.config.js +1 -6
  56. package/hardhat/package-lock.json +104 -43
  57. package/hardhat/package.json +3 -3
  58. package/manifests/alertmanager/deployment.yaml +81 -0
  59. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  60. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +36 -7
  61. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +77 -0
  62. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  63. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  64. package/manifests/grafana/deployment.yaml +26 -7
  65. package/manifests/grafana/kustomization.yaml +1 -0
  66. package/manifests/grafana/service.yaml +6 -1
  67. package/manifests/mariadb/pv.yaml +1 -0
  68. package/manifests/mongodb/statefulset.yaml +9 -2
  69. package/manifests/mysql/pv-pvc.yaml +14 -1
  70. package/manifests/postgresql/pv.yaml +12 -1
  71. package/manifests/postgresql/pvc.yaml +1 -0
  72. package/manifests/prometheus/deployment.yaml +18 -22
  73. package/package.json +83 -10
  74. package/scripts/audit-selinux.sh +64 -0
  75. package/scripts/event-monitor.sh +56 -0
  76. package/scripts/gpu-diag.sh +0 -0
  77. package/scripts/ip-info.sh +0 -0
  78. package/scripts/k3s-node-setup.sh +30 -14
  79. package/scripts/kubeadm-node-setup.sh +40 -31
  80. package/scripts/lxd-vm-setup.sh +0 -0
  81. package/scripts/maas-nat-firewalld.sh +0 -0
  82. package/scripts/maas-setup.sh +8 -8
  83. package/scripts/nat-iptables.sh +2 -0
  84. package/scripts/rhel-grpc-setup.sh +0 -0
  85. package/scripts/rocky-kickstart.sh +25 -9
  86. package/scripts/selinux-normalize.sh +907 -0
  87. package/scripts/shutdown-machine.sh +843 -0
  88. package/scripts/test-monitor.sh +3 -3
  89. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
  90. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
  91. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
  92. package/src/api/core/core.controller.js +1 -1
  93. package/src/api/core/core.router.js +2 -2
  94. package/src/api/core/core.service.js +2 -2
  95. package/src/api/crypto/crypto.controller.js +1 -1
  96. package/src/api/crypto/crypto.service.js +1 -1
  97. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  98. package/src/api/cyberia-action/cyberia-action.router.js +1 -1
  99. package/src/api/cyberia-action/cyberia-action.service.js +2 -2
  100. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
  101. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
  102. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
  103. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  104. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  105. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  106. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  107. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  108. package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
  109. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
  110. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
  111. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
  112. package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
  113. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +63 -0
  114. package/src/api/cyberia-instance/cyberia-fallback-world.js +16 -1
  115. package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
  116. package/src/api/cyberia-instance/cyberia-instance.controller.js +4 -1
  117. package/src/api/cyberia-instance/cyberia-instance.router.js +15 -2
  118. package/src/api/cyberia-instance/cyberia-instance.service.js +45 -2
  119. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  120. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +1 -0
  121. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  122. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
  123. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  124. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  125. package/src/api/cyberia-map/cyberia-map.service.js +2 -2
  126. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  127. package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
  128. package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
  129. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  130. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  131. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  132. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  133. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  134. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  135. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +16 -29
  136. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  137. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  138. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  139. package/src/api/default/default.controller.js +1 -1
  140. package/src/api/default/default.router.js +1 -1
  141. package/src/api/default/default.service.js +2 -2
  142. package/src/api/document/document.controller.js +1 -1
  143. package/src/api/document/document.router.js +1 -1
  144. package/src/api/document/document.service.js +2 -2
  145. package/src/api/file/file.controller.js +1 -1
  146. package/src/api/file/file.router.js +1 -1
  147. package/src/api/file/file.service.js +2 -2
  148. package/src/api/instance/instance.controller.js +1 -1
  149. package/src/api/instance/instance.router.js +1 -1
  150. package/src/api/instance/instance.service.js +2 -2
  151. package/src/api/ipfs/ipfs.controller.js +1 -1
  152. package/src/api/ipfs/ipfs.router.js +2 -2
  153. package/src/api/ipfs/ipfs.service.js +2 -2
  154. package/src/api/object-layer/object-layer.controller.js +1 -1
  155. package/src/api/object-layer/object-layer.model.js +204 -3
  156. package/src/api/object-layer/object-layer.router.js +2 -2
  157. package/src/api/object-layer/object-layer.service.js +4 -17
  158. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  159. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  160. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  161. package/src/api/test/test.controller.js +1 -1
  162. package/src/api/test/test.service.js +1 -1
  163. package/src/api/user/guest.service.js +3 -3
  164. package/src/api/user/user.controller.js +1 -1
  165. package/src/api/user/user.router.js +2 -2
  166. package/src/api/user/user.service.js +4 -4
  167. package/src/api.js +5 -9
  168. package/src/cli/app.js +391 -0
  169. package/src/cli/baremetal.js +30 -36
  170. package/src/cli/client.js +306 -0
  171. package/src/cli/cloud-init.js +3 -3
  172. package/src/cli/cluster.js +242 -135
  173. package/src/cli/db.js +126 -67
  174. package/src/cli/deploy.js +158 -60
  175. package/src/cli/docker-compose.js +5 -5
  176. package/src/cli/domains.js +184 -0
  177. package/src/cli/dotenv-store.js +143 -0
  178. package/src/cli/event.js +2281 -0
  179. package/src/cli/fs.js +3 -3
  180. package/src/cli/host.js +672 -0
  181. package/src/cli/image.js +4 -7
  182. package/src/cli/index.js +426 -134
  183. package/src/cli/ipfs.js +34 -30
  184. package/src/cli/kickstart.js +1 -1
  185. package/src/cli/kubectl.js +218 -41
  186. package/src/cli/lxd.js +3 -3
  187. package/src/cli/monitor.js +1359 -26
  188. package/src/cli/package.js +90 -0
  189. package/src/cli/release.js +73 -34
  190. package/src/cli/repository.js +564 -367
  191. package/src/cli/run.js +362 -654
  192. package/src/cli/secrets.js +2158 -964
  193. package/src/cli/ssh.js +651 -331
  194. package/src/cli/state.js +394 -0
  195. package/src/cli/static.js +2 -2
  196. package/src/cli/system.js +26 -13
  197. package/src/cli/test.js +199 -125
  198. package/src/cli/vultr.js +623 -0
  199. package/src/cli/wireguard.js +2930 -0
  200. package/src/client/components/core/CalendarCore.js +53 -96
  201. package/src/client/components/core/Docs.js +258 -211
  202. package/src/client/components/core/FileExplorer.js +0 -21
  203. package/src/client/components/core/PanelForm.js +4 -4
  204. package/src/client/components/core/Repository.js +56 -0
  205. package/src/client/components/core/Translate.js +7 -0
  206. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  207. package/src/client/components/core/Wallet.js +0 -11
  208. package/src/client/components/core/Worker.js +7 -1
  209. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  210. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +368 -0
  211. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +35 -1
  212. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +4 -0
  213. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  214. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  215. package/src/client/components/default/AppShellDefault.js +1 -1
  216. package/src/client/components/default/SettingsDefault.js +2 -2
  217. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  218. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  219. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  220. package/src/client/public/cyberia-docs/ARCHITECTURE.md +17 -3
  221. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
  222. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +1 -1
  223. package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
  224. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  225. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  226. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  227. package/src/client/public/default/android-chrome-144x144.png +0 -0
  228. package/src/client/public/default/android-chrome-192x192.png +0 -0
  229. package/src/client/public/default/android-chrome-256x256.png +0 -0
  230. package/src/client/public/default/android-chrome-36x36.png +0 -0
  231. package/src/client/public/default/android-chrome-384x384.png +0 -0
  232. package/src/client/public/default/android-chrome-48x48.png +0 -0
  233. package/src/client/public/default/android-chrome-512x512.png +0 -0
  234. package/src/client/public/default/android-chrome-72x72.png +0 -0
  235. package/src/client/public/default/android-chrome-96x96.png +0 -0
  236. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  237. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  238. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  239. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  240. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  241. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  242. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  243. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  244. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  245. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  246. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  247. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  248. package/src/client/public/default/apple-touch-icon.png +0 -0
  249. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  250. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  251. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  252. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  253. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  254. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  255. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  256. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  257. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  258. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  259. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  260. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  261. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  262. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  263. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  264. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  265. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  266. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  267. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  268. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  269. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  270. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  271. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  272. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  273. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  274. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  275. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  276. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  277. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  278. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  279. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  280. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  281. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  282. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  283. package/src/client/public/default/assets/background/white.jpg +0 -0
  284. package/src/client/public/default/browserconfig.xml +1 -1
  285. package/src/client/public/default/favicon-16x16.png +0 -0
  286. package/src/client/public/default/favicon-32x32.png +0 -0
  287. package/src/client/public/default/favicon-48x48.png +0 -0
  288. package/src/client/public/default/favicon.ico +0 -0
  289. package/src/client/public/default/manifest.webmanifest +5 -5
  290. package/src/client/public/default/mstile-144x144.png +0 -0
  291. package/src/client/public/default/mstile-150x150.png +0 -0
  292. package/src/client/public/default/mstile-310x150.png +0 -0
  293. package/src/client/public/default/mstile-310x310.png +0 -0
  294. package/src/client/public/default/mstile-70x70.png +0 -0
  295. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  296. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  297. package/src/client/services/cyberia-instance/cyberia-instance.service.js +40 -0
  298. package/src/client/services/object-layer/object-layer.management.js +4 -4
  299. package/src/client/ssr/RootDocument.js +1 -1
  300. package/src/client/ssr/body/404.js +1 -1
  301. package/src/client/ssr/body/500.js +1 -1
  302. package/src/client/ssr/body/CacheControl.js +1 -1
  303. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  304. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  305. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  306. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  307. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  308. package/src/client/ssr/head/Css.js +1 -1
  309. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  310. package/src/client/ssr/head/DefaultScripts.js +1 -1
  311. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  312. package/src/client/ssr/head/Microdata.js +1 -1
  313. package/src/client/ssr/head/Production.js +1 -1
  314. package/src/client/ssr/head/Pwa.js +1 -1
  315. package/src/client/ssr/head/PwaItemledger.js +1 -1
  316. package/src/client/ssr/head/Seo.js +1 -1
  317. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  318. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  319. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  320. package/src/client/ssr/views/Cyberia404.js +7 -5
  321. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  322. package/src/client/ssr/views/Maintenance.js +1 -1
  323. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  324. package/src/client/ssr/views/Test.js +1 -1
  325. package/src/client/sw/core.sw.js +20 -14
  326. package/src/client-builder/client-build-docs.js +61 -46
  327. package/src/client-builder/client-build-live.js +2 -2
  328. package/src/client-builder/client-build.js +58 -44
  329. package/src/client-builder/client-dev-server.js +3 -3
  330. package/src/client-builder/client-icons.js +2 -2
  331. package/src/client-builder/ssr.js +3 -3
  332. package/src/client.build.js +3 -6
  333. package/src/client.dev.js +3 -6
  334. package/src/db/DataBaseProvider.js +186 -3
  335. package/src/db/mariadb/MariaDB.js +3 -2
  336. package/src/db/mongo/MongoBootstrap.js +273 -101
  337. package/src/db/mongo/MongooseDB.js +11 -8
  338. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  339. package/src/grpc/cyberia/grpc-server.js +1 -1
  340. package/src/index.js +103 -23
  341. package/src/mailer/EmailRender.js +2 -2
  342. package/src/mailer/MailerInterceptor.js +87 -0
  343. package/src/mailer/MailerProvider.js +50 -6
  344. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
  345. package/src/projects/cyberia/besu-genesis-generator.js +3 -3
  346. package/src/projects/cyberia/catalog-cyberia.js +54 -6
  347. package/src/projects/cyberia/gemini-client.js +1 -1
  348. package/src/projects/cyberia/generate-saga.js +15 -24
  349. package/src/projects/cyberia/hot-reload-trigger.js +1 -1
  350. package/src/projects/cyberia/instance-data.js +22 -3
  351. package/src/projects/cyberia/ipfs-client.js +4 -4
  352. package/src/projects/cyberia/map-preview-generator.js +1 -1
  353. package/src/projects/cyberia/object-layer.js +12 -22
  354. package/src/projects/cyberia/semantic-layer-generator.js +1 -1
  355. package/src/projects/underpost/catalog-underpost.js +13 -2
  356. package/src/proxy.js +4 -7
  357. package/src/runtime/cyberia-client/Dockerfile +9 -4
  358. package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
  359. package/src/runtime/cyberia-server/Dockerfile +9 -4
  360. package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
  361. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  362. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  363. package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
  364. package/src/runtime/engine-cyberia/compose.env +16 -0
  365. package/src/runtime/engine-cyberia/docker-compose.yml +31 -37
  366. package/src/runtime/express/Express.js +32 -27
  367. package/src/runtime/lampp/Lampp.js +22 -70
  368. package/src/runtime/nginx/Nginx.js +1 -1
  369. package/src/runtime/wp/Wp.js +16 -48
  370. package/src/server/{catalog.js → build/catalog.js} +15 -5
  371. package/src/server/build/coverage.js +117 -0
  372. package/src/server/build/execution.js +402 -0
  373. package/src/server/build/package.js +465 -0
  374. package/src/server/build/testing.js +528 -0
  375. package/src/server/{dns.js → network/dns.js} +241 -14
  376. package/src/server/network/forward-proxy.js +541 -0
  377. package/src/server/{middlewares.js → network/middlewares.js} +59 -4
  378. package/src/server/network/node-capability.js +98 -0
  379. package/src/server/{peer.js → network/peer.js} +3 -3
  380. package/src/server/{proxy.js → network/proxy.js} +7 -13
  381. package/src/server/network/router.js +356 -0
  382. package/src/server/{tls.js → network/tls.js} +2 -2
  383. package/src/server/network/underpost-compression.js +186 -0
  384. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +26 -16
  385. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +19 -3
  386. package/src/server/{cri.js → ops/cri.js} +2 -2
  387. package/src/server/ops/cron.js +949 -0
  388. package/src/server/ops/event-notification.js +284 -0
  389. package/src/server/{logger.js → ops/logger.js} +108 -23
  390. package/src/server/ops/monitoring.js +1724 -0
  391. package/src/server/ops/systemd.js +259 -0
  392. package/src/server/{conf.js → runtime/conf.js} +521 -520
  393. package/src/server/runtime/config-scope.js +215 -0
  394. package/src/server/runtime/environment.js +149 -0
  395. package/src/server/{process.js → runtime/process.js} +153 -13
  396. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  397. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  398. package/src/server/{start.js → runtime/start.js} +128 -39
  399. package/src/server/{auth.js → security/auth.js} +7 -8
  400. package/src/server/security/container-storage.js +382 -0
  401. package/src/server/{crypto.js → security/crypto.js} +1 -1
  402. package/src/server/security/selinux.js +185 -0
  403. package/src/server/{backup.js → storage/backup.js} +17 -8
  404. package/src/server/{data-query.js → storage/data-query.js} +1 -1
  405. package/src/server/{downloader.js → storage/downloader.js} +2 -2
  406. package/src/server/storage/repository.js +68 -0
  407. package/src/server.js +4 -7
  408. package/src/ws/IoInterface.js +1 -1
  409. package/src/ws/IoServer.js +1 -1
  410. package/src/ws/core/core.ws.connection.js +1 -1
  411. package/src/ws/core/core.ws.emit.js +1 -1
  412. package/src/ws/core/core.ws.server.js +1 -1
  413. package/src/ws/default/default.ws.connection.js +1 -1
  414. package/src/ws/default/default.ws.emit.js +1 -1
  415. package/src/ws/default/default.ws.server.js +1 -1
  416. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  417. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  418. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  419. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  420. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
  421. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +2 -1
  422. package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
  423. package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
  424. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  425. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  426. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  427. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  428. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  429. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  430. package/test/integration/infra/1-security/selinux.test.js +69 -0
  431. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  432. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  433. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  434. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  435. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  436. package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
  437. package/test/integration/infra/2-network/wireguard-edge.test.js +1731 -0
  438. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  439. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  440. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  441. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  442. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  443. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  444. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +47 -6
  445. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +56 -4
  446. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  447. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  448. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  449. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  450. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  451. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  452. package/test/support/shell-harness.js +73 -0
  453. package/test/unit/build-template.test.js +97 -0
  454. package/test/unit/build-workflow-offline.test.js +132 -0
  455. package/test/unit/catalog.test.js +71 -0
  456. package/test/unit/client-build-docs.test.js +334 -0
  457. package/test/unit/conf-loading.test.js +303 -0
  458. package/test/unit/conf-resolution.test.js +979 -0
  459. package/test/unit/coverage-artifact.test.js +130 -0
  460. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  461. package/test/unit/deploy-env-resolution.test.js +38 -0
  462. package/test/unit/deploy-log-table.test.js +447 -0
  463. package/test/unit/execution-profiles.test.js +219 -0
  464. package/test/unit/fleet-sync-source.test.js +149 -0
  465. package/test/unit/logger-redaction.test.js +112 -0
  466. package/test/unit/package.test.js +403 -0
  467. package/test/unit/prepare-host.test.js +299 -0
  468. package/test/unit/process-environment.test.js +18 -0
  469. package/test/unit/propagation-message.test.js +78 -0
  470. package/test/unit/redeploy-plan.test.js +24 -0
  471. package/test/unit/release-bump.test.js +474 -0
  472. package/test/unit/ssh-output-redaction.test.js +28 -0
  473. package/test/unit/start-options.test.js +46 -0
  474. package/test/unit/test-tiers.test.js +193 -0
  475. package/vitest.config.js +58 -0
  476. package/.nycrc +0 -9
  477. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  478. package/manifests/mongodb/pv-pvc.yaml +0 -59
  479. package/scripts/link-local-underpost-cli.sh +0 -6
  480. package/src/api/user/user.build.js +0 -16
  481. package/src/cli/env.js +0 -177
  482. package/src/client/components/core/Blockchain.js +0 -41
  483. package/src/client/components/core/Blog.js +0 -9
  484. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  485. package/src/client/public/default/assets/background/dark.jpg +0 -0
  486. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  487. package/src/client/public/default/assets/background/white0.jpg +0 -0
  488. package/src/client/public/doc/favicon.ico +0 -0
  489. package/src/client/public/doc/sitemap +0 -148
  490. package/src/server/cron.js +0 -476
package/src/cli/test.js CHANGED
@@ -1,174 +1,248 @@
1
1
  /**
2
- * Test module for running tests on the application.
2
+ * Runs the test tiers, wherever they have to run: on this host, inside a
3
+ * deployment's containers, or as a Job on the cluster.
4
+ *
5
+ * One entrypoint, one runner. Selecting suites, ordering tiers and rendering
6
+ * the reporting surfaces belong to `src/server/build/testing.js`; this module resolves
7
+ * where the run happens and drives it.
8
+ *
3
9
  * @module src/cli/test.js
4
10
  * @namespace UnderpostTest
5
11
  */
6
12
 
7
13
  import fs from 'fs-extra';
14
+ import nodePath from 'node:path';
8
15
  import { timer } from '../client/components/core/CommonJs.js';
9
- import { MariaDB } from '../db/mariadb/MariaDB.js';
10
- import { getNpmRootPath } from '../server/conf.js';
11
- import { actionInitLog, loggerFactory, setUpInfo } from '../server/logger.js';
12
- import { pbcopy, shellExec } from '../server/process.js';
16
+ import { getUnderpostRootPath } from '../server/runtime/environment.js';
17
+ import { actionInitLog, loggerFactory, setUpInfo } from '../server/ops/logger.js';
18
+ import { shellExec } from '../server/runtime/process.js';
19
+ import {
20
+ UNDERPOST_TESTING,
21
+ allureManifestsFactory,
22
+ resolveTestSelection,
23
+ testJobManifestFactory,
24
+ vitestArgsFactory,
25
+ } from '../server/build/testing.js';
13
26
  import Underpost from '../index.js';
27
+
14
28
  const logger = loggerFactory(import.meta);
15
29
 
16
30
  /**
17
31
  * @class UnderpostTest
18
- * @description Manages the test of the application.
32
+ * @description Manages test execution and its cluster-side reporting.
19
33
  * @memberof UnderpostTest
20
34
  */
21
35
  class UnderpostTest {
22
36
  static API = {
23
37
  /**
24
- * Logs information about the current process environment to the console.
25
- *
26
- * This function is used to log details about
27
- * the execution context, such as command-line arguments,
28
- * environment variables, the process's administrative privileges,
29
- * and the maximum available heap space size.
30
- *
31
- * @static
32
38
  * @method setUpInfo
39
+ * @description Logs the execution context a failing run has to be read against:
40
+ * arguments, environment, privileges and heap ceiling.
33
41
  * @returns {Promise<void>}
34
42
  * @memberof UnderpostTest
35
43
  */
36
44
  async setUpInfo() {
37
45
  return await setUpInfo(logger);
38
46
  },
47
+
39
48
  /**
40
49
  * @method run
41
- * @description Runs the test of the application.
50
+ * @description Runs the selected tiers on this host.
51
+ *
52
+ * Resolved against the globally installed engine when the current directory
53
+ * is not one, so `underpost test` from anywhere still runs the shipped suites
54
+ * rather than failing on a missing config.
55
+ * @param {object} [params]
56
+ * @param {string} [params.suite] - Suite or tier selector.
57
+ * @param {string} [params.grep] - Substring filter on test names.
58
+ * @param {boolean} [params.watch] - Keep the runner open and re-run on change.
59
+ * @param {boolean} [params.coverage] - Emit the coverage reporters.
60
+ * @param {boolean} [params.allure] - Also write Allure results for the dashboard.
61
+ * @returns {void}
62
+ * @throws {Error} When no engine tree with a runner configuration can be found.
42
63
  * @memberof UnderpostTest
43
64
  */
44
- run() {
65
+ run({ suite = '', grep = '', watch = false, coverage = true, allure = false } = {}) {
45
66
  actionInitLog();
46
- const underpostTestPath = `${getNpmRootPath()}/underpost`;
47
- if (fs.existsSync(underpostTestPath)) {
48
- shellExec(`cd ${underpostTestPath} && npm run test`);
49
- } else {
50
- logger.warn(`Global underpost not found at ${underpostTestPath}, running local npm test instead`);
51
- shellExec('npm test');
67
+ const root = [process.cwd(), getUnderpostRootPath()].find(
68
+ (candidate) => candidate && fs.existsSync(`${candidate}/vitest.config.js`),
69
+ );
70
+ if (!root) throw new Error('[test] no vitest.config.js in the current directory or the global underpost install');
71
+
72
+ const { projects, runVitest, delegated } = resolveTestSelection(suite);
73
+ const allureResultsDirectory =
74
+ allure &&
75
+ nodePath.resolve(
76
+ root,
77
+ process.env[UNDERPOST_TESTING.allureResultsEnvKey] || UNDERPOST_TESTING.allureResultsDirectory,
78
+ );
79
+
80
+ if (runVitest) {
81
+ const env = [
82
+ 'NODE_ENV=test',
83
+ ...(allureResultsDirectory ? [`${UNDERPOST_TESTING.allureResultsEnvKey}=${allureResultsDirectory}`] : []),
84
+ ];
85
+ shellExec(
86
+ `cd ${root} && ${env.join(' ')} npx vitest ${vitestArgsFactory({ projects, grep, watch, coverage }).join(' ')}`,
87
+ );
88
+ }
89
+
90
+ for (const { name, directory, delegate } of delegated) {
91
+ const tierRoot = `${root}/${directory}`;
92
+ // A product build strips the tiers it does not own, so an absent
93
+ // directory is a tier this tree does not ship, not a failure.
94
+ if (!fs.existsSync(tierRoot)) {
95
+ logger.warn(`Skipping tier not present in this tree`, { tier: name, directory });
96
+ continue;
97
+ }
98
+ if (allureResultsDirectory) fs.mkdirSync(allureResultsDirectory, { recursive: true });
99
+ const resultsPath = allureResultsDirectory ? `${allureResultsDirectory}/TEST-${name}.xml` : '';
100
+ shellExec(`cd ${tierRoot} && ${delegate({ resultsPath, grep })}`);
52
101
  }
53
102
  },
103
+
54
104
  /**
55
- * @method callback
56
- * @description Manages the test of the application.
57
- * @param {string} deployList - The list of deployments to test.
58
- * @param {object} options - The options for the test.
59
- * @param {boolean} options.itc - If true, tests the inside container.
60
- * @param {boolean} options.sh - If true, tests the shell.
61
- * @param {boolean} options.logs - If true, tests the logs.
62
- * @param {string} options.podName - The name of the pod to test.
63
- * @param {string} options.podStatus - The status of the pod to test.
64
- * @param {string} options.kindType - The type of the kind to test.
65
- * @param {number} options.deltaMs - The delta time in milliseconds.
66
- * @param {number} options.maxAttempts - The maximum number of attempts.
105
+ * @method dashboard
106
+ * @description Applies the Allure dashboard: the results claim every run
107
+ * writes to, the report server, and the ways in.
108
+ * @param {object} params
109
+ * @param {string} [params.namespace='default'] - Target namespace.
110
+ * @param {string} [params.host] - Hostname to route the dashboard sub-path on.
111
+ * @param {boolean} [params.dryRun] - Print the manifests instead of applying them.
112
+ * @returns {string} The rendered manifests.
67
113
  * @memberof UnderpostTest
68
114
  */
69
- async callback(
70
- deployList = '',
71
- options = {
72
- itc: false,
73
- sh: false,
74
- logs: false,
75
- podName: '',
76
- podStatus: '',
77
- kindType: '',
78
- deltaMs: 1000,
79
- maxAttempts: 60 * 5,
80
- },
81
- ) {
82
- if (
83
- options.podName &&
84
- typeof options.podName === 'string' &&
85
- options.podStatus &&
86
- typeof options.podStatus === 'string'
87
- )
88
- return await Underpost.test.statusMonitor(options.podName, options.podStatus, options.kindType);
115
+ dashboard({ namespace = 'default', host = '', dryRun = false } = {}) {
116
+ const manifests = allureManifestsFactory({ namespace, host });
117
+ if (dryRun) {
118
+ console.log(manifests);
119
+ return manifests;
120
+ }
121
+ shellExec(`sudo kubectl apply -f - <<'EOF'\n${manifests}\nEOF`);
122
+ const { allure } = UNDERPOST_TESTING;
123
+ logger.info('Allure dashboard applied', {
124
+ namespace,
125
+ nodePort: allure.nodePort,
126
+ url: host ? `https://${host}${allure.subPath}` : '',
127
+ });
128
+ return manifests;
129
+ },
89
130
 
90
- if (options.sh === true || options.logs === true) {
91
- const [pod] = Underpost.kubectl.get(deployList);
92
- if (pod) {
93
- if (options.sh) return pbcopy(`sudo kubectl exec -it ${pod.NAME} -- sh`);
94
- if (options.logs) return shellExec(`sudo kubectl logs -f ${pod.NAME}`);
95
- }
96
- return logger.warn(`Couldn't find pods in deployment`, deployList);
131
+ /**
132
+ * @method job
133
+ * @description Runs one suite on the cluster as a Job.
134
+ *
135
+ * The Job writes into the same claim the dashboard reads, so its results are
136
+ * published by finishing — there is no upload step to fail separately from
137
+ * the tests it would have reported.
138
+ * @param {object} params
139
+ * @param {string} params.image - Image carrying the engine and its dependencies.
140
+ * @param {string} [params.suite] - Suite or tier selector.
141
+ * @param {string} [params.namespace='default'] - Target namespace.
142
+ * @param {string} [params.nodeName] - Pins the pod to one node.
143
+ * @param {boolean} [params.dryRun] - Print the manifest instead of applying it.
144
+ * @returns {Promise<boolean>} Whether the Job's pod reached completion.
145
+ * @throws {Error} When no image is given.
146
+ * @memberof UnderpostTest
147
+ */
148
+ async job({ image = '', suite = '', namespace = 'default', nodeName = '', dryRun = false } = {}) {
149
+ if (!image) throw new Error('[test] --job needs --image: the Job has no engine tree of its own');
150
+ const name = `${UNDERPOST_TESTING.job.namePrefix}-${(suite || 'all').replace(/[^a-z0-9]+/g, '-')}-${Date.now()}`;
151
+ const manifest = testJobManifestFactory({ name, namespace, image, suite, nodeName });
152
+ if (dryRun) {
153
+ console.log(manifest);
154
+ return true;
97
155
  }
98
- if (deployList) {
99
- for (const _deployId of deployList.split(',')) {
100
- const deployId = _deployId.trim();
101
- if (!deployId) continue;
102
- if (options.itc === true)
103
- switch (deployId) {
104
- case 'dd-lampp':
105
- {
106
- const { MARIADB_HOST, MARIADB_USER, MARIADB_PASSWORD, DD_LAMPP_TEST_DB_0 } = process.env;
156
+ shellExec(`sudo kubectl apply -f - <<'EOF'\n${manifest}\nEOF`);
157
+ return await Underpost.test.statusMonitor(name, 'Completed', 'pods');
158
+ },
107
159
 
108
- await MariaDB.query({
109
- host: MARIADB_HOST,
110
- user: MARIADB_USER,
111
- password: MARIADB_PASSWORD,
112
- query: `SHOW TABLES FROM ${DD_LAMPP_TEST_DB_0}`,
113
- });
114
- }
115
- break;
160
+ /**
161
+ * @method callback
162
+ * @description `underpost test` entrypoint.
163
+ * @param {string} [suite] - Suite or tier selector.
164
+ * @param {object} [options]
165
+ * @param {boolean} [options.itc] - Run here rather than dispatching into pods.
166
+ * @param {string} [options.deployList] - Comma separated deploy ids to run inside.
167
+ * @param {boolean} [options.dashboard] - Apply the Allure dashboard and exit.
168
+ * @param {boolean} [options.job] - Run the suite as a cluster Job.
169
+ * @param {boolean} [options.allure] - Write Allure results alongside the run.
170
+ * @param {string} [options.grep] - Substring filter on test names.
171
+ * @param {boolean} [options.watch] - Keep the runner open and re-run on change.
172
+ * @param {boolean} [options.coverage] - Emit the coverage reporters.
173
+ * @param {string} [options.namespace] - Namespace for the cluster-side actions.
174
+ * @param {string} [options.image] - Image for `--job`.
175
+ * @param {string} [options.nodeName] - Node pin for `--job`.
176
+ * @param {string} [options.host] - Hostname for the dashboard route.
177
+ * @param {boolean} [options.dryRun] - Render manifests without applying them.
178
+ * @param {string} [options.podName] - Wait for this object instead of running tests.
179
+ * @param {string} [options.podStatus] - Status `--pod-name` waits for.
180
+ * @param {string} [options.kindType] - Kind `--pod-name` queries.
181
+ * @returns {Promise<void>}
182
+ * @memberof UnderpostTest
183
+ */
184
+ async callback(suite = '', options = {}) {
185
+ const { itc, deployList, dashboard, job, podName, podStatus, kindType, namespace = 'default' } = options;
116
186
 
117
- default:
118
- {
119
- shellExec('npm run test');
120
- }
187
+ if (podName) return void (await Underpost.test.statusMonitor(podName, podStatus || 'Running', kindType));
188
+ if (dashboard) return void Underpost.test.dashboard(options);
189
+ if (job) return void (await Underpost.test.job({ ...options, suite }));
121
190
 
122
- break;
123
- }
124
- else {
125
- const pods = Underpost.kubectl.get(deployId);
126
- if (pods.length > 0)
127
- for (const deployData of pods) {
128
- const { NAME } = deployData;
129
- shellExec(
130
- `sudo kubectl exec -i ${NAME} -- sh -c "cd /home/dd/engine && underpost test ${deployId} --inside-container"`,
131
- );
132
- }
133
- else logger.warn(`Couldn't find pods in deployment`, { deployId });
191
+ if (deployList && !itc) {
192
+ for (const deployId of deployList
193
+ .split(',')
194
+ .map((value) => value.trim())
195
+ .filter(Boolean)) {
196
+ const pods = Underpost.kubectl.get(deployId, 'pods', namespace);
197
+ if (pods.length === 0) {
198
+ logger.warn(`Couldn't find pods in deployment`, { deployId });
199
+ continue;
134
200
  }
201
+ for (const { NAME } of pods)
202
+ Underpost.kubectl.exec({
203
+ podName: NAME,
204
+ namespace,
205
+ command: `cd ${UNDERPOST_TESTING.job.workingDirectory} && underpost test ${suite} --itc`,
206
+ });
135
207
  }
136
- } else return Underpost.test.run();
208
+ return;
209
+ }
210
+
211
+ return void Underpost.test.run({ ...options, suite });
137
212
  },
213
+
138
214
  /**
139
215
  * @method statusMonitor
140
- * @description Monitors the status of a pod.
141
- * @param {string} podName - The name of the pod to monitor.
142
- * @param {string} status - The status of the pod to monitor.
143
- * @param {string} kindType - The type of the kind to monitor.
144
- * @param {number} deltaMs - The delta time in milliseconds.
145
- * @param {number} maxAttempts - The maximum number of attempts.
216
+ * @description Waits for a cluster object to reach a status.
217
+ *
218
+ * `Completed` is accepted wherever `Running` was asked for: a Job's pod and a
219
+ * one-shot container both satisfy "it came up" by having finished, and a
220
+ * caller polling for readiness would otherwise time out on a success.
221
+ * @param {string} podName - Name, or name substring, of the object to watch.
222
+ * @param {string} [status='Running'] - Status to wait for.
223
+ * @param {string} [kindType='pods'] - Kind to query.
224
+ * @param {number} [deltaMs=1000] - Delay between attempts.
225
+ * @param {number} [maxAttempts=300] - Attempts before giving up.
226
+ * @returns {Promise<boolean>} Whether the status was reached.
146
227
  * @memberof UnderpostTest
147
228
  */
148
- statusMonitor(podName, status = 'Running', kindType = '', deltaMs = 1000, maxAttempts = 60 * 5) {
149
- if (!(kindType && typeof kindType === 'string')) kindType = 'pods';
150
- return new Promise(async (resolve) => {
151
- let index = 0;
152
- logger.info(`Loading instance`, { podName, status, kindType, deltaMs, maxAttempts });
153
- const _monitor = async () => {
154
- await timer(deltaMs);
155
- const pods = Underpost.kubectl.get(podName, kindType);
156
- let result = pods.find((p) => p.STATUS === status || (status === 'Running' && p.STATUS === 'Completed'));
157
- logger.info(
158
- `Testing pod ${podName}... ${result ? 1 : 0}/1 - elapsed time ${deltaMs * (index + 1)}s - attempt ${index + 1
159
- }/${maxAttempts}`,
160
- pods[0] ? pods[0].STATUS : 'Not found kind object',
161
- );
162
- if (result) return resolve(true);
163
- index++;
164
- if (index === maxAttempts) {
165
- logger.error(`Failed to test pod ${podName} within ${maxAttempts} attempts`);
166
- return resolve(false);
167
- }
168
- return _monitor();
169
- };
170
- await _monitor();
171
- });
229
+ async statusMonitor(podName, status = 'Running', kindType = 'pods', deltaMs = 1000, maxAttempts = 60 * 5) {
230
+ if (!kindType) kindType = 'pods';
231
+ logger.info(`Loading instance`, { podName, status, kindType, deltaMs, maxAttempts });
232
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
233
+ await timer(deltaMs);
234
+ const pods = Underpost.kubectl.get(podName, kindType);
235
+ const reached = pods.find(
236
+ (pod) => pod.STATUS === status || (status === 'Running' && pod.STATUS === 'Completed'),
237
+ );
238
+ logger.info(
239
+ `Testing pod ${podName}... ${reached ? 1 : 0}/1 - elapsed time ${deltaMs * attempt}ms - attempt ${attempt}/${maxAttempts}`,
240
+ pods[0] ? pods[0].STATUS : 'Not found kind object',
241
+ );
242
+ if (reached) return true;
243
+ }
244
+ logger.error(`Failed to test pod ${podName} within ${maxAttempts} attempts`);
245
+ return false;
172
246
  },
173
247
  };
174
248
  }