cancan-microstack 0.0.1__py3-none-any.whl

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 (440) hide show
  1. cancan_microstack/__init__.py +14 -0
  2. cancan_microstack/__version__.py +10 -0
  3. cancan_microstack/assets/__init__.py +6 -0
  4. cancan_microstack/assets/builds/caddy/Caddyfile +187 -0
  5. cancan_microstack/assets/builds/caddy/DEPLOYMENT.md +303 -0
  6. cancan_microstack/assets/builds/caddy/Dockerfile +46 -0
  7. cancan_microstack/assets/builds/caddy/README.md +343 -0
  8. cancan_microstack/assets/builds/caddy/geoip/README.md +5 -0
  9. cancan_microstack/assets/builds/caddy/start.sh +78 -0
  10. cancan_microstack/assets/builds/caddy/waf/coraza.conf +179 -0
  11. cancan_microstack/assets/builds/service/Dockerfile +59 -0
  12. cancan_microstack/assets/builds/service/README.md +13 -0
  13. cancan_microstack/assets/ddl/create_db.sql +22 -0
  14. cancan_microstack/assets/ddl/infra/execution_log_tbl.sql +46 -0
  15. cancan_microstack/assets/ddl/infra/node_instance_tbl.sql +56 -0
  16. cancan_microstack/assets/ddl/infra/service_action_log_tbl.sql +36 -0
  17. cancan_microstack/assets/ddl/infra/service_config_tbl.sql +26 -0
  18. cancan_microstack/assets/ddl/infra/service_info_tbl.sql +45 -0
  19. cancan_microstack/assets/ddl/infra/service_instance_tbl.sql +54 -0
  20. cancan_microstack/assets/ddl/infra/service_operation_tbl.sql +47 -0
  21. cancan_microstack/assets/ddl/infra/workflow_definition_tbl.sql +60 -0
  22. cancan_microstack/assets/ddl/infra/workflow_definition_version_tbl.sql +35 -0
  23. cancan_microstack/assets/ddl/infra/workflow_engine_alert_tbl.sql +34 -0
  24. cancan_microstack/assets/ddl/infra/workflow_run_tbl.sql +52 -0
  25. cancan_microstack/assets/ddl/ops/admin_user_tbl.sql +34 -0
  26. cancan_microstack/assets/ddl/ops/caddy_access_log_tbl.sql +91 -0
  27. cancan_microstack/assets/ddl/ops/caddy_certificate_tbl.sql +59 -0
  28. cancan_microstack/assets/ddl/ops/caddy_rate_limit_tbl.sql +64 -0
  29. cancan_microstack/assets/ddl/ops/caddy_route_tbl.sql +63 -0
  30. cancan_microstack/assets/ddl/ops/caddy_stats_tbl.sql +77 -0
  31. cancan_microstack/assets/ddl/trigger.sql +21 -0
  32. cancan_microstack/assets/docker/docker-compose.infra.yml +401 -0
  33. cancan_microstack/assets/scripts/README.md +195 -0
  34. cancan_microstack/assets/scripts/docker/build_images.sh +44 -0
  35. cancan_microstack/assets/scripts/docker/force_rebuild_images.sh +38 -0
  36. cancan_microstack/assets/scripts/docker/rebuild_all.sh +34 -0
  37. cancan_microstack/assets/scripts/docker/rebuild_compose.sh +61 -0
  38. cancan_microstack/assets/scripts/docker/restart.sh +35 -0
  39. cancan_microstack/assets/scripts/docker/restart_compose.sh +35 -0
  40. cancan_microstack/assets/scripts/docker/start.sh +78 -0
  41. cancan_microstack/assets/scripts/docker/start_all.sh +46 -0
  42. cancan_microstack/assets/scripts/docker/start_compose.sh +66 -0
  43. cancan_microstack/assets/scripts/docker/stop.sh +67 -0
  44. cancan_microstack/assets/scripts/docker/stop_all.sh +38 -0
  45. cancan_microstack/assets/scripts/docker/stop_compose.sh +38 -0
  46. cancan_microstack/assets/scripts/podman/build_images_podman.sh +59 -0
  47. cancan_microstack/assets/scripts/podman/cleanup_podman.sh +25 -0
  48. cancan_microstack/assets/scripts/podman/force_rebuild_images_podman.sh +56 -0
  49. cancan_microstack/assets/scripts/podman/rebuild_all_podman.sh +37 -0
  50. cancan_microstack/assets/scripts/podman/rebuild_compose_podman.sh +60 -0
  51. cancan_microstack/assets/scripts/podman/restart_compose_podman.sh +73 -0
  52. cancan_microstack/assets/scripts/podman/start_all_podman.sh +66 -0
  53. cancan_microstack/assets/scripts/podman/start_compose_podman.sh +80 -0
  54. cancan_microstack/assets/scripts/podman/start_podman.sh +91 -0
  55. cancan_microstack/assets/scripts/podman/stop.sh +73 -0
  56. cancan_microstack/assets/scripts/podman/stop_all_podman.sh +34 -0
  57. cancan_microstack/assets/scripts/podman/stop_compose_podman.sh +58 -0
  58. cancan_microstack/assets/scripts/start_controllersrv.sh +9 -0
  59. cancan_microstack/assets/scripts/utils/check_all_db_tables.sh +104 -0
  60. cancan_microstack/assets/scripts/utils/check_env.sh +177 -0
  61. cancan_microstack/assets/scripts/utils/check_service_management_deployment.sh +225 -0
  62. cancan_microstack/assets/scripts/utils/deploy_service_management.sh +176 -0
  63. cancan_microstack/assets/scripts/utils/force_reload_infrasrv.sh +52 -0
  64. cancan_microstack/assets/scripts/utils/monitor_service_management.sh +187 -0
  65. cancan_microstack/assets/scripts/utils/reset_postgres_volume.sh +68 -0
  66. cancan_microstack/assets/scripts/utils/test_async_operations.sh +141 -0
  67. cancan_microstack/assets/scripts/utils/verify_real_operations.sh +76 -0
  68. cancan_microstack/assets/service/Dockerfile +65 -0
  69. cancan_microstack/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-BOKUurnM.js +1 -0
  70. cancan_microstack/assets/www/adminops/assets/ConfigManage-DKV5YOUz.js +1 -0
  71. cancan_microstack/assets/www/adminops/assets/ConfigManage-Y5bhy7wG.css +1 -0
  72. cancan_microstack/assets/www/adminops/assets/ConsoleManage-8ljYvCW2.js +1 -0
  73. cancan_microstack/assets/www/adminops/assets/ConsoleManage-BWpyqbuQ.css +1 -0
  74. cancan_microstack/assets/www/adminops/assets/DashboardNew-B9Nf1OPl.js +1 -0
  75. cancan_microstack/assets/www/adminops/assets/DashboardNew-DYWZKQ1V.css +1 -0
  76. cancan_microstack/assets/www/adminops/assets/LogSearch-CA0Jhe78.js +1 -0
  77. cancan_microstack/assets/www/adminops/assets/LogSearch-CCZfTNPF.css +1 -0
  78. cancan_microstack/assets/www/adminops/assets/LoginView-BId3kP3M.css +1 -0
  79. cancan_microstack/assets/www/adminops/assets/LoginView-BQZTV_Qy.js +1 -0
  80. cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-BdEYwqFq.js +1 -0
  81. cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-D-pASR8G.css +1 -0
  82. cancan_microstack/assets/www/adminops/assets/PageContainer-Byss-yUC.js +1 -0
  83. cancan_microstack/assets/www/adminops/assets/PageContainer-C3nSZwM7.css +1 -0
  84. cancan_microstack/assets/www/adminops/assets/RateLimitManage-BDI8jLpC.css +1 -0
  85. cancan_microstack/assets/www/adminops/assets/RateLimitManage-DJY4NiF-.js +1 -0
  86. cancan_microstack/assets/www/adminops/assets/RouteManage-DaUQ4QLw.css +1 -0
  87. cancan_microstack/assets/www/adminops/assets/RouteManage-w9XCU0UA.js +1 -0
  88. cancan_microstack/assets/www/adminops/assets/ServiceCard-BFzHe6Tw.css +1 -0
  89. cancan_microstack/assets/www/adminops/assets/ServiceCard-BJUhWnA-.js +1 -0
  90. cancan_microstack/assets/www/adminops/assets/ServiceDetail-Cw24WuKp.js +1 -0
  91. cancan_microstack/assets/www/adminops/assets/ServiceDetail-Yum47zdB.css +1 -0
  92. cancan_microstack/assets/www/adminops/assets/ServiceList-C7ryvbhE.js +1 -0
  93. cancan_microstack/assets/www/adminops/assets/ServiceList-Cgd01fUx.css +1 -0
  94. cancan_microstack/assets/www/adminops/assets/ServiceLogs-COpG9H0h.js +1 -0
  95. cancan_microstack/assets/www/adminops/assets/ServiceLogs-H_Alq0cf.css +1 -0
  96. cancan_microstack/assets/www/adminops/assets/StatsOverview-D0TwMQkA.js +39 -0
  97. cancan_microstack/assets/www/adminops/assets/StatsOverview-lqAN6pqM.css +1 -0
  98. cancan_microstack/assets/www/adminops/assets/TotpBindView-CWlAmzFt.js +1 -0
  99. cancan_microstack/assets/www/adminops/assets/TotpBindView-HoQC1lhx.css +1 -0
  100. cancan_microstack/assets/www/adminops/assets/TotpVerifyView-BHN1VtX1.css +1 -0
  101. cancan_microstack/assets/www/adminops/assets/TotpVerifyView-D3w_lZk8.js +1 -0
  102. cancan_microstack/assets/www/adminops/assets/WorkflowCenter-DU_mpIA0.css +1 -0
  103. cancan_microstack/assets/www/adminops/assets/WorkflowCenter-i50rZyxN.js +1 -0
  104. cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-CnHokPL9.js +1 -0
  105. cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-DaZaZpLd.css +1 -0
  106. cancan_microstack/assets/www/adminops/assets/WorkflowRuns-B09hK48c.js +1 -0
  107. cancan_microstack/assets/www/adminops/assets/WorkflowRuns-wGutKIIU.css +1 -0
  108. cancan_microstack/assets/www/adminops/assets/caddy-nnCKf8fG.js +1 -0
  109. cancan_microstack/assets/www/adminops/assets/format-Cuzxgna9.js +1 -0
  110. cancan_microstack/assets/www/adminops/assets/index-CiFlm8oc.js +64 -0
  111. cancan_microstack/assets/www/adminops/assets/index-UW0T1Dkc.css +1 -0
  112. cancan_microstack/assets/www/adminops/assets/service-BYlgGPs_.js +1 -0
  113. cancan_microstack/assets/www/adminops/assets/service-operation-6GzLw2Z1.js +1 -0
  114. cancan_microstack/assets/www/adminops/assets/style-CcIXnQ5y.css +1 -0
  115. cancan_microstack/assets/www/adminops/assets/style-lRnStdGu.js +39 -0
  116. cancan_microstack/assets/www/adminops/assets/useDebounce-BRlqfXqf.js +1 -0
  117. cancan_microstack/assets/www/adminops/assets/workflow-CUXs39Ac.js +1 -0
  118. cancan_microstack/assets/www/adminops/index.html +16 -0
  119. cancan_microstack/assets/www/adminops/vite.svg +1 -0
  120. cancan_microstack/cli/__init__.py +14 -0
  121. cancan_microstack/cli/__main__.py +9 -0
  122. cancan_microstack/cli/main.py +552 -0
  123. cancan_microstack/cmd/__init__.py +54 -0
  124. cancan_microstack/cmd/cancan/__init__.py +12 -0
  125. cancan_microstack/cmd/cancan/run.py +395 -0
  126. cancan_microstack/cmd/controllersrv/__init__.py +0 -0
  127. cancan_microstack/cmd/controllersrv/run.py +131 -0
  128. cancan_microstack/cmd/infrasrv/__init__.py +5 -0
  129. cancan_microstack/cmd/infrasrv/run.py +100 -0
  130. cancan_microstack/cmd/opsbffsrv/__init__.py +5 -0
  131. cancan_microstack/cmd/opsbffsrv/run.py +96 -0
  132. cancan_microstack/core/__init__.py +5 -0
  133. cancan_microstack/core/assets.py +123 -0
  134. cancan_microstack/core/compose_builder.py +102 -0
  135. cancan_microstack/core/doctor.py +152 -0
  136. cancan_microstack/core/microstack.py +71 -0
  137. cancan_microstack/core/runner.py +56 -0
  138. cancan_microstack/core/stack_manager.py +186 -0
  139. cancan_microstack/public/__init__.py +7 -0
  140. cancan_microstack/public/api/__init__.py +1 -0
  141. cancan_microstack/public/api/controllersrv_client.py +277 -0
  142. cancan_microstack/public/api/infrasrv_client.py +404 -0
  143. cancan_microstack/public/const/__init__.py +1 -0
  144. cancan_microstack/public/const/action_consts.py +18 -0
  145. cancan_microstack/public/const/app_consts.py +42 -0
  146. cancan_microstack/public/const/caddy_consts.py +22 -0
  147. cancan_microstack/public/const/controllersrv_consts.py +163 -0
  148. cancan_microstack/public/const/docker_consts.py +15 -0
  149. cancan_microstack/public/const/error.py +56 -0
  150. cancan_microstack/public/const/health_consts.py +52 -0
  151. cancan_microstack/public/const/hook_enums.py +56 -0
  152. cancan_microstack/public/const/logging_enums.py +13 -0
  153. cancan_microstack/public/const/metrics_enums.py +36 -0
  154. cancan_microstack/public/const/monitor_enums.py +26 -0
  155. cancan_microstack/public/const/operation_consts.py +53 -0
  156. cancan_microstack/public/const/opsbffsrv_error.py +92 -0
  157. cancan_microstack/public/const/overrides_consts.py +13 -0
  158. cancan_microstack/public/const/redis.py +17 -0
  159. cancan_microstack/public/const/service_consts.py +15 -0
  160. cancan_microstack/public/const/workflow_consts.py +65 -0
  161. cancan_microstack/public/error.py +41 -0
  162. cancan_microstack/public/logging/__init__.py +0 -0
  163. cancan_microstack/public/logging/initializer.py +109 -0
  164. cancan_microstack/public/logging/mq_handler.py +279 -0
  165. cancan_microstack/public/schemas/__init__.py +1 -0
  166. cancan_microstack/public/schemas/caddy/__init__.py +381 -0
  167. cancan_microstack/public/schemas/caddy/analysis.py +90 -0
  168. cancan_microstack/public/schemas/caddy/route.py +18 -0
  169. cancan_microstack/public/schemas/common.py +79 -0
  170. cancan_microstack/public/schemas/controllersrv/__init__.py +3 -0
  171. cancan_microstack/public/schemas/controllersrv/async_requests.py +30 -0
  172. cancan_microstack/public/schemas/controllersrv/compose_models.py +47 -0
  173. cancan_microstack/public/schemas/controllersrv/const.py +24 -0
  174. cancan_microstack/public/schemas/controllersrv/docker_models.py +45 -0
  175. cancan_microstack/public/schemas/controllersrv/docker_responses.py +104 -0
  176. cancan_microstack/public/schemas/controllersrv/requests.py +54 -0
  177. cancan_microstack/public/schemas/controllersrv/responses.py +124 -0
  178. cancan_microstack/public/schemas/controllersrv/task_models.py +102 -0
  179. cancan_microstack/public/schemas/controllersrv/validation.py +23 -0
  180. cancan_microstack/public/schemas/hook_metrics.py +124 -0
  181. cancan_microstack/public/schemas/hooks.py +39 -0
  182. cancan_microstack/public/schemas/infra/__init__.py +0 -0
  183. cancan_microstack/public/schemas/infra/cleanup.py +25 -0
  184. cancan_microstack/public/schemas/infra/container.py +74 -0
  185. cancan_microstack/public/schemas/infra/enums.py +135 -0
  186. cancan_microstack/public/schemas/infra/health_check.py +42 -0
  187. cancan_microstack/public/schemas/infra/hook_log.py +42 -0
  188. cancan_microstack/public/schemas/infra/operation.py +90 -0
  189. cancan_microstack/public/schemas/infra/overview.py +25 -0
  190. cancan_microstack/public/schemas/infra/push.py +33 -0
  191. cancan_microstack/public/schemas/infra/service_action_log.py +47 -0
  192. cancan_microstack/public/schemas/infra/service_config.py +10 -0
  193. cancan_microstack/public/schemas/infra/service_info.py +69 -0
  194. cancan_microstack/public/schemas/infra/service_instance.py +93 -0
  195. cancan_microstack/public/schemas/infra/service_management.py +152 -0
  196. cancan_microstack/public/schemas/infra/service_operation.py +79 -0
  197. cancan_microstack/public/schemas/infra/service_registry.py +158 -0
  198. cancan_microstack/public/schemas/infra/status_types.py +19 -0
  199. cancan_microstack/public/schemas/infra/workflow.py +566 -0
  200. cancan_microstack/public/schemas/logging/__init__.py +1 -0
  201. cancan_microstack/public/schemas/logging/log_event.py +121 -0
  202. cancan_microstack/public/schemas/opsbffsrv/__init__.py +1 -0
  203. cancan_microstack/public/schemas/opsbffsrv/async_ops.py +17 -0
  204. cancan_microstack/public/schemas/opsbffsrv/db_admin.py +147 -0
  205. cancan_microstack/public/schemas/opsbffsrv/db_init.py +48 -0
  206. cancan_microstack/public/schemas/opsbffsrv/service_config.py +89 -0
  207. cancan_microstack/public/schemas/opsbffsrv/service_logs.py +54 -0
  208. cancan_microstack/public/schemas/service_operation.py +24 -0
  209. cancan_microstack/public/schemas/service_registry.py +40 -0
  210. cancan_microstack/public/types/__init__.py +7 -0
  211. cancan_microstack/public/web/__init__.py +0 -0
  212. cancan_microstack/public/web/config_value.py +105 -0
  213. cancan_microstack/public/web/server.py +385 -0
  214. cancan_microstack/py.typed +0 -0
  215. cancan_microstack/runtime/__init__.py +0 -0
  216. cancan_microstack/runtime/compose_cmd.py +228 -0
  217. cancan_microstack/runtime/host_daemon.py +318 -0
  218. cancan_microstack/runtime/overrides.py +103 -0
  219. cancan_microstack/runtime/resources.py +25 -0
  220. cancan_microstack/runtime/workspace.py +94 -0
  221. cancan_microstack/services/__init__.py +0 -0
  222. cancan_microstack/services/controllersrv/__init__.py +8 -0
  223. cancan_microstack/services/controllersrv/application/__init__.py +0 -0
  224. cancan_microstack/services/controllersrv/application/docker_compose_app.py +427 -0
  225. cancan_microstack/services/controllersrv/conf/__init__.py +0 -0
  226. cancan_microstack/services/controllersrv/conf/config.py +76 -0
  227. cancan_microstack/services/controllersrv/conf/settings.py +54 -0
  228. cancan_microstack/services/controllersrv/domain/__init__.py +0 -0
  229. cancan_microstack/services/controllersrv/domain/docker_compose/__init__.py +0 -0
  230. cancan_microstack/services/controllersrv/domain/docker_compose/docker_compose_domain.py +278 -0
  231. cancan_microstack/services/controllersrv/domain/service_validator.py +327 -0
  232. cancan_microstack/services/controllersrv/domain/task/__init__.py +17 -0
  233. cancan_microstack/services/controllersrv/domain/task/task_queue.py +286 -0
  234. cancan_microstack/services/controllersrv/domain/task/task_worker.py +495 -0
  235. cancan_microstack/services/controllersrv/infrastructure/__init__.py +0 -0
  236. cancan_microstack/services/controllersrv/interface/__init__.py +0 -0
  237. cancan_microstack/services/controllersrv/interface/api/__init__.py +0 -0
  238. cancan_microstack/services/controllersrv/interface/api/docker_control_api.py +470 -0
  239. cancan_microstack/services/controllersrv/router.py +132 -0
  240. cancan_microstack/services/infrasrv/__init__.py +4 -0
  241. cancan_microstack/services/infrasrv/application/__init__.py +0 -0
  242. cancan_microstack/services/infrasrv/application/health_check_app.py +24 -0
  243. cancan_microstack/services/infrasrv/application/logging/__init__.py +1 -0
  244. cancan_microstack/services/infrasrv/application/logging/log_ingestion_service.py +183 -0
  245. cancan_microstack/services/infrasrv/application/service_config.py +22 -0
  246. cancan_microstack/services/infrasrv/application/service_logs_app.py +53 -0
  247. cancan_microstack/services/infrasrv/application/service_management_app.py +689 -0
  248. cancan_microstack/services/infrasrv/application/service_operation_tracker.py +251 -0
  249. cancan_microstack/services/infrasrv/application/service_registry.py +53 -0
  250. cancan_microstack/services/infrasrv/application/workflow/__init__.py +0 -0
  251. cancan_microstack/services/infrasrv/application/workflow/workflow_app.py +991 -0
  252. cancan_microstack/services/infrasrv/application/workflow/workflow_queue.py +302 -0
  253. cancan_microstack/services/infrasrv/application/workflow/workflow_tasks.py +46 -0
  254. cancan_microstack/services/infrasrv/application/workflow/workflow_worker_runtime.py +122 -0
  255. cancan_microstack/services/infrasrv/conf/__init__.py +0 -0
  256. cancan_microstack/services/infrasrv/conf/config.py +98 -0
  257. cancan_microstack/services/infrasrv/domain/__init__.py +0 -0
  258. cancan_microstack/services/infrasrv/domain/health_check/__init__.py +3 -0
  259. cancan_microstack/services/infrasrv/domain/health_check/health_check_domain.py +576 -0
  260. cancan_microstack/services/infrasrv/domain/hooks/__init__.py +19 -0
  261. cancan_microstack/services/infrasrv/domain/hooks/builtin_hooks.py +308 -0
  262. cancan_microstack/services/infrasrv/domain/hooks/hook_registry.py +43 -0
  263. cancan_microstack/services/infrasrv/domain/hooks/hooks_log_utils.py +275 -0
  264. cancan_microstack/services/infrasrv/domain/hooks/init.py +17 -0
  265. cancan_microstack/services/infrasrv/domain/hooks/metrics.py +205 -0
  266. cancan_microstack/services/infrasrv/domain/hooks/pre_registration_hooks.py +490 -0
  267. cancan_microstack/services/infrasrv/domain/registry/__init__.py +0 -0
  268. cancan_microstack/services/infrasrv/domain/registry/service_registry.py +509 -0
  269. cancan_microstack/services/infrasrv/domain/service_config/__init__.py +0 -0
  270. cancan_microstack/services/infrasrv/domain/service_config/service_config.py +50 -0
  271. cancan_microstack/services/infrasrv/domain/service_logs/__init__.py +0 -0
  272. cancan_microstack/services/infrasrv/domain/service_logs/service_logs_domain.py +51 -0
  273. cancan_microstack/services/infrasrv/domain/workflow/__init__.py +4 -0
  274. cancan_microstack/services/infrasrv/domain/workflow/engine.py +159 -0
  275. cancan_microstack/services/infrasrv/domain/workflow/node_handlers.py +509 -0
  276. cancan_microstack/services/infrasrv/domain/workflow/workflow_domain.py +164 -0
  277. cancan_microstack/services/infrasrv/infrastructure/__init__.py +0 -0
  278. cancan_microstack/services/infrasrv/infrastructure/api/__init__.py +0 -0
  279. cancan_microstack/services/infrasrv/infrastructure/api/controllersrv_api.py +165 -0
  280. cancan_microstack/services/infrasrv/infrastructure/cache/__init__.py +0 -0
  281. cancan_microstack/services/infrasrv/infrastructure/cache/service_registry_cache.py +174 -0
  282. cancan_microstack/services/infrasrv/infrastructure/db/__init__.py +0 -0
  283. cancan_microstack/services/infrasrv/infrastructure/db/model/__init__.py +0 -0
  284. cancan_microstack/services/infrasrv/infrastructure/db/model/execution_log_tbl.py +53 -0
  285. cancan_microstack/services/infrasrv/infrastructure/db/model/node_instance_tbl.py +55 -0
  286. cancan_microstack/services/infrasrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
  287. cancan_microstack/services/infrasrv/infrastructure/db/model/service_config_tbl.py +30 -0
  288. cancan_microstack/services/infrasrv/infrastructure/db/model/service_info_tbl.py +59 -0
  289. cancan_microstack/services/infrasrv/infrastructure/db/model/service_instance_tbl.py +88 -0
  290. cancan_microstack/services/infrasrv/infrastructure/db/model/service_operation_tbl.py +73 -0
  291. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_tbl.py +55 -0
  292. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_version_tbl.py +43 -0
  293. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_engine_alert_tbl.py +57 -0
  294. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_run_tbl.py +56 -0
  295. cancan_microstack/services/infrasrv/infrastructure/db/operate/__init__.py +0 -0
  296. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_action_log_op.py +239 -0
  297. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config.py +80 -0
  298. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config_manager.py +198 -0
  299. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_info_op.py +297 -0
  300. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_instance_op.py +688 -0
  301. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_operation_op.py +387 -0
  302. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_registry.py +124 -0
  303. cancan_microstack/services/infrasrv/infrastructure/db/operate/workflow_op.py +804 -0
  304. cancan_microstack/services/infrasrv/infrastructure/ddl_manager.py +31 -0
  305. cancan_microstack/services/infrasrv/infrastructure/mongo/__init__.py +1 -0
  306. cancan_microstack/services/infrasrv/infrastructure/mongo/log_repository.py +129 -0
  307. cancan_microstack/services/infrasrv/interface/__init__.py +0 -0
  308. cancan_microstack/services/infrasrv/interface/api/__init__.py +0 -0
  309. cancan_microstack/services/infrasrv/interface/api/health_check_api.py +29 -0
  310. cancan_microstack/services/infrasrv/interface/api/hooks.py +284 -0
  311. cancan_microstack/services/infrasrv/interface/api/internal.py +49 -0
  312. cancan_microstack/services/infrasrv/interface/api/internal_instance_api.py +265 -0
  313. cancan_microstack/services/infrasrv/interface/api/internal_operation_api.py +206 -0
  314. cancan_microstack/services/infrasrv/interface/api/service_config.py +50 -0
  315. cancan_microstack/services/infrasrv/interface/api/service_logs_api.py +49 -0
  316. cancan_microstack/services/infrasrv/interface/api/service_management_api.py +113 -0
  317. cancan_microstack/services/infrasrv/interface/api/service_registry.py +117 -0
  318. cancan_microstack/services/infrasrv/interface/api/workflow_api.py +303 -0
  319. cancan_microstack/services/infrasrv/interface/schedule/__init__.py +0 -0
  320. cancan_microstack/services/infrasrv/interface/schedule/cleanup.py +13 -0
  321. cancan_microstack/services/infrasrv/interface/schedule/health_check.py +27 -0
  322. cancan_microstack/services/infrasrv/interface/schedule/log_cleanup.py +26 -0
  323. cancan_microstack/services/infrasrv/interface/schedule/operation_tracker.py +25 -0
  324. cancan_microstack/services/infrasrv/interface/schedule/scheduler.py +39 -0
  325. cancan_microstack/services/infrasrv/interface/schedule/workflow_scheduler.py +115 -0
  326. cancan_microstack/services/infrasrv/router.py +341 -0
  327. cancan_microstack/services/opsbffsrv/__init__.py +4 -0
  328. cancan_microstack/services/opsbffsrv/application/__init__.py +0 -0
  329. cancan_microstack/services/opsbffsrv/application/async_operation_app.py +150 -0
  330. cancan_microstack/services/opsbffsrv/application/auth_app.py +285 -0
  331. cancan_microstack/services/opsbffsrv/application/caddy/__init__.py +0 -0
  332. cancan_microstack/services/opsbffsrv/application/caddy/access_log_analysis_app.py +344 -0
  333. cancan_microstack/services/opsbffsrv/application/caddy/access_log_ingestion_service.py +169 -0
  334. cancan_microstack/services/opsbffsrv/application/caddy/certificate_management_app.py +355 -0
  335. cancan_microstack/services/opsbffsrv/application/caddy/rate_limit_management_app.py +496 -0
  336. cancan_microstack/services/opsbffsrv/application/caddy/route_management_app.py +401 -0
  337. cancan_microstack/services/opsbffsrv/application/caddy/stats_aggregation_app.py +364 -0
  338. cancan_microstack/services/opsbffsrv/application/db_admin_app.py +103 -0
  339. cancan_microstack/services/opsbffsrv/application/db_init_app.py +283 -0
  340. cancan_microstack/services/opsbffsrv/application/logging/__init__.py +1 -0
  341. cancan_microstack/services/opsbffsrv/application/logging/log_query_app.py +28 -0
  342. cancan_microstack/services/opsbffsrv/application/service_config.py +158 -0
  343. cancan_microstack/services/opsbffsrv/application/service_logs_app.py +74 -0
  344. cancan_microstack/services/opsbffsrv/application/service_registry.py +36 -0
  345. cancan_microstack/services/opsbffsrv/application/workflow_ops_app.py +730 -0
  346. cancan_microstack/services/opsbffsrv/conf/__init__.py +0 -0
  347. cancan_microstack/services/opsbffsrv/conf/config.py +224 -0
  348. cancan_microstack/services/opsbffsrv/domain/__init__.py +0 -0
  349. cancan_microstack/services/opsbffsrv/domain/auth/__init__.py +0 -0
  350. cancan_microstack/services/opsbffsrv/domain/auth/admin_init.py +38 -0
  351. cancan_microstack/services/opsbffsrv/domain/auth/auth_domain.py +108 -0
  352. cancan_microstack/services/opsbffsrv/domain/caddy/__init__.py +0 -0
  353. cancan_microstack/services/opsbffsrv/domain/caddy/access_log_analysis.py +358 -0
  354. cancan_microstack/services/opsbffsrv/domain/caddy/certificate_management.py +325 -0
  355. cancan_microstack/services/opsbffsrv/domain/caddy/default_routes.py +53 -0
  356. cancan_microstack/services/opsbffsrv/domain/caddy/rate_limit_management.py +308 -0
  357. cancan_microstack/services/opsbffsrv/domain/caddy/route_management.py +279 -0
  358. cancan_microstack/services/opsbffsrv/domain/caddy/stats_aggregation.py +654 -0
  359. cancan_microstack/services/opsbffsrv/domain/db_admin/__init__.py +0 -0
  360. cancan_microstack/services/opsbffsrv/domain/db_admin/db_admin_domain.py +118 -0
  361. cancan_microstack/services/opsbffsrv/domain/db_init/__init__.py +3 -0
  362. cancan_microstack/services/opsbffsrv/domain/db_init/db_init_domain.py +358 -0
  363. cancan_microstack/services/opsbffsrv/domain/logging/__init__.py +1 -0
  364. cancan_microstack/services/opsbffsrv/domain/logging/log_query_domain.py +99 -0
  365. cancan_microstack/services/opsbffsrv/domain/service_config/__init__.py +0 -0
  366. cancan_microstack/services/opsbffsrv/domain/service_config/service_config.py +81 -0
  367. cancan_microstack/services/opsbffsrv/domain/service_registry/__init__.py +0 -0
  368. cancan_microstack/services/opsbffsrv/domain/service_registry/service_registry.py +292 -0
  369. cancan_microstack/services/opsbffsrv/infrastructure/__init__.py +0 -0
  370. cancan_microstack/services/opsbffsrv/infrastructure/api/__init__.py +0 -0
  371. cancan_microstack/services/opsbffsrv/infrastructure/api/infrasrv_api.py +242 -0
  372. cancan_microstack/services/opsbffsrv/infrastructure/auth/__init__.py +0 -0
  373. cancan_microstack/services/opsbffsrv/infrastructure/auth/captcha_service.py +67 -0
  374. cancan_microstack/services/opsbffsrv/infrastructure/auth/password_service.py +12 -0
  375. cancan_microstack/services/opsbffsrv/infrastructure/auth/redis_store.py +131 -0
  376. cancan_microstack/services/opsbffsrv/infrastructure/auth/totp_service.py +59 -0
  377. cancan_microstack/services/opsbffsrv/infrastructure/caddy/__init__.py +0 -0
  378. cancan_microstack/services/opsbffsrv/infrastructure/caddy/access_log_parser.py +307 -0
  379. cancan_microstack/services/opsbffsrv/infrastructure/caddy/admin_api_client.py +678 -0
  380. cancan_microstack/services/opsbffsrv/infrastructure/caddy/ip_geo_locator.py +176 -0
  381. cancan_microstack/services/opsbffsrv/infrastructure/db/__init__.py +0 -0
  382. cancan_microstack/services/opsbffsrv/infrastructure/db/model/__init__.py +0 -0
  383. cancan_microstack/services/opsbffsrv/infrastructure/db/model/admin_user_tbl.py +33 -0
  384. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_access_log_tbl.py +90 -0
  385. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_certificate_tbl.py +65 -0
  386. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_rate_limit_tbl.py +69 -0
  387. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_route_tbl.py +66 -0
  388. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_stats_tbl.py +78 -0
  389. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
  390. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_config_tbl.py +30 -0
  391. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_info_tbl.py +51 -0
  392. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_instance_tbl.py +68 -0
  393. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/__init__.py +0 -0
  394. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/admin_user_operate.py +59 -0
  395. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_access_log.py +531 -0
  396. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_certificate.py +451 -0
  397. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_rate_limit.py +360 -0
  398. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_route.py +271 -0
  399. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_stats.py +343 -0
  400. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_action_log_op.py +57 -0
  401. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_config.py +86 -0
  402. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_info_op.py +79 -0
  403. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_instance.py +58 -0
  404. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_registry.py +138 -0
  405. cancan_microstack/services/opsbffsrv/infrastructure/ddl_manager.py +31 -0
  406. cancan_microstack/services/opsbffsrv/infrastructure/mongo/__init__.py +1 -0
  407. cancan_microstack/services/opsbffsrv/infrastructure/mongo/log_query_repository.py +87 -0
  408. cancan_microstack/services/opsbffsrv/interface/__init__.py +0 -0
  409. cancan_microstack/services/opsbffsrv/interface/api/__init__.py +0 -0
  410. cancan_microstack/services/opsbffsrv/interface/api/async_operation_api.py +137 -0
  411. cancan_microstack/services/opsbffsrv/interface/api/auth_api.py +113 -0
  412. cancan_microstack/services/opsbffsrv/interface/api/caddy/__init__.py +3 -0
  413. cancan_microstack/services/opsbffsrv/interface/api/caddy/access_log_api.py +174 -0
  414. cancan_microstack/services/opsbffsrv/interface/api/caddy/certificate_api.py +235 -0
  415. cancan_microstack/services/opsbffsrv/interface/api/caddy/rate_limit_api.py +302 -0
  416. cancan_microstack/services/opsbffsrv/interface/api/caddy/route_api.py +250 -0
  417. cancan_microstack/services/opsbffsrv/interface/api/caddy/stats_api.py +243 -0
  418. cancan_microstack/services/opsbffsrv/interface/api/db_admin_api.py +62 -0
  419. cancan_microstack/services/opsbffsrv/interface/api/db_init_api.py +109 -0
  420. cancan_microstack/services/opsbffsrv/interface/api/instance_management_api.py +165 -0
  421. cancan_microstack/services/opsbffsrv/interface/api/log_query_api.py +41 -0
  422. cancan_microstack/services/opsbffsrv/interface/api/mongo_express_proxy_api.py +181 -0
  423. cancan_microstack/services/opsbffsrv/interface/api/pgweb_proxy_api.py +154 -0
  424. cancan_microstack/services/opsbffsrv/interface/api/rabbitmq_mgmt_proxy_api.py +518 -0
  425. cancan_microstack/services/opsbffsrv/interface/api/redis_commander_proxy_api.py +133 -0
  426. cancan_microstack/services/opsbffsrv/interface/api/service_config.py +146 -0
  427. cancan_microstack/services/opsbffsrv/interface/api/service_logs_api.py +81 -0
  428. cancan_microstack/services/opsbffsrv/interface/api/service_registry.py +66 -0
  429. cancan_microstack/services/opsbffsrv/interface/api/workflow_ops_api.py +413 -0
  430. cancan_microstack/services/opsbffsrv/interface/middleware/__init__.py +0 -0
  431. cancan_microstack/services/opsbffsrv/interface/middleware/auth_middleware.py +52 -0
  432. cancan_microstack/services/opsbffsrv/router.py +901 -0
  433. cancan_microstack/utils/__init__.py +1 -0
  434. cancan_microstack/utils/container_env.py +218 -0
  435. cancan_microstack-0.0.1.dist-info/METADATA +155 -0
  436. cancan_microstack-0.0.1.dist-info/RECORD +440 -0
  437. cancan_microstack-0.0.1.dist-info/WHEEL +5 -0
  438. cancan_microstack-0.0.1.dist-info/entry_points.txt +2 -0
  439. cancan_microstack-0.0.1.dist-info/licenses/LICENSE +21 -0
  440. cancan_microstack-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,31 @@
