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,283 @@
1
+ """数据库初始化应用层 / DB init application layer.
2
+
3
+ 负责数据库初始化和增量构建的业务流程编排。
4
+ Orchestrates database initialization and incremental builds.
5
+ """
6
+
7
+ from sqlalchemy import text
8
+ from sqlalchemy.ext.asyncio import create_async_engine
9
+ from sqlalchemy.pool import NullPool
10
+
11
+ from linglong_web.utils import logger
12
+ from linglong_web import Rmanager
13
+ from linglong_web import LinglongConfig
14
+
15
+ from cancan_microstack.services.opsbffsrv.domain.db_init.db_init_domain import DatabaseInitDomain
16
+ from cancan_microstack.public.schemas.opsbffsrv.db_init import (
17
+ DatabaseInitRequest,
18
+ DatabaseIncrementalBuildRequest,
19
+ DatabaseBuildResult,
20
+ DatabaseStatus,
21
+ DatabaseInfo,
22
+ )
23
+
24
+
25
+ class DatabaseInitApp:
26
+ """数据库初始化应用服务"""
27
+
28
+ def __init__(self):
29
+ self.domain = DatabaseInitDomain()
30
+
31
+ async def initialize_all_databases(self, request: DatabaseInitRequest) -> DatabaseBuildResult:
32
+ """
33
+ 一键初始化所有数据库(适用于首次部署)
34
+
35
+ Args:
36
+ request: 初始化请求
37
+
38
+ Returns:
39
+ 构建结果
40
+ """
41
+ logger.info(f"Starting database initialization, force={request.force}")
42
+
43
+ databases_to_init = request.databases or self.domain.get_all_databases()
44
+
45
+ databases_created = []
46
+ tables_created = []
47
+ errors = []
48
+
49
+ main_engine = None
50
+ try:
51
+ # 使用 main 数据库的连接来创建其他数据库
52
+ # Create a temporary connection to the bootstrap DB (usually 'postgres' or 'main')
53
+ #
54
+ # 关键点:这是一次性管理操作,不应持久化连接池,否则多次调用会导致连接数持续上涨。
55
+ # Key point: this is a one-off admin operation; do NOT keep a long-lived pool here.
56
+ main_engine = create_async_engine(
57
+ f"postgresql+asyncpg://{LinglongConfig.PGSQL_USER}:{LinglongConfig.PGSQL_PASSWORD}@{LinglongConfig.PGSQL_HOST}:{LinglongConfig.PGSQL_PORT}/main",
58
+ poolclass=NullPool,
59
+ pool_pre_ping=True,
60
+ isolation_level="AUTOCOMMIT", # 创建数据库需要在 AUTOCOMMIT 模式 / CREATE DATABASE needs AUTOCOMMIT
61
+ )
62
+
63
+ async with main_engine.connect() as conn:
64
+ for db_name in databases_to_init:
65
+ logger.info(f"Processing database: {db_name}")
66
+
67
+ # 检查数据库是否存在
68
+ exists = await self.domain.check_database_exists(db_name, conn)
69
+
70
+ if exists and not request.force:
71
+ logger.info(f"Database '{db_name}' already exists, skipping creation")
72
+ elif exists and request.force:
73
+ # 强制模式:删除并重建
74
+ # 注意:DROP DATABASE 必须在 autocommit 模式下执行
75
+ logger.warning(f"Force mode: dropping database '{db_name}'")
76
+ try:
77
+ # 需要退出当前事务,使用 autocommit
78
+ await conn.execute(text(f"DROP DATABASE {db_name}"))
79
+ logger.info(f"Database '{db_name}' dropped")
80
+ except Exception as e:
81
+ logger.error(f"Failed to drop database '{db_name}': {e}", exc_info=True)
82
+ errors.append({
83
+ "database": db_name,
84
+ "operation": "drop",
85
+ "error": str(e)
86
+ })
87
+ continue
88
+
89
+ # 创建数据库(如果不存在或已删除)
90
+ if not exists or request.force:
91
+ if await self.domain.create_database(db_name, conn):
92
+ databases_created.append(db_name)
93
+ logger.info(f"Database '{db_name}' created")
94
+ else:
95
+ errors.append({
96
+ "database": db_name,
97
+ "operation": "create",
98
+ "error": "Failed to create database"
99
+ })
100
+ continue
101
+
102
+ # 需要先注册该数据库的引擎才能继续创建表
103
+ # 这里假设已经在配置中预先配置好了
104
+ # 如果没有配置,需要动态添加引擎注册
105
+
106
+ # 创建表(增量方式)
107
+ created, failed = await self.domain.create_tables_incremental(db_name)
108
+ tables_created.extend([f"{db_name}.{table}" for table in created])
109
+
110
+ if failed:
111
+ for table in failed:
112
+ errors.append({
113
+ "database": db_name,
114
+ "table": table,
115
+ "operation": "create_table",
116
+ "error": "Failed to create table"
117
+ })
118
+
119
+ success = len(errors) == 0
120
+ message = f"Initialized {len(databases_created)} databases, created {len(tables_created)} tables"
121
+ if errors:
122
+ message += f", {len(errors)} errors"
123
+
124
+ return DatabaseBuildResult(
125
+ success=success,
126
+ message=message,
127
+ databases_created=databases_created,
128
+ tables_created=tables_created,
129
+ errors=errors
130
+ )
131
+
132
+ except Exception as e:
133
+ logger.error(f"Database initialization failed: {e}", exc_info=True)
134
+ return DatabaseBuildResult(
135
+ success=False,
136
+ message=f"Initialization failed: {str(e)}",
137
+ databases_created=databases_created,
138
+ tables_created=tables_created,
139
+ errors=errors + [{"error": str(e)}]
140
+ )
141
+
142
+ finally:
143
+ if main_engine is not None:
144
+ try:
145
+ await main_engine.dispose()
146
+ except Exception as dispose_exc: # pragma: no cover - defensive cleanup
147
+ logger.warning("Failed to dispose main_engine: %s", dispose_exc)
148
+
149
+ async def incremental_build(self, request: DatabaseIncrementalBuildRequest) -> DatabaseBuildResult:
150
+ """
151
+ 增量构建数据库和表
152
+ - 数据库不存在则创建,存在则跳过
153
+ - 表不存在则创建,存在则跳过
154
+
155
+ Args:
156
+ request: 增量构建请求
157
+
158
+ Returns:
159
+ 构建结果
160
+ """
161
+ logger.info(f"Starting incremental database build")
162
+
163
+ databases_to_build = request.databases or self.domain.get_all_databases()
164
+
165
+ databases_created = []
166
+ tables_created = []
167
+ errors = []
168
+
169
+ try:
170
+ # 使用 postgres 数据库的连接来创建其他数据库
171
+ engine = Rmanager.get_pgsql_engine("default")
172
+ if engine is None:
173
+ return DatabaseBuildResult(
174
+ success=False,
175
+ message="Failed to get database connection",
176
+ databases_created=[],
177
+ tables_created=[],
178
+ errors=[{"error": "No default database engine available"}]
179
+ )
180
+
181
+ async with engine.connect() as conn:
182
+ for db_name in databases_to_build:
183
+ logger.info(f"Processing database: {db_name}")
184
+
185
+ # 检查数据库是否存在
186
+ exists = await self.domain.check_database_exists(db_name, conn)
187
+
188
+ # 数据库不存在则创建
189
+ if not exists:
190
+ if await self.domain.create_database(db_name, conn):
191
+ databases_created.append(db_name)
192
+ logger.info(f"Database '{db_name}' created")
193
+ else:
194
+ errors.append({
195
+ "database": db_name,
196
+ "operation": "create",
197
+ "error": "Failed to create database"
198
+ })
199
+ continue
200
+ else:
201
+ logger.info(f"Database '{db_name}' already exists")
202
+
203
+ # 增量创建表
204
+ created, failed = await self.domain.create_tables_incremental(
205
+ db_name,
206
+ request.tables
207
+ )
208
+ tables_created.extend([f"{db_name}.{table}" for table in created])
209
+
210
+ if failed:
211
+ for table in failed:
212
+ errors.append({
213
+ "database": db_name,
214
+ "table": table,
215
+ "operation": "create_table",
216
+ "error": "Failed to create table"
217
+ })
218
+
219
+ success = len(errors) == 0
220
+ message = f"Built {len(databases_created)} new databases, created {len(tables_created)} tables"
221
+ if errors:
222
+ message += f", {len(errors)} errors"
223
+
224
+ return DatabaseBuildResult(
225
+ success=success,
226
+ message=message,
227
+ databases_created=databases_created,
228
+ tables_created=tables_created,
229
+ errors=errors
230
+ )
231
+
232
+ except Exception as e:
233
+ logger.error(f"Incremental build failed: {e}", exc_info=True)
234
+ return DatabaseBuildResult(
235
+ success=False,
236
+ message=f"Build failed: {str(e)}",
237
+ databases_created=databases_created,
238
+ tables_created=tables_created,
239
+ errors=errors + [{"error": str(e)}]
240
+ )
241
+
242
+ async def get_database_status(self) -> DatabaseStatus:
243
+ """
244
+ 获取数据库状态
245
+
246
+ Returns:
247
+ 数据库状态信息
248
+ """
249
+ databases = []
250
+
251
+ try:
252
+ engine = Rmanager.get_pgsql_engine("default")
253
+ if engine is None:
254
+ return DatabaseStatus(
255
+ databases=[],
256
+ ddl_path=str(self.domain.ddl_root)
257
+ )
258
+
259
+ async with engine.connect() as conn:
260
+ for db_name in self.domain.get_all_databases():
261
+ exists = await self.domain.check_database_exists(db_name, conn)
262
+
263
+ tables = []
264
+ if exists:
265
+ tables = list(await self.domain.get_existing_tables(db_name))
266
+
267
+ databases.append(DatabaseInfo(
268
+ name=db_name,
269
+ exists=exists,
270
+ tables=tables
271
+ ))
272
+
273
+ return DatabaseStatus(
274
+ databases=databases,
275
+ ddl_path=str(self.domain.ddl_root)
276
+ )
277
+
278
+ except Exception as e:
279
+ logger.error(f"Failed to get database status: {e}", exc_info=True)
280
+ return DatabaseStatus(
281
+ databases=[],
282
+ ddl_path=str(self.domain.ddl_root)
283
+ )
@@ -0,0 +1 @@
1
+ """opsbffsrv logging application package."""
@@ -0,0 +1,28 @@
1
+ """应用层:日志查询 / Application layer for log search."""
2
+ from typing import Optional
3
+
4
+ from linglong_web import LinglongConfig
5
+ from cancan_microstack.public.schemas.logging.log_event import (
6
+ LogQueryRequest,
7
+ LogQueryResponse,
8
+ )
9
+
10
+ from cancan_microstack.services.opsbffsrv.domain.logging.log_query_domain import LogQueryDomain
11
+ from cancan_microstack.services.opsbffsrv.infrastructure.mongo.log_query_repository import LogQueryRepository
12
+
13
+
14
+ class LogQueryApp:
15
+ """调度日志查询流程 / Orchestrates log query workflows."""
16
+
17
+ def __init__(self) -> None:
18
+ self._repository = LogQueryRepository()
19
+ self._domain = LogQueryDomain(self._repository)
20
+ # 注意:该模块可能会在 LinglongConfig 初始化前被 import。
21
+ # Note: This module may be imported before LinglongConfig is initialized.
22
+ self._max_range_days = int(getattr(LinglongConfig, "LOG_QUERY_MAX_RANGE_DAYS", 7))
23
+
24
+ async def search_logs(self, payload: LogQueryRequest) -> LogQueryResponse:
25
+ return await self._domain.search_logs(payload, self._max_range_days)
26
+
27
+
28
+ log_query_app = LogQueryApp()
@@ -0,0 +1,158 @@
1
+ """
2
+ 服务配置管理应用层
3
+ Service configuration application layer coordinating persistence and push triggers
4
+ """
5
+ from typing import Dict
6
+
7
+ from pydantic import ValidationError
8
+
9
+ from linglong_web import (
10
+ HTTPClientConfig,
11
+ http_client,
12
+ )
13
+ from linglong_web import LinglongConfig
14
+ from linglong_web.utils import logger
15
+
16
+ from cancan_microstack.services.opsbffsrv.domain.service_config.service_config import ServiceConfigDomain
17
+ from cancan_microstack.public.schemas.opsbffsrv.service_config import (
18
+ ConfigPushExecutionResult,
19
+ ConfigPushStatus,
20
+ ServiceConfigDetail,
21
+ ServiceConfigEntry,
22
+ ServiceConfigOperationSummary,
23
+ ServiceConfigOverview,
24
+ )
25
+ from cancan_microstack.public.schemas.infra.push import PushResult
26
+
27
+
28
+ class ServiceConfigApp:
29
+ def __init__(self):
30
+ self.service_config_domain = ServiceConfigDomain()
31
+
32
+ async def get_service_config(self, service_name: str) -> ServiceConfigDetail:
33
+ """
34
+ 获取指定服务的配置字典
35
+ Retrieve configuration entries for a specific service
36
+ """
37
+ config_items = await self.service_config_domain.get_service_config(service_name)
38
+ entries = [
39
+ ServiceConfigEntry(key=key, value=value)
40
+ for key, value in sorted(config_items.items())
41
+ ]
42
+ return ServiceConfigDetail(service_name=service_name, items=entries)
43
+
44
+ async def insert_service_config(self, service_name: str,
45
+ conf_dict: Dict[str, str]) -> ServiceConfigOperationSummary:
46
+ """
47
+ 插入服务配置并触发推送
48
+ Insert configuration values and trigger downstream push
49
+ """
50
+ await self.service_config_domain.insert_service_config(service_name, conf_dict)
51
+ push_result = await self._trigger_config_push(service_name)
52
+ return ServiceConfigOperationSummary(
53
+ service_name=service_name,
54
+ message="Config inserted successfully",
55
+ push_result=push_result,
56
+ )
57
+
58
+ async def update_service_config(self, service_name: str,
59
+ conf_dict: Dict[str, str]) -> ServiceConfigOperationSummary:
60
+ """
61
+ 更新服务配置并触发推送
62
+ Update configuration values and trigger downstream push
63
+ """
64
+ await self.service_config_domain.update_service_config(service_name, conf_dict)
65
+ push_result = await self._trigger_config_push(service_name)
66
+ return ServiceConfigOperationSummary(
67
+ service_name=service_name,
68
+ message="Config updated successfully",
69
+ push_result=push_result,
70
+ )
71
+
72
+ async def get_all_service_configs(self) -> ServiceConfigOverview:
73
+ """
74
+ 获取全部服务的配置概览
75
+ Retrieve configuration overview for every registered service
76
+ """
77
+ all_configs = await self.service_config_domain.get_all_service_configs()
78
+ details = [
79
+ ServiceConfigDetail(
80
+ service_name=service,
81
+ items=[
82
+ ServiceConfigEntry(key=key, value=value)
83
+ for key, value in sorted(config.items())
84
+ ],
85
+ )
86
+ for service, config in sorted(all_configs.items())
87
+ ]
88
+ return ServiceConfigOverview(services=details)
89
+
90
+ async def delete_service_config(self, service_name: str, conf_key: str) -> ServiceConfigOperationSummary:
91
+ """
92
+ 删除服务配置项并触发推送
93
+ Delete configuration entry and trigger downstream push
94
+ """
95
+ await self.service_config_domain.delete_service_config(service_name, conf_key)
96
+ push_result = await self._trigger_config_push(service_name)
97
+ return ServiceConfigOperationSummary(
98
+ service_name=service_name,
99
+ message="Config deleted successfully",
100
+ push_result=push_result,
101
+ )
102
+
103
+ async def _trigger_config_push(self, service_name: str) -> ConfigPushExecutionResult:
104
+ """
105
+ 调用 infrasrv 的内部接口触发配置推送
106
+ Invoke infrasrv internal API to push configuration updates
107
+ """
108
+ try:
109
+ url = f"{LinglongConfig.INFRASRV_HOST}/v1/infrasrv/internal/config/push"
110
+ logger.info(f"Triggering config push for service: {service_name}")
111
+
112
+ resp = await http_client.post(
113
+ url,
114
+ params={"service_name": service_name},
115
+ json={"service_name": service_name},
116
+ timeout=HTTPClientConfig.INTERNAL_SERVICE_TIMEOUT,
117
+ )
118
+
119
+ if resp and resp.status == 200:
120
+ data = await resp.json()
121
+ logger.info(f"Config push triggered successfully for {service_name}")
122
+ push_data = data.get("data") if isinstance(data, dict) else None
123
+ push_summary = None
124
+ if isinstance(push_data, dict):
125
+ try:
126
+ push_summary = PushResult.model_validate(push_data)
127
+ except ValidationError as exc:
128
+ logger.warning(
129
+ "Failed to parse push result for %s: %s",
130
+ service_name,
131
+ exc,
132
+ )
133
+ return ConfigPushExecutionResult(
134
+ status=ConfigPushStatus.SUCCESS,
135
+ summary=push_summary,
136
+ )
137
+
138
+ http_status = resp.status if resp else "None"
139
+ logger.warning(
140
+ "Failed to trigger config push for %s: status %s",
141
+ service_name,
142
+ http_status,
143
+ )
144
+ return ConfigPushExecutionResult(
145
+ status=ConfigPushStatus.FAILED,
146
+ error_message=f"HTTP {http_status}",
147
+ )
148
+ except Exception as exc: # noqa: BLE001
149
+ logger.error(
150
+ "Error triggering config push for %s: %s",
151
+ service_name,
152
+ exc,
153
+ exc_info=True,
154
+ )
155
+ return ConfigPushExecutionResult(
156
+ status=ConfigPushStatus.ERROR,
157
+ error_message=str(exc),
158
+ )
@@ -0,0 +1,74 @@
1
+ """服务行为日志应用层 / Application layer for service action logs."""
2
+
3
+ from typing import (
4
+ List,
5
+ Optional,
6
+ )
7
+
8
+ from linglong_web.utils import logger
9
+ from cancan_microstack.public.schemas.infra.service_action_log import ServiceActionLog
10
+ from cancan_microstack.public.schemas.opsbffsrv.service_logs import ServiceLogsPayload
11
+ from cancan_microstack.services.opsbffsrv.infrastructure.db.operate.service_action_log_op import (
12
+ get_service_action_logs,
13
+ )
14
+
15
+
16
+ class ServiceLogsApp:
17
+ """服务日志应用层:直接访问数据库,避免链路依赖 / Fetch logs directly from infra DB."""
18
+
19
+ @staticmethod
20
+ def _build_service_name_variants(service_name: str) -> List[str]:
21
+ """构建 service_name 及其变体,适配 *.service 命名风格 / Normalize service names."""
22
+ raw = service_name.strip()
23
+ if not raw:
24
+ return []
25
+ candidates = {raw}
26
+ suffix = '.service'
27
+ if raw.endswith(suffix):
28
+ base = raw[:-len(suffix)]
29
+ if base:
30
+ candidates.add(base)
31
+ else:
32
+ candidates.add(f"{raw}{suffix}")
33
+ return sorted(candidates)
34
+
35
+ async def get_service_logs(
36
+ self,
37
+ service_name: Optional[str] = None,
38
+ action_type: Optional[str] = None,
39
+ action_status: Optional[str] = None,
40
+ limit: int = 100,
41
+ ) -> ServiceLogsPayload:
42
+ """
43
+ 查询服务行为日志(直连 DB)
44
+ Fetch service action logs directly from the infra database.
45
+ """
46
+
47
+ logger.info(
48
+ "ServiceLogsApp: querying logs - service_name=%s, action_type=%s, action_status=%s, limit=%s",
49
+ service_name,
50
+ action_type,
51
+ action_status,
52
+ limit,
53
+ )
54
+
55
+ name_variants = self._build_service_name_variants(service_name) if service_name else None
56
+ if name_variants:
57
+ logger.info("Normalized service name variants: input=%s, variants=%s", service_name, name_variants)
58
+
59
+ logs: List[ServiceActionLog] = await get_service_action_logs(
60
+ service_name_variants=name_variants,
61
+ action_type=action_type,
62
+ action_status=action_status,
63
+ limit=limit,
64
+ )
65
+ logger.info("Fetched %s logs from infra database", len(logs))
66
+
67
+ return ServiceLogsPayload(
68
+ service_name=service_name,
69
+ action_type=action_type,
70
+ action_status=action_status,
71
+ limit=limit,
72
+ logs=logs,
73
+ total=len(logs),
74
+ )
@@ -0,0 +1,36 @@
1
+ """
2
+ 服务注册查询应用层
3
+ 为ops前端提供服务实例查询功能
4
+ """
5
+ from typing import (
6
+ List,
7
+ )
8
+
9
+ from cancan_microstack.public.schemas.infra.service_registry import ServiceInstance
10
+ from cancan_microstack.public.schemas.infra.overview import ServiceOverview
11
+ from cancan_microstack.services.opsbffsrv.domain.service_registry.service_registry import ServiceRegistryDomain
12
+
13
+
14
+ class ServiceRegistryApp:
15
+ def __init__(self):
16
+ self.service_registry_domain = ServiceRegistryDomain()
17
+
18
+ async def get_service_instances(self, service_name: str | None = None, only_healthy: bool = True) -> List[ServiceInstance]:
19
+ """获取服务实例列表"""
20
+ return await self.service_registry_domain.get_service_instances(service_name, only_healthy)
21
+
22
+ async def get_all_instances(self) -> List[ServiceInstance]:
23
+ """获取所有服务实例"""
24
+ return await self.service_registry_domain.get_all_instances()
25
+
26
+ async def get_instance(self, service_name: str, instance_id: str) -> ServiceInstance | None:
27
+ """获取指定服务实例"""
28
+ return await self.service_registry_domain.get_instance(service_name, instance_id)
29
+
30
+ async def get_all_service_names(self) -> List[str]:
31
+ """获取所有服务名称"""
32
+ return await self.service_registry_domain.get_all_service_names()
33
+
34
+ async def get_services_overview(self) -> List[ServiceOverview]:
35
+ """获取所有服务的概览信息"""
36
+ return await self.service_registry_domain.get_services_overview()