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,146 @@
1
+ """
2
+ 服务配置管理 API 接口
3
+ API handlers for service configuration management within opsbffsrv
4
+ """
5
+ import json
6
+ from typing import (
7
+ Any,
8
+ )
9
+
10
+ from cancan_microstack.public.schemas.common import (
11
+ APIResponse,
12
+ )
13
+ from linglong_web import (
14
+ build_success_response,
15
+ )
16
+ from cancan_microstack.public.const.opsbffsrv_error import OpsbffsrvServiceConfigErrorCode
17
+ from cancan_microstack.public.schemas.opsbffsrv.service_config import (
18
+ ServiceConfigDetail,
19
+ ServiceConfigOperationSummary,
20
+ ServiceConfigOverview,
21
+ )
22
+ from cancan_microstack.public.error import HTTPException
23
+ import http
24
+ from cancan_microstack.services.opsbffsrv.application.service_config import ServiceConfigApp
25
+
26
+ _service_config_app = ServiceConfigApp()
27
+ _INVALID_INPUT_MESSAGE = "Invalid input"
28
+
29
+
30
+ def _normalize_conf_dict(payload: dict[str, Any]) -> dict[str, str]:
31
+ """标准化配置请求体(单一规范)。
32
+ Normalize config payload (single canonical shape).
33
+
34
+ 规范请求体 / Canonical payload:
35
+ - {"conf_dict": {"KEY": "VALUE"}}
36
+ """
37
+
38
+ if "conf_dict" not in payload:
39
+ raise HTTPException(
40
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
41
+ error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
42
+ msg=_INVALID_INPUT_MESSAGE,
43
+ )
44
+
45
+ raw_conf = payload.get("conf_dict")
46
+
47
+ if not isinstance(raw_conf, dict) or not raw_conf:
48
+ raise HTTPException(
49
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
50
+ error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
51
+ msg=_INVALID_INPUT_MESSAGE,
52
+ )
53
+
54
+ normalized_conf: dict[str, str] = {}
55
+ for key, value in raw_conf.items():
56
+ if not isinstance(key, str) or not key:
57
+ raise HTTPException(
58
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
59
+ error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
60
+ msg=_INVALID_INPUT_MESSAGE,
61
+ )
62
+
63
+ if isinstance(value, str):
64
+ normalized_conf[key] = value
65
+ continue
66
+
67
+ try:
68
+ normalized_conf[key] = json.dumps(value, ensure_ascii=False)
69
+ except TypeError:
70
+ normalized_conf[key] = str(value)
71
+
72
+ if not normalized_conf:
73
+ raise HTTPException(
74
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
75
+ error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
76
+ msg=_INVALID_INPUT_MESSAGE,
77
+ )
78
+
79
+ return normalized_conf
80
+
81
+
82
+ async def get_service_config_handler(service_name: str) -> APIResponse[ServiceConfigDetail]:
83
+ """获取指定服务的配置 / Fetch configuration entries for a service"""
84
+ result = await _service_config_app.get_service_config(service_name)
85
+ return build_success_response(data=result)
86
+
87
+
88
+ async def insert_service_config_handler(
89
+ service_name: str,
90
+ payload: dict[str, Any],
91
+ ) -> APIResponse[ServiceConfigOperationSummary]:
92
+ """插入服务配置 / Insert new configuration entries"""
93
+
94
+ if not service_name:
95
+ raise HTTPException(
96
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
97
+ error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
98
+ msg=_INVALID_INPUT_MESSAGE,
99
+ )
100
+
101
+ conf_dict = _normalize_conf_dict(payload)
102
+
103
+ result = await _service_config_app.insert_service_config(service_name, conf_dict)
104
+ return build_success_response(data=result)
105
+
106
+
107
+ async def update_service_config_handler(
108
+ service_name: str,
109
+ payload: dict[str, Any],
110
+ ) -> APIResponse[ServiceConfigOperationSummary]:
111
+ """更新服务配置 / Update configuration entries"""
112
+
113
+ if not service_name:
114
+ raise HTTPException(
115
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
116
+ error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
117
+ msg=_INVALID_INPUT_MESSAGE,
118
+ )
119
+
120
+ conf_dict = _normalize_conf_dict(payload)
121
+
122
+ result = await _service_config_app.update_service_config(service_name, conf_dict)
123
+ return build_success_response(data=result)
124
+
125
+
126
+ async def get_all_service_configs_handler() -> APIResponse[ServiceConfigOverview]:
127
+ """获取所有服务的配置 / Fetch configuration overview for all services"""
128
+ result = await _service_config_app.get_all_service_configs()
129
+ return build_success_response(data=result)
130
+
131
+
132
+ async def delete_service_config_handler(
133
+ service_name: str,
134
+ conf_key: str,
135
+ ) -> APIResponse[ServiceConfigOperationSummary]:
136
+ """删除服务配置项 / Delete configuration entry"""
137
+
138
+ if not service_name or not conf_key:
139
+ raise HTTPException(
140
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
141
+ error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
142
+ msg=_INVALID_INPUT_MESSAGE,
143
+ )
144
+
145
+ result = await _service_config_app.delete_service_config(service_name, conf_key)
146
+ return build_success_response(data=result)
@@ -0,0 +1,81 @@
1
+ """服务行为日志查询 API / Service log query API for ops frontend."""
2
+
3
+ from typing import Optional
4
+ import http
5
+
6
+ from linglong_web.utils import logger
7
+ from cancan_microstack.public.schemas.common import APIResponse
8
+ from linglong_web import build_success_response
9
+ from cancan_microstack.public.const.opsbffsrv_error import OpsbffsrvServiceLogsErrorCode
10
+ from cancan_microstack.public.schemas.opsbffsrv.service_logs import ServiceLogsPayload
11
+ from cancan_microstack.public.error import HTTPException
12
+ from cancan_microstack.services.opsbffsrv.application.service_logs_app import (
13
+ ServiceLogsApp,
14
+ )
15
+
16
+ _service_logs_app = ServiceLogsApp()
17
+ _INVALID_LIMIT_MESSAGE = "Invalid input: limit must be between 1 and 1000"
18
+ _MISSING_SERVICE_NAME_MESSAGE = "Invalid input: service_name is required"
19
+
20
+
21
+ async def get_service_logs_handler(
22
+ service_name: Optional[str] = None,
23
+ action_type: Optional[str] = None,
24
+ action_status: Optional[str] = None,
25
+ limit: int = 100,
26
+ ) -> APIResponse[ServiceLogsPayload]:
27
+ """查询服务行为日志 / Query service action logs."""
28
+
29
+ logger.info(
30
+ "Get service logs: service_name=%s, action_type=%s, action_status=%s, limit=%s",
31
+ service_name,
32
+ action_type,
33
+ action_status,
34
+ limit,
35
+ )
36
+
37
+ if limit < 1 or limit > 1000:
38
+ raise HTTPException(
39
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
40
+ error_code=OpsbffsrvServiceLogsErrorCode.INVALID_INPUT,
41
+ msg=_INVALID_LIMIT_MESSAGE,
42
+ )
43
+
44
+ payload = await _service_logs_app.get_service_logs(
45
+ service_name=service_name,
46
+ action_type=action_type,
47
+ action_status=action_status,
48
+ limit=limit,
49
+ )
50
+
51
+ return build_success_response(data=payload)
52
+
53
+
54
+ async def get_service_logs_by_service_handler(
55
+ service_name: str,
56
+ limit: int = 50,
57
+ ) -> APIResponse[ServiceLogsPayload]:
58
+ """查询指定服务的行为日志 / Query logs for a single service."""
59
+
60
+ logger.info("Get logs for service: %s, limit=%s", service_name, limit)
61
+
62
+ if not service_name:
63
+ raise HTTPException(
64
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
65
+ error_code=OpsbffsrvServiceLogsErrorCode.INVALID_INPUT,
66
+ msg=_MISSING_SERVICE_NAME_MESSAGE,
67
+ )
68
+
69
+ if limit < 1 or limit > 1000:
70
+ raise HTTPException(
71
+ status_code=http.HTTPStatus.BAD_REQUEST.value,
72
+ error_code=OpsbffsrvServiceLogsErrorCode.INVALID_INPUT,
73
+ msg=_INVALID_LIMIT_MESSAGE,
74
+ )
75
+
76
+ payload = await _service_logs_app.get_service_logs(
77
+ service_name=service_name,
78
+ limit=limit,
79
+ )
80
+
81
+ return build_success_response(data=payload)
@@ -0,0 +1,66 @@
1
+ """
2
+ 服务注册查询API接口
3
+ 为ops前端提供服务实例查询功能(只读)
4
+ """
5
+ from typing import List
6
+ import http
7
+
8
+ from cancan_microstack.public.schemas.common import (
9
+ APIResponse,
10
+ )
11
+ from cancan_microstack.public.schemas.infra.service_registry import (
12
+ ServiceInstance,
13
+ ServiceInstanceList,
14
+ )
15
+ from linglong_web import build_success_response
16
+ from cancan_microstack.public.const.error import ErrorCode
17
+ from cancan_microstack.public.error import HTTPException
18
+ from cancan_microstack.services.opsbffsrv.application.service_registry import ServiceRegistryApp
19
+
20
+ _service_registry_app = ServiceRegistryApp()
21
+
22
+
23
+ async def get_service_instances_handler(
24
+ service_name: str | None = None,
25
+ only_healthy: bool = True,
26
+ ) -> APIResponse[ServiceInstanceList]:
27
+ """获取服务实例列表"""
28
+ instances: List[ServiceInstance] = await _service_registry_app.get_service_instances(service_name, only_healthy)
29
+ return build_success_response(data=ServiceInstanceList(instances=instances))
30
+
31
+
32
+ async def get_all_instances_handler() -> APIResponse[ServiceInstanceList]:
33
+ """获取所有服务实例"""
34
+ instances: List[ServiceInstance] = await _service_registry_app.get_all_instances()
35
+ return build_success_response(data=ServiceInstanceList(instances=instances))
36
+
37
+
38
+ async def get_instance_handler(
39
+ service_name: str,
40
+ instance_id: str,
41
+ ) -> APIResponse[ServiceInstance]:
42
+ """获取指定服务实例"""
43
+ instance = await _service_registry_app.get_instance(service_name, instance_id)
44
+ if instance:
45
+ return build_success_response(data=instance)
46
+
47
+ raise HTTPException(
48
+ status_code=http.HTTPStatus.NOT_FOUND.value,
49
+ error_code=ErrorCode.HANDLER_NOT_FOUND,
50
+ msg="Instance not found"
51
+ )
52
+
53
+
54
+ async def get_all_service_names_handler() -> APIResponse[List[str]]:
55
+ """获取所有服务名称"""
56
+ service_names = await _service_registry_app.get_all_service_names()
57
+ return build_success_response(data=service_names)
58
+
59
+
60
+ async def get_services_overview_handler() -> APIResponse[List[dict]]:
61
+ """
62
+ 获取所有服务的概览信息(包含服务名和状态统计)
63
+ 供前端展示服务列表使用
64
+ """
65
+ overview = await _service_registry_app.get_services_overview()
66
+ return build_success_response(data=[o.model_dump() for o in overview])
@@ -0,0 +1,413 @@
1
+ """
2
+ 工作流运维 API 路由处理器(opsbffsrv 层)
3
+ Workflow Operations API Handlers (opsbffsrv layer)
4
+
5
+ 职责 / Responsibilities:
6
+ 1. 参数校验和格式化 / Parameter validation and formatting
7
+ 2. 转发请求到 infrasrv / Forward requests to infrasrv
8
+ 3. 统一响应包装 / Unified response wrapping
9
+ 4. 不包含业务逻辑 / No business logic here
10
+ """
11
+ from typing import Optional
12
+ from uuid import UUID
13
+
14
+ from fastapi import Depends, Query
15
+
16
+ from linglong_web import build_success_response
17
+ from cancan_microstack.public.schemas.infra import workflow as wt
18
+ from cancan_microstack.services.opsbffsrv.application.workflow_ops_app import WorkflowOpsApp
19
+
20
+
21
+ # 本模块:Workflow 运维相关的 API 路由处理器(Handler)
22
+ # Module: API handlers for workflow operations in opsbffsrv
23
+ #
24
+ # 说明 / Description:
25
+ # 该文件定义了对外暴露的 workflow 运维相关的 HTTP handler(均为 async)。
26
+ # 1) 使用 FastAPI 的 Depends 注入 WorkflowOpsApp 的实例(get_workflow_app)。
27
+ # 2) 每个 handler 仅负责参数接收、调用应用层方法并通过统一响应构建器返回结果。
28
+ # 3) 不包含复杂业务逻辑,业务逻辑集中在 application 层(WorkflowOpsApp)。
29
+ # This module defines async HTTP handlers for workflow operations.
30
+ # 1) Handlers depend on WorkflowOpsApp via FastAPI Depends (get_workflow_app).
31
+ # 2) Each handler validates/receives params, calls application layer, and returns
32
+ # a unified response via build_success_response.
33
+ # 3) No business logic here — business is implemented in WorkflowOpsApp.
34
+
35
+ def get_workflow_app() -> WorkflowOpsApp:
36
+ """工厂函数,提供 WorkflowOpsApp 实例 / Factory to provide WorkflowOpsApp instance"""
37
+ return WorkflowOpsApp()
38
+
39
+
40
+ # ==================== 工作流定义管理 / Workflow Definition Management ====================
41
+
42
+ async def list_workflows_handler(
43
+ keyword: Optional[str] = Query(None, description="搜索关键词"),
44
+ status: Optional[str] = Query(None, description="状态过滤: ACTIVE, INACTIVE"),
45
+ page: int = Query(1, ge=1, description="页码"),
46
+ page_size: int = Query(20, ge=1, le=100, description="每页大小"),
47
+ app: WorkflowOpsApp = Depends(get_workflow_app)
48
+ ):
49
+ """
50
+ 列出所有工作流定义(支持分页和过滤)
51
+ List all workflow definitions (with pagination and filtering)
52
+
53
+ Args:
54
+ keyword: 搜索关键词(匹配名称/标签)/ Search keyword (match name/tags)
55
+ status: 状态过滤 / Status filter
56
+ page: 页码 / Page number
57
+ page_size: 每页大小 / Page size
58
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
59
+
60
+ Returns:
61
+ 工作流列表(分页)/ Paginated workflow list
62
+ """
63
+ query = wt.WorkflowListQuery(
64
+ keyword=keyword,
65
+ status=status,
66
+ page=page,
67
+ page_size=page_size
68
+ )
69
+ data = await app.list_workflows(query)
70
+ return build_success_response(data=data)
71
+
72
+
73
+ async def get_workflow_handler(
74
+ id: UUID,
75
+ app: WorkflowOpsApp = Depends(get_workflow_app)
76
+ ):
77
+ """
78
+ 获取指定工作流详情
79
+ Get workflow details by ID
80
+
81
+ Args:
82
+ id: 工作流唯一标识符 / Workflow unique identifier
83
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
84
+
85
+ Returns:
86
+ 工作流详情 / Workflow details
87
+ """
88
+ data = await app.get_workflow(str(id))
89
+ return build_success_response(data=data)
90
+
91
+
92
+ async def create_workflow_handler(
93
+ payload: wt.WorkflowDefinitionCreate,
94
+ app: WorkflowOpsApp = Depends(get_workflow_app)
95
+ ):
96
+ """
97
+ 创建新工作流
98
+ Create a new workflow
99
+
100
+ Args:
101
+ payload: 工作流定义数据 / Workflow definition data
102
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
103
+
104
+ Returns:
105
+ 已创建的工作流 / Created workflow
106
+ """
107
+ data = await app.create_workflow(payload)
108
+ return build_success_response(data=data)
109
+
110
+
111
+ async def update_workflow_handler(
112
+ id: UUID,
113
+ payload: wt.WorkflowDefinitionUpdate,
114
+ app: WorkflowOpsApp = Depends(get_workflow_app)
115
+ ):
116
+ """
117
+ 更新工作流定义
118
+ Update workflow definition
119
+
120
+ Args:
121
+ id: 工作流唯一标识符 / Workflow unique identifier
122
+ payload: 更新数据 / Update data
123
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
124
+
125
+ Returns:
126
+ 更新后的工作流 / Updated workflow
127
+ """
128
+ data = await app.update_workflow(str(id), payload)
129
+ return build_success_response(data=data)
130
+
131
+
132
+ async def delete_workflow_handler(
133
+ id: UUID,
134
+ app: WorkflowOpsApp = Depends(get_workflow_app)
135
+ ):
136
+ """
137
+ 删除工作流
138
+ Delete workflow
139
+
140
+ Args:
141
+ id: 工作流唯一标识符 / Workflow unique identifier
142
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
143
+
144
+ Returns:
145
+ 删除确认 / Deletion confirmation
146
+ """
147
+ await app.delete_workflow(str(id))
148
+ return build_success_response(data={"message": "Workflow deleted successfully"})
149
+
150
+
151
+ async def toggle_workflow_handler(
152
+ id: UUID,
153
+ app: WorkflowOpsApp = Depends(get_workflow_app)
154
+ ):
155
+ """
156
+ 切换工作流启用状态
157
+ Toggle workflow active status
158
+
159
+ Args:
160
+ id: 工作流唯一标识符 / Workflow unique identifier
161
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
162
+
163
+ Returns:
164
+ 更新后的工作流 / Updated workflow
165
+ """
166
+ data = await app.toggle_workflow(str(id))
167
+ return build_success_response(data=data)
168
+
169
+
170
+ async def duplicate_workflow_handler(
171
+ id: UUID,
172
+ payload: wt.DuplicateWorkflowPayload,
173
+ app: WorkflowOpsApp = Depends(get_workflow_app)
174
+ ):
175
+ """
176
+ 复制工作流
177
+ Duplicate workflow
178
+
179
+ Args:
180
+ id: 源工作流唯一标识符 / Source workflow unique identifier
181
+ payload: 复制配置(新名称等)/ Duplication config (new name, etc.)
182
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
183
+
184
+ Returns:
185
+ 复制后的工作流 / Duplicated workflow
186
+ """
187
+ data = await app.duplicate_workflow(str(id), payload)
188
+ return build_success_response(data=data)
189
+
190
+
191
+ async def list_workflow_versions_handler(
192
+ id: UUID,
193
+ limit: int = Query(50, ge=1, le=200, description="返回版本数量限制"),
194
+ app: WorkflowOpsApp = Depends(get_workflow_app)
195
+ ):
196
+ """列出工作流版本历史
197
+ List workflow definition versions"""
198
+
199
+ data = await app.list_workflow_versions(str(id), limit)
200
+ return build_success_response(data=data)
201
+
202
+
203
+ async def rollback_workflow_handler(
204
+ id: UUID,
205
+ payload: wt.WorkflowRollbackRequest,
206
+ app: WorkflowOpsApp = Depends(get_workflow_app)
207
+ ):
208
+ """回滚工作流定义
209
+ Roll back workflow definition"""
210
+
211
+ data = await app.rollback_workflow(str(id), payload)
212
+ return build_success_response(data=data)
213
+
214
+
215
+ async def publish_workflow_handler(
216
+ id: UUID,
217
+ app: WorkflowOpsApp = Depends(get_workflow_app)
218
+ ):
219
+ """
220
+ 发布工作流(标记为生产就绪)
221
+ Publish workflow (mark as production-ready)
222
+
223
+ Args:
224
+ id: 工作流唯一标识符 / Workflow unique identifier
225
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
226
+
227
+ Returns:
228
+ 发布后的工作流 / Published workflow
229
+ """
230
+ data = await app.publish_workflow(str(id))
231
+ return build_success_response(data=data)
232
+
233
+
234
+ async def validate_workflow_handler(
235
+ id: UUID,
236
+ app: WorkflowOpsApp = Depends(get_workflow_app)
237
+ ):
238
+ """
239
+ 验证工作流定义
240
+ Validate workflow definition
241
+
242
+ Args:
243
+ id: 工作流唯一标识符 / Workflow unique identifier
244
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
245
+
246
+ Returns:
247
+ 验证结果 / Validation result
248
+ """
249
+ data = await app.validate_workflow(str(id))
250
+ return build_success_response(data=data)
251
+
252
+
253
+ # ==================== 工作流统计 / Workflow Statistics ====================
254
+
255
+ async def get_workflow_stats_handler(
256
+ app: WorkflowOpsApp = Depends(get_workflow_app)
257
+ ):
258
+ """
259
+ 获取工作流统计概览
260
+ Get workflow statistics overview
261
+
262
+ Args:
263
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
264
+
265
+ Returns:
266
+ 统计信息 / Statistics
267
+ """
268
+ data = await app.get_workflow_stats()
269
+ return build_success_response(data=data)
270
+
271
+
272
+ # ==================== 工作流运行管理 / Workflow Run Management ====================
273
+
274
+ async def trigger_workflow_handler(
275
+ id: UUID,
276
+ payload: wt.WorkflowTriggerRequest,
277
+ app: WorkflowOpsApp = Depends(get_workflow_app)
278
+ ):
279
+ """
280
+ 手动触发工作流运行
281
+ Manually trigger workflow run
282
+
283
+ Args:
284
+ id: 工作流唯一标识符 / Workflow unique identifier
285
+ payload: 触发上下文数据 / Trigger context data
286
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
287
+
288
+ Returns:
289
+ 运行实例信息 / Run instance info
290
+ """
291
+ data = await app.trigger_workflow(str(id), payload)
292
+ return build_success_response(data=data)
293
+
294
+
295
+ async def list_runs_handler(
296
+ workflow_id: Optional[str] = Query(None, description="按工作流ID过滤"),
297
+ reqid: Optional[str] = Query(None, description="按请求追踪 ID 过滤"),
298
+ status: Optional[str] = Query(None, description="运行状态过滤"),
299
+ date_from: Optional[str] = Query(None, description="开始时间"),
300
+ date_to: Optional[str] = Query(None, description="结束时间"),
301
+ page: int = Query(1, ge=1, description="页码"),
302
+ page_size: int = Query(20, ge=1, le=100, description="每页大小"),
303
+ app: WorkflowOpsApp = Depends(get_workflow_app)
304
+ ):
305
+ """
306
+ 列出工作流运行实例(支持过滤和分页)
307
+ List workflow runs (with filtering and pagination)
308
+
309
+ Args:
310
+ workflow_id: 按工作流ID过滤 / Filter by workflow ID
311
+ page: 页码 / Page number
312
+ page_size: 每页大小 / Page size
313
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
314
+
315
+ Returns:
316
+ 运行实例列表 / Run instance list
317
+ """
318
+ data = await app.list_runs(
319
+ workflow_id=workflow_id,
320
+ reqid=reqid,
321
+ page=page,
322
+ page_size=page_size,
323
+ status=status,
324
+ date_from=date_from,
325
+ date_to=date_to,
326
+ )
327
+ return build_success_response(data=data)
328
+
329
+
330
+ async def get_run_graph_status_handler(
331
+ run_id: str,
332
+ app: WorkflowOpsApp = Depends(get_workflow_app)
333
+ ):
334
+ """
335
+ 获取运行图状态(用于可视化展示)
336
+ Get run graph status (for visualization)
337
+
338
+ Args:
339
+ run_id: 运行实例唯一标识符 / Run instance unique identifier
340
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
341
+
342
+ Returns:
343
+ 图状态数据(节点+边)/ Graph status data (nodes + edges)
344
+ """
345
+ data = await app.get_run_graph_status(run_id)
346
+ return build_success_response(data=data)
347
+
348
+
349
+ async def get_node_history_handler(
350
+ run_id: str,
351
+ node_id: str,
352
+ app: WorkflowOpsApp = Depends(get_workflow_app)
353
+ ):
354
+ """
355
+ 获取节点执行历史
356
+ Get node execution history
357
+
358
+ Args:
359
+ run_id: 运行实例唯一标识符 / Run instance unique identifier
360
+ node_id: 节点ID / Node ID
361
+ app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
362
+
363
+ Returns:
364
+ 节点执行历史(含日志)/ Node execution history (with logs)
365
+ """
366
+ data = await app.get_node_history(run_id, node_id)
367
+ return build_success_response(data=data)
368
+
369
+
370
+ # ==================== Workflow Engine Alerts ====================
371
+
372
+
373
+ async def list_workflow_alerts_handler(
374
+ status: Optional[wt.WorkflowEngineAlertStatus] = Query(None, description="状态过滤"),
375
+ severity: Optional[wt.WorkflowEngineAlertSeverity] = Query(None, description="严重程度过滤"),
376
+ run_id: Optional[str] = Query(None, description="运行ID过滤"),
377
+ page: int = Query(1, ge=1, description="页码"),
378
+ page_size: int = Query(20, ge=1, le=200, description="每页大小"),
379
+ app: WorkflowOpsApp = Depends(get_workflow_app)
380
+ ):
381
+ """列出工作流引擎告警"""
382
+
383
+ query = wt.WorkflowEngineAlertQuery(
384
+ status=status,
385
+ severity=severity,
386
+ run_id=run_id,
387
+ page=page,
388
+ page_size=page_size,
389
+ )
390
+ data = await app.list_engine_alerts(query)
391
+ return build_success_response(data=data)
392
+
393
+
394
+ async def acknowledge_workflow_alert_handler(
395
+ alert_id: str,
396
+ payload: wt.WorkflowEngineAlertAckRequest,
397
+ app: WorkflowOpsApp = Depends(get_workflow_app)
398
+ ):
399
+ """标记告警为已知晓"""
400
+
401
+ data = await app.acknowledge_engine_alert(alert_id, payload)
402
+ return build_success_response(data=data)
403
+
404
+
405
+ async def resolve_workflow_alert_handler(
406
+ alert_id: str,
407
+ payload: wt.WorkflowEngineAlertAckRequest,
408
+ app: WorkflowOpsApp = Depends(get_workflow_app)
409
+ ):
410
+ """标记告警为已解决"""
411
+
412
+ data = await app.resolve_engine_alert(alert_id, payload)
413
+ return build_success_response(data=data)