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,308 @@
1
+ """
2
+ 预注册钩子
3
+ 使用预注册钩子机制扩展服务注册功能
4
+ """
5
+ from typing import (
6
+ Dict,
7
+ Any,
8
+ )
9
+ from datetime import (
10
+ datetime,
11
+ timezone,
12
+ )
13
+
14
+ from .pre_registration_hooks import (
15
+ BaseHook,
16
+ HookResult,
17
+ HookPriority,
18
+ HookContext,
19
+ HookExecutionResult,
20
+ )
21
+ from .hook_registry import get_hook_manager
22
+ from linglong_web.utils import logger
23
+
24
+
25
+ class ServiceNameValidationHook(BaseHook):
26
+ """服务名称验证钩子
27
+
28
+ 验证服务名称是否符合规范
29
+ """
30
+
31
+ def __init__(self):
32
+ super().__init__("service_name_validation", HookPriority.HIGH)
33
+
34
+ async def execute(self, context: HookContext) -> HookExecutionResult:
35
+ service_name = context.service_name
36
+
37
+ # 验证服务名称不为空
38
+ if not service_name or not service_name.strip():
39
+ return HookExecutionResult(
40
+ hook_name=self.name,
41
+ result=HookResult.FAILURE,
42
+ message="Service name cannot be empty"
43
+ )
44
+
45
+ # 验证服务名称格式(只允许字母、数字、下划线和连字符)
46
+ import re
47
+ if not re.match(r'^[a-zA-Z0-9_-]+$', service_name):
48
+ return HookExecutionResult(
49
+ hook_name=self.name,
50
+ result=HookResult.FAILURE,
51
+ message="Service name can only contain letters, numbers, underscores and hyphens"
52
+ )
53
+
54
+ # 验证服务名称长度
55
+ if len(service_name) > 50:
56
+ return HookExecutionResult(
57
+ hook_name=self.name,
58
+ result=HookResult.FAILURE,
59
+ message="Service name too long (max 50 characters)"
60
+ )
61
+
62
+ return HookExecutionResult(
63
+ hook_name=self.name,
64
+ result=HookResult.SUCCESS,
65
+ message="Service name validation passed"
66
+ )
67
+
68
+
69
+ class HostValidationHook(BaseHook):
70
+ """主机地址验证钩子
71
+
72
+ 验证主机地址是否有效
73
+ """
74
+
75
+ def __init__(self):
76
+ super().__init__("host_validation", HookPriority.HIGH)
77
+
78
+ async def execute(self, context: HookContext) -> HookExecutionResult:
79
+ host = context.host
80
+
81
+ # 验证主机地址不为空
82
+ if not host or not host.strip():
83
+ return HookExecutionResult(
84
+ hook_name=self.name,
85
+ result=HookResult.FAILURE,
86
+ message="Host cannot be empty"
87
+ )
88
+
89
+ # 拒绝无效的主机地址
90
+ invalid_hosts = ["unknown", "localhost", "127.0.0.1", "0.0.0.0"]
91
+ if host.lower() in invalid_hosts:
92
+ return HookExecutionResult(
93
+ hook_name=self.name,
94
+ result=HookResult.FAILURE,
95
+ message=f"Invalid host '{host}'. Please configure proper hostname in docker-compose.yml"
96
+ )
97
+
98
+ return HookExecutionResult(
99
+ hook_name=self.name,
100
+ result=HookResult.SUCCESS,
101
+ message="Host validation passed"
102
+ )
103
+
104
+
105
+ class MetadataEnrichmentHook(BaseHook):
106
+ """元数据增强钩子
107
+
108
+ 为服务实例添加额外的元数据
109
+ """
110
+
111
+ def __init__(self):
112
+ super().__init__("metadata_enrichment", HookPriority.NORMAL)
113
+
114
+ async def execute(self, context: HookContext) -> HookExecutionResult:
115
+ # 获取现有元数据
116
+ metadata = context.metadata
117
+ if not isinstance(metadata, dict):
118
+ metadata = {}
119
+
120
+ # 添加注册时间戳
121
+ metadata["registered_at"] = datetime.now(timezone.utc).isoformat()
122
+
123
+ # 添加注册来源标识
124
+ metadata["registered_by"] = "infrasrv"
125
+
126
+ # 添加服务类型标识(根据服务名称推断)
127
+ service_name = context.service_name
128
+ if "bff" in service_name.lower():
129
+ metadata["service_type"] = "backend-for-frontend"
130
+ elif "srv" in service_name.lower():
131
+ metadata["service_type"] = "microservice"
132
+ else:
133
+ metadata["service_type"] = "unknown"
134
+
135
+ # Pydantic models are mutable by default, modifying directly
136
+ context.metadata = metadata
137
+
138
+ return HookExecutionResult(
139
+ hook_name=self.name,
140
+ result=HookResult.SUCCESS,
141
+ message="Metadata enriched successfully"
142
+ )
143
+
144
+
145
+ class PortRangeValidationHook(BaseHook):
146
+ """端口范围验证钩子
147
+
148
+ 验证端口号是否在有效范围内
149
+ """
150
+
151
+ def __init__(self):
152
+ super().__init__("port_range_validation", HookPriority.NORMAL)
153
+
154
+ async def execute(self, context: HookContext) -> HookExecutionResult:
155
+ port = context.port
156
+
157
+ # 验证端口号是否为整数
158
+ if not isinstance(port, int):
159
+ try:
160
+ port = int(port)
161
+ except (ValueError, TypeError):
162
+ return HookExecutionResult(
163
+ hook_name=self.name,
164
+ result=HookResult.FAILURE,
165
+ message="Port must be a valid integer"
166
+ )
167
+
168
+ # 验证端口范围
169
+ if port < 1024 or port > 65535:
170
+ return HookExecutionResult(
171
+ hook_name=self.name,
172
+ result=HookResult.FAILURE,
173
+ message="Port must be between 1024 and 65535"
174
+ )
175
+
176
+ return HookExecutionResult(
177
+ hook_name=self.name,
178
+ result=HookResult.SUCCESS,
179
+ message="Port validation passed"
180
+ )
181
+
182
+
183
+ class ServiceQuotaHook(BaseHook):
184
+ """服务配额检查钩子
185
+
186
+ 检查服务实例数量是否超过配额限制
187
+ """
188
+
189
+ def __init__(self):
190
+ super().__init__("service_quota", HookPriority.LOW)
191
+ # 服务配额配置
192
+ self.service_quotas = {
193
+ "default": 10, # 默认每个服务最多 10 个实例
194
+ }
195
+
196
+ async def execute(self, context: HookContext) -> HookExecutionResult:
197
+ service_name = context.service_name
198
+
199
+ # 获取服务配额
200
+ quota = self.service_quotas.get(service_name, self.service_quotas["default"])
201
+
202
+ # 查询 service registry 中该服务当前已注册的实例数量(真实计数)
203
+ from cancan_microstack.services.infrasrv.infrastructure.db.operate.service_instance_op import (
204
+ count_instances_by_service,
205
+ )
206
+ current_instances = await count_instances_by_service(service_name)
207
+
208
+ if current_instances >= quota:
209
+ return HookExecutionResult(
210
+ hook_name=self.name,
211
+ result=HookResult.FAILURE,
212
+ message=f"Service '{service_name}' has reached its quota of {quota} instances"
213
+ )
214
+
215
+ return HookExecutionResult(
216
+ hook_name=self.name,
217
+ result=HookResult.SUCCESS,
218
+ message=f"Service quota check passed ({current_instances}/{quota})"
219
+ )
220
+
221
+
222
+ # 函数钩子示例
223
+ def function_based_validation_hook(context: HookContext) -> tuple:
224
+ """基于函数的验证钩子示例
225
+
226
+ 验证实例ID格式
227
+ """
228
+ instance_id = context.instance_id
229
+
230
+ # 验证实例ID格式
231
+ if "-" not in instance_id:
232
+ return HookResult.FAILURE, "Instance ID must contain a hyphen (-)"
233
+
234
+ return HookResult.SUCCESS, "Instance ID validation passed"
235
+
236
+
237
+ # 注册所有钩子
238
+ def register_all_hooks():
239
+ """注册所有预注册钩子"""
240
+ hook_manager = get_hook_manager()
241
+ hook_manager.register_hook(ServiceNameValidationHook())
242
+ hook_manager.register_hook(HostValidationHook())
243
+ hook_manager.register_hook(MetadataEnrichmentHook())
244
+ hook_manager.register_hook(PortRangeValidationHook())
245
+ hook_manager.register_hook(ServiceQuotaHook())
246
+
247
+ logger.info("All pre-registration hooks registered successfully")
248
+
249
+
250
+ def register_default_hooks(hook_manager):
251
+ """
252
+ 注册默认的预注册钩子
253
+
254
+ Args:
255
+ hook_manager: 钩子管理器实例
256
+ """
257
+ # 注册服务名称验证钩子
258
+ hook_manager.register_hook(ServiceNameValidationHook())
259
+
260
+ # 注册主机地址验证钩子
261
+ hook_manager.register_hook(HostValidationHook())
262
+
263
+ # 注册元数据增强钩子
264
+ hook_manager.register_hook(MetadataEnrichmentHook())
265
+
266
+ # 注册端口范围验证钩子
267
+ hook_manager.register_hook(PortRangeValidationHook())
268
+
269
+ # 注册服务配额检查钩子
270
+ hook_manager.register_hook(ServiceQuotaHook())
271
+
272
+ logger.info("All default pre-registration hooks have been registered")
273
+
274
+
275
+ # 示例:动态添加钩子
276
+ def add_custom_validation_hook(hook_manager, validation_func):
277
+ """
278
+ 动态添加自定义验证钩子
279
+
280
+ Args:
281
+ hook_manager: 钩子管理器实例
282
+ validation_func: 验证函数,接收service_info参数,返回(bool, str)元组
283
+ """
284
+
285
+ def custom_hook(context):
286
+ # 简单示例,实际需要根据validation_func的实现调整
287
+ return HookResult.SUCCESS, "Custom validation passed"
288
+
289
+ hook_manager.register_hook(custom_hook)
290
+ logger.info("Custom validation hook has been registered")
291
+
292
+
293
+ # 示例:动态移除钩子
294
+ def remove_hook_by_type(hook_manager, hook_type):
295
+ """
296
+ 根据钩子类型移除钩子
297
+
298
+ Args:
299
+ hook_manager: 钩子管理器实例
300
+ hook_type: 要移除的钩子类型
301
+ """
302
+ hooks = hook_manager.get_hooks()
303
+ for hook in hooks:
304
+ if type(hook) == hook_type:
305
+ hook_manager.unregister_hook(hook.name)
306
+ logger.info(f"Removed hook of type {hook_type.__name__}")
307
+ return True
308
+ return False
@@ -0,0 +1,43 @@
1
+ """
2
+ 钩子注册表 (Hook Registry)
3
+
4
+ 提供全局唯一的 HookManager 实例和钩子注册功能。
5
+ 这是整个 Hook 机制的入口点和管理中心。
6
+ """
7
+
8
+ from typing import (
9
+ Optional,
10
+ )
11
+ from .pre_registration_hooks import HookManager
12
+
13
+ # 全局唯一的 HookManager 实例变量。
14
+ # 使用 Optional 类型,并初始化为 None,以支持懒加载(lazy loading)。
15
+ _hook_manager: Optional[HookManager] = None
16
+
17
+
18
+ def get_hook_manager() -> HookManager:
19
+ """
20
+ 获取全局唯一的 HookManager 实例。
21
+
22
+ 采用单例模式(Singleton Pattern),确保在整个应用生命周期中,
23
+ 只有一个 HookManager 实例存在。
24
+ 如果实例不存在,则会创建一个新的实例。
25
+
26
+ :return: 返回 HookManager 的全局实例。
27
+ """
28
+ global _hook_manager
29
+ if _hook_manager is None:
30
+ _hook_manager = HookManager()
31
+ return _hook_manager
32
+
33
+
34
+ def reset_hook_manager():
35
+ """
36
+ 重置全局的 HookManager 实例。
37
+
38
+ 这个函数主要用于测试目的。在单元测试或集成测试中,
39
+ 可能需要在不同的测试用例之间隔离状态,
40
+ 通过重置 HookManager 可以确保每个测试用例都有一个干净的钩子环境。
41
+ """
42
+ global _hook_manager
43
+ _hook_manager = None
@@ -0,0 +1,275 @@
1
+ """
2
+ Hooks 日志工具函数
3
+
4
+ 提供与钩子相关的日志格式化功能,用于在 hooks 领域层中处理日志输出。
5
+ """
6
+ from typing import (
7
+ Optional,
8
+ Dict,
9
+ Any,
10
+ )
11
+ import logging
12
+ from datetime import (
13
+ datetime,
14
+ timezone,
15
+ )
16
+
17
+ from cancan_microstack.public.schemas.infra.hook_log import (
18
+ HookLogData,
19
+ HookInfo,
20
+ )
21
+ from cancan_microstack.public.const.hook_enums import HookLogAction, SensitiveFieldKey
22
+
23
+
24
+ def _sanitize_context(context_data: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
25
+ """
26
+ 清洗上下文数据,移除敏感信息和限制字段长度
27
+ Sanitize context data, remove sensitive info and limit field length
28
+
29
+ Args:
30
+ context_data: 原始上下文数据 / Original context data
31
+
32
+ Returns:
33
+ 清洗后的上下文数据 / Sanitized context data
34
+ """
35
+ if not context_data:
36
+ return None
37
+
38
+ sanitized_context = {}
39
+ for key, value in context_data.items():
40
+ # 检查是否为敏感字段 / Check if sensitive field
41
+ if key.lower() in [field.value for field in SensitiveFieldKey]:
42
+ sanitized_context[key] = "***REDACTED***"
43
+ else:
44
+ # 限制值的长度,防止日志过大 / Limit value length to prevent large logs
45
+ if isinstance(value, str) and len(value) > 100:
46
+ sanitized_context[key] = value[:97] + "..."
47
+ else:
48
+ sanitized_context[key] = value
49
+
50
+ return sanitized_context
51
+
52
+
53
+ def create_hook_log_data(
54
+ hook_name: str,
55
+ hook_type: str,
56
+ message: str,
57
+ priority: Optional[str] = None,
58
+ context_data: Optional[Dict[str, Any]] = None,
59
+ execution_time: Optional[float] = None,
60
+ error: Optional[str] = None,
61
+ rejection_reason: Optional[str] = None,
62
+ modifications: Optional[Dict[str, Any]] = None
63
+ ) -> HookLogData:
64
+ """
65
+ 创建钩子日志数据模型
66
+ Create hook log data model
67
+
68
+ Args:
69
+ hook_name: 钩子名称 / Hook name
70
+ hook_type: 钩子类型 / Hook type
71
+ message: 日志消息 / Log message
72
+ priority: 钩子优先级(可选)/ Hook priority (optional)
73
+ context_data: 上下文数据(可选)/ Context data (optional)
74
+ execution_time: 执行时间(可选)/ Execution time (optional)
75
+ error: 错误信息(可选)/ Error message (optional)
76
+ rejection_reason: 拒绝原因(可选)/ Rejection reason (optional)
77
+ modifications: 修改内容(可选)/ Modifications (optional)
78
+
79
+ Returns:
80
+ HookLogData: 钩子日志数据模型实例 / Hook log data model instance
81
+ """
82
+ hook_info = HookInfo(name=hook_name, type=hook_type, priority=priority)
83
+
84
+ return HookLogData(
85
+ timestamp=datetime.now(timezone.utc).isoformat(),
86
+ hook=hook_info,
87
+ message=message,
88
+ context=_sanitize_context(context_data),
89
+ execution_time=execution_time,
90
+ error=error,
91
+ rejection_reason=rejection_reason,
92
+ modifications=modifications
93
+ )
94
+
95
+
96
+ def log_hook_registration(
97
+ logger: logging.Logger,
98
+ hook_name: str,
99
+ hook_type: str
100
+ ) -> None:
101
+ """
102
+ 记录钩子注册日志 / Log hook registration
103
+
104
+ Args:
105
+ logger: 日志记录器实例 / Logger instance
106
+ hook_name: 钩子名称 / Hook name
107
+ hook_type: 钩子类型 / Hook type
108
+ """
109
+ log_data = create_hook_log_data(
110
+ hook_name=hook_name,
111
+ hook_type=hook_type,
112
+ message=HookLogAction.REGISTERED
113
+ )
114
+ logger.info(log_data.model_dump_json(exclude_none=True))
115
+
116
+
117
+ def log_hook_deregistration(
118
+ logger: logging.Logger,
119
+ hook_name: str,
120
+ hook_type: str
121
+ ) -> None:
122
+ """
123
+ 记录钩子注销日志 / Log hook deregistration
124
+
125
+ Args:
126
+ logger: 日志记录器实例 / Logger instance
127
+ hook_name: 钩子名称 / Hook name
128
+ hook_type: 钩子类型 / Hook type
129
+ """
130
+ log_data = create_hook_log_data(
131
+ hook_name=hook_name,
132
+ hook_type=hook_type,
133
+ message=HookLogAction.DEREGISTERED
134
+ )
135
+ logger.info(log_data.model_dump_json(exclude_none=True))
136
+
137
+
138
+ def log_hook_execution_start(
139
+ logger: logging.Logger,
140
+ hook_name: str,
141
+ hook_type: str,
142
+ metadata: Dict[str, Any]
143
+ ) -> None:
144
+ """
145
+ 记录钩子执行开始日志 / Log hook execution start
146
+
147
+ Args:
148
+ logger: 日志记录器实例 / Logger instance
149
+ hook_name: 钩子名称 / Hook name
150
+ hook_type: 钩子类型 / Hook type
151
+ metadata: 元数据 / Metadata
152
+ """
153
+ log_data = create_hook_log_data(
154
+ hook_name=hook_name,
155
+ hook_type=hook_type,
156
+ message=HookLogAction.EXECUTION_STARTED,
157
+ context_data=metadata
158
+ )
159
+ logger.info(log_data.model_dump_json(exclude_none=True))
160
+
161
+
162
+ def log_hook_execution_success(
163
+ logger: logging.Logger,
164
+ hook_name: str,
165
+ hook_type: str,
166
+ execution_time: float,
167
+ metadata: Dict[str, Any]
168
+ ) -> None:
169
+ """
170
+ 记录钩子执行成功日志 / Log hook execution success
171
+
172
+ Args:
173
+ logger: 日志记录器实例 / Logger instance
174
+ hook_name: 钩子名称 / Hook name
175
+ hook_type: 钩子类型 / Hook type
176
+ execution_time: 执行时间(秒)/ Execution time (seconds)
177
+ metadata: 元数据 / Metadata
178
+ """
179
+ log_data = create_hook_log_data(
180
+ hook_name=hook_name,
181
+ hook_type=hook_type,
182
+ message=HookLogAction.EXECUTION_SUCCESS,
183
+ context_data=metadata,
184
+ execution_time=execution_time
185
+ )
186
+ logger.info(log_data.model_dump_json(exclude_none=True))
187
+
188
+
189
+ def log_hook_execution_failure(
190
+ logger: logging.Logger,
191
+ hook_name: str,
192
+ hook_type: str,
193
+ execution_time: float,
194
+ error_msg: str,
195
+ metadata: Dict[str, Any],
196
+ exception: Optional[Exception] = None
197
+ ) -> None:
198
+ """
199
+ 记录钩子执行失败日志 / Log hook execution failure
200
+
201
+ Args:
202
+ logger: 日志记录器实例 / Logger instance
203
+ hook_name: 钩子名称 / Hook name
204
+ hook_type: 钩子类型 / Hook type
205
+ execution_time: 执行时间(秒)/ Execution time (seconds)
206
+ error_msg: 错误信息 / Error message
207
+ metadata: 元数据 / Metadata
208
+ exception: 异常对象(可选)/ Exception object (optional)
209
+ """
210
+ log_data = create_hook_log_data(
211
+ hook_name=hook_name,
212
+ hook_type=hook_type,
213
+ message=HookLogAction.EXECUTION_FAILURE,
214
+ context_data=metadata,
215
+ execution_time=execution_time,
216
+ error=error_msg
217
+ )
218
+ if exception:
219
+ logger.error(log_data.model_dump_json(exclude_none=True), exc_info=exception)
220
+ else:
221
+ logger.error(log_data.model_dump_json(exclude_none=True))
222
+
223
+
224
+ def log_hook_rejection(
225
+ logger: logging.Logger,
226
+ hook_name: str,
227
+ hook_type: str,
228
+ reason: str,
229
+ metadata: Dict[str, Any]
230
+ ) -> None:
231
+ """
232
+ 记录钩子拒绝服务注册日志 / Log hook rejection
233
+
234
+ Args:
235
+ logger: 日志记录器实例 / Logger instance
236
+ hook_name: 钩子名称 / Hook name
237
+ hook_type: 钩子类型 / Hook type
238
+ reason: 拒绝原因 / Rejection reason
239
+ metadata: 元数据 / Metadata
240
+ """
241
+ log_data = create_hook_log_data(
242
+ hook_name=hook_name,
243
+ hook_type=hook_type,
244
+ message=HookLogAction.REJECTION,
245
+ context_data=metadata,
246
+ rejection_reason=reason
247
+ )
248
+ logger.warning(log_data.model_dump_json(exclude_none=True))
249
+
250
+
251
+ def log_hook_service_modification(
252
+ logger: logging.Logger,
253
+ hook_name: str,
254
+ hook_type: str,
255
+ modifications: Dict[str, Any],
256
+ metadata: Dict[str, Any]
257
+ ) -> None:
258
+ """
259
+ 记录钩子修改服务信息日志 / Log hook service modification
260
+
261
+ Args:
262
+ logger: 日志记录器实例 / Logger instance
263
+ hook_name: 钩子名称 / Hook name
264
+ hook_type: 钩子类型 / Hook type
265
+ modifications: 修改的内容 / Modifications
266
+ metadata: 元数据 / Metadata
267
+ """
268
+ log_data = create_hook_log_data(
269
+ hook_name=hook_name,
270
+ hook_type=hook_type,
271
+ message=HookLogAction.MODIFICATION,
272
+ context_data=metadata,
273
+ modifications=modifications
274
+ )
275
+ logger.info(log_data.model_dump_json(exclude_none=True))
@@ -0,0 +1,17 @@
1
+ """
2
+ 钩子初始化模块
3
+ 负责在服务启动时注册所有预定义的钩子
4
+ """
5
+ from .builtin_hooks import register_all_hooks
6
+
7
+ from linglong_web.utils import logger
8
+
9
+
10
+ def initialize_hooks():
11
+ """初始化所有钩子"""
12
+ try:
13
+ register_all_hooks()
14
+ logger.info("Hooks initialization completed successfully")
15
+ except Exception as e:
16
+ logger.error(f"Failed to initialize hooks: {e}")
17
+ raise