1
+ """InfraSrv DDL 管理入口
2
+ InfraSrv entry point wiring the shared AutoDDLManager with service config.
3
+ """
4
+ from pathlib import Path
5
+
6
+ from linglong_web import LinglongConfig
7
+ from linglong_web import (
8
+ AutoDDLManager,
9
+ DDLManagerConfig,
10
+ )
11
+
12
+ from cancan_microstack.runtime.resources import resolve_workspace_or_asset
13
+
14
+
15
+ def _build_manager() -> AutoDDLManager:
16
+ """构建通用 DDL 管理器实例 / Build service-specific AutoDDLManager"""
17
+
18
+ trigger_file = resolve_workspace_or_asset("ddl/trigger.sql", "ddl/trigger.sql")
19
+
20
+ config = DDLManagerConfig(
21
+ script_path=Path(LinglongConfig.DDL_SCRIPT_PATH),
22
+ enable_auto_init=LinglongConfig.ENABLE_DDL_AUTO_INIT,
23
+ trigger_sql_paths=(trigger_file,),
24
+ required_extensions=LinglongConfig.DDL_REQUIRED_EXTENSIONS,
25
+ )
26
+ return AutoDDLManager(config)
27
+
28
+
29
+ async def init_ddl() -> bool:
30
+ """初始化 DDL(供 AppServer 调用)/ Trigger schema auto-initialization"""
31
+ return await _build_manager().check_and_init_tables()
@@ -0,0 +1 @@
1
+ """infrasrv Mongo infrastructure package."""
@@ -0,0 +1,129 @@
1
+ """MongoDB 日志存储仓库 / MongoDB repository for log documents."""
2
+ import asyncio
3
+ from datetime import datetime
4
+ from typing import (
5
+ Any,
6
+ List,
7
+ )
8
+
9
+ from pymongo.asynchronous.collection import AsyncCollection
10
+ from pymongo import ASCENDING, DESCENDING
11
+
12
+ from cancan_microstack.public.schemas.logging.log_event import LogEventDocument
13
+ from linglong_web import LinglongConfig
14
+ from linglong_web import Rmanager
15
+ from linglong_web.utils import logger
16
+
17
+
18
+ class InfraLogRepository:
19
+ """封装 MongoDB 访问逻辑 / Encapsulate MongoDB operations for logs."""
20
+
21
+ def __init__(self) -> None:
22
+ """
23
+ 初始化仓库。
24
+ 它从全局资源管理器获取 MongoDB 客户端,并从配置中获取数据库和集合名称。
25
+
26
+ Initializes the repository.
27
+ It reads database/collection names from the config; the MongoDB client is read
28
+ lazily at use time (see _init_collection), since resource initialization may happen
29
+ later in the server lifecycle.
30
+ """
31
+ # 注意:不要在 __init__ 缓存 Rmanager.MongoClient。
32
+ # 该仓库可能在资源初始化之前被创建,缓存 None 会导致整个进程拿不到 client。
33
+ # 与 opsbffsrv 的 LogQueryRepository 保持一致:在使用处惰性读取。
34
+ # Note: do NOT cache Rmanager.MongoClient at __init__ time. This repo may be created
35
+ # before resources are initialized; caching None would make the client unavailable forever.
36
+ # Aligned with opsbffsrv's LogQueryRepository: read it lazily at use time.
37
+ self._db_name = LinglongConfig.MONGODB_DB
38
+ self._collection_name = LinglongConfig.MONGODB_COLLECTION
39
+ self._collection: AsyncCollection | None = None
40
+ self._index_lock = asyncio.Lock()
41
+
42
+ async def _init_collection(self) -> AsyncCollection:
43
+ """
44
+ 按需初始化集合对象并确保索引存在。
45
+ 使用锁来防止并发的索引创建。
46
+
47
+ Initializes the collection object on-demand and ensures indexes exist.
48
+ Uses a lock to prevent concurrent index creation.
49
+ """
50
+ if self._collection is not None:
51
+ return self._collection
52
+
53
+ async with self._index_lock:
54
+ # Double-check after acquiring the lock
55
+ if self._collection is not None:
56
+ return self._collection
57
+
58
+ client = Rmanager.MongoClient
59
+ if not client:
60
+ raise RuntimeError("MongoDB client is not available in Rmanager.")
61
+
62
+ collection = client[self._db_name][self._collection_name]
63
+ await self._ensure_indexes(collection)
64
+ self._collection = collection
65
+ logger.info(
66
+ "InfraLogRepository collection '%s/%s' initialized.", self._db_name, self._collection_name
67
+ )
68
+ return self._collection
69
+
70
+ async def _get_collection(self) -> AsyncCollection:
71
+ """获取集合对象,如果需要则先进行初始化。/ Gets the collection object, initializing it if necessary."""
72
+ if self._collection is not None:
73
+ return self._collection
74
+ return await self._init_collection()
75
+
76
+ async def _ensure_indexes(self, collection: AsyncCollection) -> None:
77
+ """确保 MongoDB 集合上存在所有必需的索引。/ Ensures all required indexes exist on the MongoDB collection."""
78
+ await collection.create_index(
79
+ [("service_name", ASCENDING), ("timestamp", DESCENDING)],
80
+ name="idx_service_ts",
81
+ )
82
+ await collection.create_index(
83
+ [("level", ASCENDING), ("timestamp", DESCENDING)],
84
+ name="idx_level_ts",
85
+ )
86
+ await collection.create_index(
87
+ [("ip", ASCENDING), ("timestamp", DESCENDING)],
88
+ name="idx_ip_ts",
89
+ )
90
+ await collection.create_index(
91
+ [("func_name", ASCENDING), ("timestamp", DESCENDING)],
92
+ name="idx_func_ts",
93
+ )
94
+ await collection.create_index(
95
+ [("message", "text"), ("metadata_flattened", "text")],
96
+ name="idx_text_search",
97
+ default_language="english",
98
+ )
99
+
100
+ async def insert_event(self, document: LogEventDocument) -> None:
101
+ """向集合中插入一个新的日志文档。/ Inserts a new log document into the collection."""
102
+ collection = await self._get_collection()
103
+ payload = document.model_dump()
104
+ await collection.insert_one(payload)
105
+
106
+ async def cleanup_older_than(self, cutoff: datetime, batch_limit: int) -> int:
107
+ """删除早于给定截止时间的日志。/ Deletes logs older than a given cutoff time."""
108
+ collection = await self._get_collection()
109
+ cursor = (
110
+ collection.find({"timestamp": {"$lt": cutoff}}, projection={"_id": 1})
111
+ .sort("timestamp", ASCENDING)
112
+ .limit(batch_limit)
113
+ )
114
+ ids: List[Any] = [doc["_id"] async for doc in cursor]
115
+
116
+ if not ids:
117
+ return 0
118
+ result = await collection.delete_many({"_id": {"$in": ids}})
119
+ return int(result.deleted_count)
120
+
121
+ async def count_by_time_range(self, start: datetime, end: datetime) -> int:
122
+ """计算给定时间范围内的文档数量。/ Counts documents within a given time range."""
123
+ collection = await self._get_collection()
124
+ return await collection.count_documents({"timestamp": {"$gte": start, "$lte": end}})
125
+
126
+ @property
127
+ async def collection(self) -> AsyncCollection:
128
+ """提供对底层集合对象的异步属性访问。/ Provides async property access to the underlying collection object."""
129
+ return await self._get_collection()
@@ -0,0 +1,29 @@
1
+ """
2
+ 健康检查 API
3
+
4
+ 支持多实例健康检查
5
+ """
6
+ from linglong_web import build_success_response
7
+ from cancan_microstack.public.schemas.common import APIResponse
8
+ from cancan_microstack.services.infrasrv.application.health_check_app import HealthCheckApp
9
+
10
+ _health_check_app = HealthCheckApp()
11
+
12
+
13
+ async def health_check_all_instances_handler() -> APIResponse[dict | None]:
14
+ """
15
+ 对所有实例进行健康检查
16
+
17
+ 功能:
18
+ - 支持多实例检查
19
+ - 操作窗口期豁免
20
+ - 区分正常/异常关闭
21
+ - 自动重启不健康实例
22
+
23
+ Returns:
24
+ 健康检查结果汇总
25
+ """
26
+ result = await _health_check_app.check_all_instances()
27
+
28
+ # 在 handler 层将 Pydantic model 序列化为 dict/JSON
29
+ return build_success_response(data=result.model_dump())
@@ -0,0 +1,284 @@
1
+ """
2
+ 钩子监控API接口
3
+
4
+ 提供钩子执行指标、历史记录和状态的查询接口
5
+ """
6
+ from datetime import datetime
7
+ from typing import Dict
8
+
9
+ from linglong_web import build_success_response
10
+ from cancan_microstack.public.schemas.common import APIResponse
11
+ from cancan_microstack.public.const.hook_enums import HookType
12
+ from linglong_web.utils import logger
13
+ from cancan_microstack.services.infrasrv.domain.hooks.hook_registry import get_hook_manager
14
+ from cancan_microstack.services.infrasrv.domain.hooks.metrics import get_metrics
15
+ from cancan_microstack.public.schemas.hook_metrics import (
16
+ MetricData,
17
+ MetricValue,
18
+ HookExecutionHistoryItem,
19
+ HookTypeStatus,
20
+ HooksByPriority,
21
+ HookInfo,
22
+ MetricSummary,
23
+ HookPerformance,
24
+ OverallPerformanceStats,
25
+ )
26
+
27
+
28
+ async def get_hook_metrics_handler() -> APIResponse[Dict[str, dict]]:
29
+ """
30
+ 获取钩子指标 / Get hook metrics
31
+
32
+ Returns:
33
+ 钩子执行指标 / Hook execution metrics
34
+ """
35
+ metrics = get_metrics()
36
+ all_metrics = metrics.get_all_metrics()
37
+
38
+ # 转换为 Pydantic 模型 / Convert to Pydantic models
39
+ metrics_data: Dict[str, MetricData] = {}
40
+ for metric in all_metrics:
41
+ if metric.name not in metrics_data:
42
+ metrics_data[metric.name] = MetricData(
43
+ name=metric.name,
44
+ type=metric.metric_type,
45
+ description=metric.description,
46
+ values=[]
47
+ )
48
+
49
+ metrics_data[metric.name].values.append(
50
+ MetricValue(
51
+ value=metric.value,
52
+ labels=metric.labels,
53
+ timestamp=metric.timestamp
54
+ )
55
+ )
56
+
57
+ # 转换为字典用于响应 / Convert to dict for response
58
+ result = {name: data.model_dump() for name, data in metrics_data.items()}
59
+
60
+ return build_success_response(data=result)
61
+
62
+
63
+ async def get_hook_history_handler(request) -> APIResponse[dict]:
64
+ """
65
+ 获取钩子执行历史 / Get hook execution history
66
+
67
+ Query Parameters:
68
+ hook_name: 钩子名称过滤(可选)/ Hook name filter (optional)
69
+ limit: 返回记录数限制(默认100)/ Limit of records to return (default 100)
70
+
71
+ Returns:
72
+ 钩子执行历史记录 / Hook execution history records
73
+ """
74
+ query_params = request.query_params
75
+ hook_name = query_params.get("hook_name")
76
+ limit = int(query_params.get("limit", 100))
77
+
78
+ hook_manager = get_hook_manager()
79
+ history = hook_manager.get_execution_history(
80
+ service_name=None,
81
+ hook_name=hook_name,
82
+ limit=limit
83
+ )
84
+
85
+ # 转换为 Pydantic 模型 / Convert to Pydantic models
86
+ history_items = [
87
+ HookExecutionHistoryItem(
88
+ hook_name=result.hook_name,
89
+ result=result.result,
90
+ message=result.message,
91
+ execution_time=result.execution_time,
92
+ has_modified_service_info=False # 这个字段需要从 result 中获取,如果有的话
93
+ )
94
+ for result in history
95
+ ]
96
+
97
+ return build_success_response(
98
+ data={
99
+ "total": len(history_items),
100
+ "history": [item.model_dump() for item in history_items],
101
+ }
102
+ )
103
+
104
+
105
+ async def get_hook_status_handler() -> APIResponse[dict]:
106
+ """
107
+ 获取钩子状态 / Get hook status
108
+
109
+ Returns:
110
+ 钩子状态信息 / Hook status information
111
+ """
112
+ hook_manager = get_hook_manager()
113
+
114
+ # 获取所有钩子类型 / Get all hook types
115
+ hook_types = [HookType.PRE_REGISTER, HookType.POST_REGISTER, HookType.PRE_DEREGISTER, HookType.POST_DEREGISTER]
116
+
117
+ status_data: Dict[str, HookTypeStatus] = {}
118
+ total_hooks = 0
119
+
120
+ for hook_type in hook_types:
121
+ hooks = hook_manager.get_hooks(hook_type)
122
+ total_hooks += len(hooks)
123
+
124
+ # 按优先级分组 / Group by priority
125
+ hooks_by_priority = HooksByPriority()
126
+
127
+ for hook in hooks:
128
+ hook_info = HookInfo(
129
+ name=hook.name,
130
+ priority=hook.priority.name,
131
+ type=hook.__class__.__name__
132
+ )
133
+
134
+ # 根据优先级添加到对应列表 / Add to corresponding list by priority
135
+ priority_name = hook.priority.name
136
+ if priority_name == "HIGHEST":
137
+ hooks_by_priority.CRITICAL.append(hook_info)
138
+ elif priority_name == "HIGH":
139
+ hooks_by_priority.HIGH.append(hook_info)
140
+ elif priority_name in ("MEDIUM", "NORMAL"):
141
+ hooks_by_priority.MEDIUM.append(hook_info)
142
+ else: # LOW, LOWEST
143
+ hooks_by_priority.LOW.append(hook_info)
144
+
145
+ status_data[hook_type] = HookTypeStatus(
146
+ count=len(hooks),
147
+ hooks_by_priority=hooks_by_priority
148
+ )
149
+
150
+ # 获取指标摘要 / Get metrics summary
151
+ metrics = get_metrics()
152
+ all_metrics = metrics.get_all_metrics()
153
+
154
+ metrics_summary: Dict[str, MetricSummary] = {}
155
+ for metric in all_metrics:
156
+ if metric.name not in metrics_summary:
157
+ metrics_summary[metric.name] = MetricSummary(
158
+ type=metric.metric_type,
159
+ description=metric.description,
160
+ latest_value=metric.value,
161
+ latest_timestamp=metric.timestamp
162
+ )
163
+
164
+ return build_success_response(
165
+ data={
166
+ "total_hooks": total_hooks,
167
+ "hook_types": {k: v.model_dump() for k, v in status_data.items()},
168
+ "metrics_summary": {k: v.model_dump() for k, v in metrics_summary.items()},
169
+ "timestamp": datetime.now().isoformat(),
170
+ }
171
+ )
172
+
173
+
174
+ async def reset_hook_metrics_handler() -> APIResponse[dict]:
175
+ """
176
+ 重置钩子指标 / Reset hook metrics
177
+
178
+ Returns:
179
+ 操作结果 / Operation result
180
+ """
181
+ metrics = get_metrics()
182
+ all_metrics = metrics.get_all_metrics()
183
+
184
+ # 重置所有计数器指标 / Reset all counter metrics
185
+ reset_count = 0
186
+ for metric in all_metrics:
187
+ if metric.metric_type.value == "counter":
188
+ metrics.reset_metric(metric.name)
189
+ reset_count += 1
190
+
191
+ # 清空钩子执行历史 / Clear hook execution history
192
+ hook_manager = get_hook_manager()
193
+ hook_manager.clear_history()
194
+
195
+ logger.info(f"Reset {reset_count} metrics and cleared hook history")
196
+
197
+ return build_success_response(
198
+ data={
199
+ "reset_metrics_count": reset_count,
200
+ "history_cleared": True,
201
+ }
202
+ )
203
+
204
+
205
+ async def get_hook_performance_handler(request) -> APIResponse[dict]:
206
+ """
207
+ 获取钩子性能统计 / Get hook performance statistics
208
+
209
+ Query Parameters:
210
+ hook_name: 钩子名称过滤(可选)/ Hook name filter (optional)
211
+ time_range: 时间范围(小时,默认24)/ Time range (hours, default 24)
212
+
213
+ Returns:
214
+ 钩子性能统计 / Hook performance statistics
215
+ """
216
+ query_params = request.query_params
217
+ hook_name = query_params.get("hook_name")
218
+ time_range = int(query_params.get("time_range", 24))
219
+
220
+ hook_manager = get_hook_manager()
221
+ history = hook_manager.get_execution_history(
222
+ service_name=None,
223
+ hook_name=hook_name,
224
+ limit=1000 # 获取更多历史记录 / Get more history records
225
+ )
226
+
227
+ # 由于 history 中的记录没有时间戳字段,我们直接使用所有记录 / Use all records since history doesn't have timestamp field
228
+ filtered_history = [
229
+ result for result in history
230
+ if result.execution_time > 0
231
+ ]
232
+
233
+ if not filtered_history:
234
+ return build_success_response(
235
+ data={
236
+ "message": "No performance data available in the specified time range",
237
+ "time_range_hours": time_range,
238
+ }
239
+ )
240
+
241
+ # 按钩子名称分组 / Group by hook name
242
+ performance_by_hook: Dict[str, HookPerformance] = {}
243
+ for result in filtered_history:
244
+ hook_name_key = result.hook_name
245
+ if hook_name_key not in performance_by_hook:
246
+ performance_by_hook[hook_name_key] = HookPerformance()
247
+
248
+ perf = performance_by_hook[hook_name_key]
249
+ perf.total_executions += 1
250
+ perf.total_execution_time += result.execution_time
251
+
252
+ if result.result.value == "success":
253
+ perf.successful_executions += 1
254
+ else:
255
+ perf.failed_executions += 1
256
+
257
+ if result.execution_time < perf.min_execution_time:
258
+ perf.min_execution_time = result.execution_time
259
+
260
+ if result.execution_time > perf.max_execution_time:
261
+ perf.max_execution_time = result.execution_time
262
+
263
+ # 计算平均执行时间 / Calculate average execution time
264
+ perf.avg_execution_time = perf.total_execution_time / perf.total_executions
265
+
266
+ # 计算总体统计 / Calculate overall statistics
267
+ total_executions = sum(perf.total_executions for perf in performance_by_hook.values())
268
+ total_successful = sum(perf.successful_executions for perf in performance_by_hook.values())
269
+ total_failed = sum(perf.failed_executions for perf in performance_by_hook.values())
270
+
271
+ overall_stats = OverallPerformanceStats(
272
+ total_executions=total_executions,
273
+ successful_executions=total_successful,
274
+ failed_executions=total_failed,
275
+ success_rate=(total_successful / total_executions * 100) if total_executions > 0 else 0
276
+ )
277
+
278
+ return build_success_response(
279
+ data={
280
+ "time_range_hours": time_range,
281
+ "overall_stats": overall_stats.model_dump(),
282
+ "performance_by_hook": {k: v.model_dump() for k, v in performance_by_hook.items()},
283
+ }
284
+ )
@@ -0,0 +1,49 @@
1
+ """
2
+ Internal API for infrasrv
3
+ These endpoints are called by other internal services (like opsbffsrv)
4
+ Not exposed to frontend
5
+ """
6
+ import http
7
+ from typing import Any
8
+
9
+ from linglong_web import build_success_response
10
+
11
+ from cancan_microstack.public.const.error import ErrorCode
12
+ from cancan_microstack.public.error import HTTPException
13
+ from cancan_microstack.public.schemas.common import APIResponse
14
+ from cancan_microstack.services.infrasrv.application.service_registry import ServiceRegistryApp
15
+
16
+ _service_registry_app = ServiceRegistryApp()
17
+
18
+
19
+ def _resolve_service_name(service_name: str | None, payload: dict[str, Any] | None) -> str:
20
+ """
21
+ 解析 service_name 参数,兼容 query 和 JSON body
22
+ Resolve service_name from either query param or JSON payload
23
+ """
24
+ if service_name:
25
+ return service_name
26
+
27
+ if payload and isinstance(payload.get("service_name"), str):
28
+ service_name_from_payload = payload.get("service_name", "").strip()
29
+ if service_name_from_payload:
30
+ return service_name_from_payload
31
+
32
+ raise HTTPException(
33
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
34
+ error_code=ErrorCode.MISSING_REQUIRED_PARAM,
35
+ msg="service_name is required",
36
+ )
37
+
38
+
39
+ async def internal_trigger_config_push_handler(
40
+ service_name: str | None = None,
41
+ payload: dict[str, Any] | None = None,
42
+ ) -> APIResponse[dict | None]:
43
+ """
44
+ 内部接口:触发配置推送
45
+ 由 opsbffsrv 调用,在配置更新后触发 infrasrv 向服务实例推送新配置
46
+ """
47
+ resolved_service_name = _resolve_service_name(service_name=service_name, payload=payload)
48
+ result = await _service_registry_app.push_config_to_service(resolved_service_name)
49
+ return build_success_response(data=result)