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,404 @@
1
+ """InfraSrv API 客户端基类 / InfraSrv API client base class."""
2
+ import http
3
+ from typing import (
4
+ Any,
5
+ Dict,
6
+ Optional,
7
+ Sequence,
8
+ Tuple,
9
+ Type,
10
+ cast,
11
+ )
12
+
13
+ from pydantic import (
14
+ BaseModel,
15
+ ValidationError,
16
+ )
17
+
18
+ from linglong_web.utils import logger
19
+ from linglong_web import http_client, HTTPClientConfig
20
+ from cancan_microstack.public.schemas.common import (
21
+ APIError,
22
+ APIResponse,
23
+ )
24
+ from cancan_microstack.public.schemas.infra.operation import (
25
+ OperationCreateRequest,
26
+ OperationUpdateRequest,
27
+ OperationResponse,
28
+ OperationListResponse,
29
+ )
30
+
31
+
32
+ class InfraSrvApiClient:
33
+ """InfraSrv API 客户端基类 / TableBase client for InfraSrv APIs."""
34
+
35
+ OPERATION_RESPONSE_MODELS: Tuple[Type[BaseModel], ...] = (OperationResponse,)
36
+ OPERATION_LIST_MODELS: Tuple[Type[BaseModel], ...] = (OperationListResponse,)
37
+
38
+ def __init__(self, base_url: str):
39
+ """
40
+ 初始化 API 客户端 / Initialise API client
41
+
42
+ Args:
43
+ base_url: infrasrv 的基础 URL / TableBase URL for infrasrv
44
+ """
45
+
46
+ self.base_url = base_url
47
+ logger.info(f"InfraSrvApiClient initialized with base_url: {self.base_url}")
48
+
49
+ async def _make_request(
50
+ self,
51
+ method: http.HTTPMethod,
52
+ endpoint: str,
53
+ json_data: Optional[Dict[str, Any]] = None,
54
+ params: Optional[Dict[str, Any]] = None,
55
+ response_models: Sequence[Type[BaseModel]] = (),
56
+ ) -> APIResponse[Any]:
57
+ """
58
+ 通用请求方法 / Generic request executor
59
+ """
60
+
61
+ url = f"{self.base_url}{endpoint}"
62
+ try:
63
+ http_callable = getattr(http_client, method.value.lower())
64
+ response = await http_callable(
65
+ url=url,
66
+ params=params,
67
+ json=json_data,
68
+ timeout=HTTPClientConfig.INTERNAL_SERVICE_TIMEOUT,
69
+ )
70
+ except Exception as exc:
71
+ logger.error(f"Error calling infrasrv API [{endpoint}]: {exc}", exc_info=True)
72
+ return APIResponse(success=False, error=APIError(code="HTTP_EXCEPTION", msg=str(exc)))
73
+
74
+ if response is None:
75
+ logger.error(f"Failed to call infrasrv API [{endpoint}]: no response")
76
+ return APIResponse(success=False, error=APIError(code="HTTP_NO_RESPONSE", msg="No response received"))
77
+
78
+ if response.status != 200:
79
+ error_message = f"HTTP error: {response.status}"
80
+ logger.error(f"infrasrv API [{endpoint}] returned non-200 status: {response.status}")
81
+ return APIResponse(success=False, error=APIError(code=str(response.status), msg=error_message))
82
+
83
+ try:
84
+ payload = await response.json()
85
+ except Exception as exc:
86
+ logger.error(f"Failed to decode infrasrv response for [{endpoint}]: {exc}", exc_info=True)
87
+ return APIResponse(success=False, error=APIError(code="JSON_DECODE_ERROR", msg=str(exc)))
88
+
89
+ if not isinstance(payload, dict):
90
+ logger.error(f"Unexpected infrasrv response format for [{endpoint}]: {payload}")
91
+ return APIResponse(success=False, error=APIError(code="INVALID_PAYLOAD", msg="Response is not a dict"))
92
+
93
+ success = bool(payload.get("success"))
94
+ error_payload = payload.get("error") or {}
95
+ api_error = self._create_api_error(error_payload)
96
+ raw_data = payload.get("data")
97
+ parsed_data = self._parse_response_data(raw_data, response_models)
98
+
99
+ if parsed_data is None and raw_data is not None and response_models:
100
+ logger.error(
101
+ "Failed to parse infrasrv response data for [%s]: %s",
102
+ endpoint,
103
+ raw_data,
104
+ )
105
+
106
+ logger.debug(
107
+ "infrasrv API [%s] completed: success=%s, code=%s",
108
+ endpoint,
109
+ success,
110
+ api_error.code,
111
+ )
112
+
113
+ return APIResponse(success=success, error=api_error, data=parsed_data)
114
+
115
+ @staticmethod
116
+ def _create_api_error(error_payload: Any) -> APIError:
117
+ """构造 APIError / Build APIError"""
118
+
119
+ if isinstance(error_payload, dict):
120
+ code = str(error_payload.get("code", "50000"))
121
+ msg = str(error_payload.get("msg", ""))
122
+ else:
123
+ code = "50000"
124
+ msg = str(error_payload) if error_payload is not None else ""
125
+ return APIError(code=code, msg=msg)
126
+
127
+ def _parse_response_data(
128
+ self,
129
+ data: Any,
130
+ response_models: Sequence[Type[BaseModel]],
131
+ ) -> Any:
132
+ """
133
+ 解析响应数据为 Pydantic 模型 / Parse response data into Pydantic models
134
+ 如果 response_models 为空,则直接返回原始数据 / If response_models is empty, return raw data
135
+ """
136
+
137
+ if data is None:
138
+ return None
139
+
140
+ if not response_models:
141
+ return data
142
+
143
+ if not isinstance(data, (dict, list)):
144
+ return None
145
+
146
+ for model in response_models:
147
+ try:
148
+ if isinstance(data, model):
149
+ return data
150
+ return model.model_validate(data)
151
+ except ValidationError:
152
+ continue
153
+
154
+ return None
155
+
156
+ async def create_operation(self, request: OperationCreateRequest) -> APIResponse[Optional[OperationResponse]]:
157
+ """创建操作记录 / Create operation record"""
158
+
159
+ json_data = request.model_dump(mode="json")
160
+ response = await self._make_request(
161
+ http.HTTPMethod.POST,
162
+ "/operation/create",
163
+ json_data=json_data,
164
+ response_models=self.OPERATION_RESPONSE_MODELS,
165
+ )
166
+ return cast(APIResponse[Optional[OperationResponse]], response)
167
+
168
+ async def update_operation(self, request: OperationUpdateRequest) -> APIResponse[Optional[OperationResponse]]:
169
+ """更新操作记录 / Update operation record"""
170
+
171
+ json_data = request.model_dump(mode="json", exclude_none=True)
172
+ if request.started_at:
173
+ json_data["started_at"] = request.started_at.isoformat()
174
+ if request.completed_at:
175
+ json_data["completed_at"] = request.completed_at.isoformat()
176
+
177
+ response = await self._make_request(
178
+ http.HTTPMethod.POST,
179
+ "/operation/update",
180
+ json_data=json_data,
181
+ response_models=self.OPERATION_RESPONSE_MODELS,
182
+ )
183
+ return cast(APIResponse[Optional[OperationResponse]], response)
184
+
185
+ async def get_operation(self, operation_id: str) -> APIResponse[Optional[OperationResponse]]:
186
+ """获取操作记录 / Get operation record"""
187
+
188
+ response = await self._make_request(
189
+ http.HTTPMethod.GET,
190
+ "/operation/get",
191
+ params={"operation_id": operation_id},
192
+ response_models=self.OPERATION_RESPONSE_MODELS,
193
+ )
194
+ return cast(APIResponse[Optional[OperationResponse]], response)
195
+
196
+ async def list_operations(
197
+ self,
198
+ service_name: Optional[str] = None,
199
+ status: Optional[str] = None,
200
+ limit: int = 50,
201
+ offset: int = 0,
202
+ ) -> APIResponse[Optional[OperationListResponse]]:
203
+ """列出操作记录 / List operation records"""
204
+
205
+ params: Dict[str, Any] = {"limit": limit, "offset": offset}
206
+ if service_name:
207
+ params["service_name"] = service_name
208
+ if status:
209
+ params["status"] = status
210
+
211
+ response = await self._make_request(
212
+ http.HTTPMethod.GET,
213
+ "/operation/list",
214
+ params=params,
215
+ response_models=self.OPERATION_LIST_MODELS,
216
+ )
217
+ return cast(APIResponse[Optional[OperationListResponse]], response)
218
+
219
+ # --- Workflow Methods ---
220
+
221
+ async def list_workflow_definitions(
222
+ self,
223
+ page: int = 1,
224
+ page_size: int = 20,
225
+ keyword: Optional[str] = None,
226
+ status: Optional[str] = None,
227
+ ) -> APIResponse[Any]:
228
+ """列出工作流定义 / List workflow definitions with pagination."""
229
+
230
+ params: Dict[str, Any] = {
231
+ "page": page,
232
+ "page_size": page_size,
233
+ }
234
+ if keyword:
235
+ params["keyword"] = keyword
236
+ if status:
237
+ params["status"] = status
238
+ return await self._make_request(
239
+ http.HTTPMethod.GET,
240
+ "/v1/infrasrv/workflows",
241
+ params=params,
242
+ )
243
+
244
+ async def get_workflow_definition(self, workflow_id: str) -> APIResponse[Any]:
245
+ """获取工作流详情 / Get workflow details"""
246
+ return await self._make_request(
247
+ http.HTTPMethod.GET,
248
+ f"/v1/infrasrv/workflows/{workflow_id}",
249
+ )
250
+
251
+ async def get_workflow(self, workflow_id: str) -> APIResponse[Any]:
252
+ """别名 / Alias."""
253
+ return await self.get_workflow_definition(workflow_id)
254
+
255
+ async def list_workflow_runs(
256
+ self,
257
+ workflow_id: Optional[str] = None,
258
+ reqid: Optional[str] = None,
259
+ page: int = 1,
260
+ page_size: int = 20,
261
+ status: Optional[str] = None,
262
+ date_from: Optional[str] = None,
263
+ date_to: Optional[str] = None,
264
+ ) -> APIResponse[Any]:
265
+ """列出工作流运行记录 / List workflow runs"""
266
+ params = {"page": page, "page_size": page_size}
267
+ if workflow_id:
268
+ params["workflow_id"] = workflow_id
269
+ if reqid:
270
+ params["reqid"] = reqid
271
+ if status:
272
+ params["status"] = status
273
+ if date_from:
274
+ params["date_from"] = date_from
275
+ if date_to:
276
+ params["date_to"] = date_to
277
+ return await self._make_request(
278
+ http.HTTPMethod.GET,
279
+ "/v1/infrasrv/runs",
280
+ params=params
281
+ )
282
+
283
+ async def get_run_graph_status(self, run_id: str) -> APIResponse[Any]:
284
+ """获取运行图状态 / Get run graph status"""
285
+ return await self._make_request(
286
+ http.HTTPMethod.GET,
287
+ f"/v1/infrasrv/runs/{run_id}/status",
288
+ params={}
289
+ )
290
+
291
+ async def get_node_history(self, run_id: str, node_id: str) -> APIResponse[Any]:
292
+ """获取节点历史 / Get node history"""
293
+ return await self._make_request(
294
+ http.HTTPMethod.GET,
295
+ f"/v1/infrasrv/runs/{run_id}/nodes/{node_id}/history",
296
+ )
297
+
298
+ async def get_workflow_stats(self) -> APIResponse[Any]:
299
+ """获取工作流统计 / Get workflow statistics"""
300
+ return await self._make_request(
301
+ http.HTTPMethod.GET,
302
+ "/v1/infrasrv/workflows/stats",
303
+ )
304
+
305
+ async def create_workflow_definition(self, payload: Dict[str, Any]) -> APIResponse[Any]:
306
+ """创建工作流定义 / Create workflow definition"""
307
+ return await self._make_request(
308
+ http.HTTPMethod.POST,
309
+ "/v1/infrasrv/workflows",
310
+ json_data=payload
311
+ )
312
+
313
+ async def update_workflow_definition(self, workflow_id: str, payload: Dict[str, Any]) -> APIResponse[Any]:
314
+ """更新工作流定义 / Update workflow definition"""
315
+ return await self._make_request(
316
+ http.HTTPMethod.PUT,
317
+ f"/v1/infrasrv/workflows/{workflow_id}",
318
+ json_data=payload
319
+ )
320
+
321
+ async def delete_workflow_definition(self, workflow_id: str) -> APIResponse[Any]:
322
+ """删除工作流定义 / Delete workflow definition"""
323
+ return await self._make_request(
324
+ http.HTTPMethod.DELETE,
325
+ f"/v1/infrasrv/workflows/{workflow_id}"
326
+ )
327
+
328
+ async def list_workflow_versions(self, workflow_id: str, limit: int = 50) -> APIResponse[Any]:
329
+ """列出工作流版本历史 / List workflow definition versions"""
330
+ params = {"limit": limit}
331
+ return await self._make_request(
332
+ http.HTTPMethod.GET,
333
+ f"/v1/infrasrv/workflows/{workflow_id}/versions",
334
+ params=params,
335
+ )
336
+
337
+ async def rollback_workflow_definition(self, workflow_id: str, payload: Dict[str, Any]) -> APIResponse[Any]:
338
+ """回滚工作流定义 / Roll back workflow definition"""
339
+ return await self._make_request(
340
+ http.HTTPMethod.POST,
341
+ f"/v1/infrasrv/workflows/{workflow_id}/rollback",
342
+ json_data=payload,
343
+ )
344
+
345
+ async def trigger_workflow_run(self, workflow_id: str, payload: Dict[str, Any]) -> APIResponse[Any]:
346
+ """触发工作流运行 / Trigger workflow run"""
347
+ return await self._make_request(
348
+ http.HTTPMethod.POST,
349
+ f"/v1/infrasrv/workflows/{workflow_id}/trigger",
350
+ json_data=payload
351
+ )
352
+
353
+ async def list_workflow_engine_alerts(
354
+ self,
355
+ *,
356
+ status: Optional[str] = None,
357
+ severity: Optional[str] = None,
358
+ run_id: Optional[str] = None,
359
+ page: int = 1,
360
+ page_size: int = 20,
361
+ ) -> APIResponse[Any]:
362
+ """列出工作流引擎告警 / List workflow engine alerts"""
363
+
364
+ params: Dict[str, Any] = {
365
+ "page": page,
366
+ "page_size": page_size,
367
+ }
368
+ if status:
369
+ params["status"] = status
370
+ if severity:
371
+ params["severity"] = severity
372
+ if run_id:
373
+ params["run_id"] = run_id
374
+ return await self._make_request(
375
+ http.HTTPMethod.GET,
376
+ "/v1/infrasrv/workflows/alerts",
377
+ params=params,
378
+ )
379
+
380
+ async def acknowledge_workflow_engine_alert(
381
+ self,
382
+ alert_id: str,
383
+ payload: Dict[str, Any],
384
+ ) -> APIResponse[Any]:
385
+ """标记告警为已知晓 / Acknowledge workflow engine alert"""
386
+
387
+ return await self._make_request(
388
+ http.HTTPMethod.POST,
389
+ f"/v1/infrasrv/workflows/alerts/{alert_id}/ack",
390
+ json_data=payload,
391
+ )
392
+
393
+ async def resolve_workflow_engine_alert(
394
+ self,
395
+ alert_id: str,
396
+ payload: Dict[str, Any],
397
+ ) -> APIResponse[Any]:
398
+ """标记告警为已解决 / Resolve workflow engine alert"""
399
+
400
+ return await self._make_request(
401
+ http.HTTPMethod.POST,
402
+ f"/v1/infrasrv/workflows/alerts/{alert_id}/resolve",
403
+ json_data=payload,
404
+ )
@@ -0,0 +1 @@
1
+ """公共常量模块命名空间 / Namespace holder for public constant modules."""
@@ -0,0 +1,18 @@
1
+ from enum import StrEnum
2
+
3
+
4
+ class ActionType(StrEnum):
5
+ REGISTER = "register"
6
+ DEREGISTER = "deregister"
7
+ HEARTBEAT = "heartbeat"
8
+ HEALTH_CHECK_FAIL = "health_check_fail"
9
+ AUTO_RESTART = "auto_restart"
10
+ START = "start"
11
+ STOP = "stop"
12
+ RESTART = "restart"
13
+
14
+
15
+ class HealthCheckAction(StrEnum):
16
+ """健康检查采取的操作"""
17
+ AUTO_STOP_SCHEDULED = "auto_stop_scheduled"
18
+ AUTO_RESTART_SCHEDULED = "auto_restart_scheduled"
@@ -0,0 +1,42 @@
1
+ import http
2
+ import re
3
+ from enum import StrEnum
4
+
5
+
6
+ class UserAgentConst(StrEnum):
7
+ """用户代理相关常量"""
8
+ UA = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
9
+ "Chrome/134.0.0.0 Safari/537.36")
10
+
11
+
12
+ class WebServerConst:
13
+ """Web 服务器相关常量"""
14
+ # Docker/Podman 默认不安全的主机名 / Default unsafe hostnames used by Docker/Podman
15
+ UNSAFE_HOSTS = {"localhost", "127.0.0.1", "0.0.0.0"}
16
+ # 容器ID的正则表达式 / Regular expression for container IDs
17
+ CONTAINER_ID_PATTERN = re.compile(r"^(?:[0-9a-f]{12}|[0-9a-f]{64})$")
18
+ # 特殊服务列表,这些服务有特殊的行为 / List of special services with unique behaviors
19
+ SPECIAL_SERVICES = ("controllersrv", "infrasrv", "opsbffsrv")
20
+
21
+
22
+ class Environment(StrEnum):
23
+ """运行环境常量"""
24
+ DEVELOPMENT = "development"
25
+ PRODUCTION = "production"
26
+
27
+
28
+ class LogLevelEnum(StrEnum):
29
+ """日志等级枚举 / Log level enum."""
30
+
31
+ DEBUG = "DEBUG"
32
+ INFO = "INFO"
33
+ WARNING = "WARNING"
34
+ ERROR = "ERROR"
35
+ CRITICAL = "CRITICAL"
36
+
37
+
38
+ # HTTP 方法常量集合
39
+ HTTP_METHODS = [m.value for m in http.HTTPMethod.__members__.values()]
40
+
41
+ # 支持的文件扩展名常量集合
42
+ SUPPORTED_EXTENSIONS = [".py", ".pyx", ".pyi"]
@@ -0,0 +1,22 @@
1
+ """
2
+ Caddy service related constants.
3
+ """
4
+ from enum import StrEnum
5
+
6
+
7
+ class SecurityEventType(StrEnum):
8
+ """Security event types for Caddy logs."""
9
+ WAF_BLOCKED = "waf_blocked"
10
+ RATE_LIMITED = "rate_limited"
11
+
12
+
13
+ class InternalRequestPath(StrEnum):
14
+ """内部系统路径常量
15
+ Internal system request path constants
16
+ """
17
+
18
+ HEALTH_CHECK = "/internal/health"
19
+ INTERNAL_PREFIX = "/internal/"
20
+ OPSBFF_API_PREFIX = "/v1/opsbffsrv/"
21
+ INTERNAL_SQL_LIKE = "/internal/%"
22
+ OPSBFF_API_SQL_LIKE = "/v1/opsbffsrv/%"
@@ -0,0 +1,163 @@
1
+ """
2
+ controllersrv API 常量定义
3
+ """
4
+ from enum import StrEnum
5
+
6
+
7
+ class ServiceScope(StrEnum):
8
+ """
9
+ 服务范围枚举
10
+ """
11
+ ALL_SERVICES = "all_services" # 所有服务
12
+
13
+
14
+ class TimeoutKey(StrEnum):
15
+ """
16
+ 超时配置键枚举
17
+ """
18
+ START = "start"
19
+ STOP = "stop"
20
+ RESTART = "restart"
21
+ PS = "ps"
22
+ CONFIG = "config"
23
+
24
+
25
+ class DockerCommand(StrEnum):
26
+ """
27
+ Docker Compose 命令枚举
28
+ """
29
+ UP = "up"
30
+ DOWN = "down"
31
+ STOP = "stop"
32
+ START = "start"
33
+ RESTART = "restart"
34
+ PS = "ps"
35
+ LOGS = "logs"
36
+ EXEC = "exec"
37
+ BUILD = "build"
38
+ PULL = "pull"
39
+ CONFIG = "config"
40
+ VERSION = "version"
41
+
42
+
43
+ class DockerFlag(StrEnum):
44
+ """
45
+ Docker Compose 标志枚举
46
+ """
47
+ DETACHED = "-d"
48
+ BUILD = "--build"
49
+ FORCE_RECREATE = "--force-recreate"
50
+ NO_RECREATE = "--no-recreate"
51
+ REMOVE_ORPHANS = "--remove-orphans"
52
+ QUIET = "-q"
53
+ FORMAT = "--format"
54
+ FILTER = "-f"
55
+ ALL = "-a"
56
+ NO_CACHE = "--no-cache"
57
+ PROJECT_NAME = "-p"
58
+ TAIL = "--tail"
59
+ FOLLOW = "-f"
60
+ TIMEOUT = "-t"
61
+ FORMAT_ID = "{{.ID}}"
62
+
63
+
64
+ class ContainerCommand(StrEnum):
65
+ """
66
+ 容器命令枚举(docker/podman 通用)
67
+ """
68
+ PS = "ps"
69
+ INSPECT = "inspect"
70
+ LOGS = "logs"
71
+ EXEC = "exec"
72
+ STOP = "stop"
73
+ START = "start"
74
+ RESTART = "restart"
75
+ RM = "rm"
76
+ IMAGES = "images"
77
+ VERSION = "version"
78
+
79
+
80
+ class ComposeCommand(StrEnum):
81
+ """
82
+ Compose 命令枚举
83
+ """
84
+ DOCKER_COMPOSE = "docker-compose"
85
+ PODMAN_COMPOSE = "podman-compose"
86
+
87
+
88
+ class ServiceCategory(StrEnum):
89
+ """
90
+ 服务分类枚举
91
+ """
92
+ INFRASTRUCTURE = "infrastructure" # 基础设施服务(postgres, redis, pgweb, caddy)
93
+ FRAMEWORK = "framework" # 框架服务(infrasrv, opsbffsrv)
94
+ BUSINESS = "business" # 业务服务(其他所有服务)
95
+
96
+
97
+ class ValidationResultKey(StrEnum):
98
+ """
99
+ 服务验证返回字典的键名
100
+ """
101
+ VALID = "valid"
102
+ INVALID_SERVICES = "invalid_services"
103
+ NON_OPERABLE_SERVICES = "non_operable_services"
104
+ VALID_SERVICES = "valid_services"
105
+
106
+
107
+ class ControllersrvErrorCode(StrEnum):
108
+ """
109
+ controllersrv服务专用错误码
110
+
111
+ 注意:通用错误(如系统错误)应使用 ErrorCode(来自 public/const/error.py)
112
+ 此处仅定义 controllersrv 特有的错误码
113
+
114
+ 通用错误码(应使用 ErrorCode):
115
+ - SYSTEM_ERROR (5000): 系统内部错误
116
+ - INVALID_PARAM (4000): 通用参数错误
117
+ - NETWORK_ERROR (5100): 网络错误
118
+ """
119
+ # 参数错误 400xx (controllersrv 特有)
120
+ INVALID_PARAMETER = "40001" # 无效参数
121
+ MISSING_PARAMETER = "40002" # 缺少参数
122
+ INVALID_SERVICE_NAME = "40003" # 无效服务名称
123
+ DUPLICATE_SERIAL_NUMBER = "40004" # 流水号重复
124
+
125
+ # 业务错误 500xx (controllersrv 特有)
126
+ OPERATION_FAILED = "50001" # 操作执行失败
127
+ SERVICE_NOT_FOUND = "50002" # 服务未找到
128
+ TASK_QUEUE_FULL = "50003" # 任务队列已满
129
+ TASK_TIMEOUT = "50004" # 任务执行超时
130
+ EXECUTOR_NOT_AVAILABLE = "50005" # 执行器不可用
131
+ SERVICE_STATUS_ERROR = "50006" # 获取服务状态失败
132
+ COMPOSE_STATUS_ERROR = "50007" # 获取 Compose 状态失败
133
+
134
+
135
+ class ControllersrvMessage(StrEnum):
136
+ """
137
+ controllersrv 内部使用的常量消息
138
+ """
139
+ DUPLICATE_SERIAL = "Duplicate"
140
+
141
+
142
+ # 基础设施服务列表(不可操作)
143
+ INFRASTRUCTURE_SERVICES = {
144
+ "postgres",
145
+ "postgres.internal",
146
+ "redis",
147
+ "redis.internal",
148
+ "pgweb",
149
+ "pgweb.internal",
150
+ "caddy",
151
+ "caddy.internal",
152
+ }
153
+
154
+ # 框架服务列表(不可操作)
155
+ FRAMEWORK_SERVICES = {
156
+ "infrasrv",
157
+ "infrasrv.service",
158
+ "opsbffsrv",
159
+ "opsbffsrv.service",
160
+ }
161
+
162
+ # 不可操作的服务集合
163
+ NON_OPERABLE_SERVICES = INFRASTRUCTURE_SERVICES | FRAMEWORK_SERVICES
@@ -0,0 +1,15 @@
1
+ """
2
+ Docker相关常量定义
3
+ """
4
+ from enum import StrEnum
5
+
6
+
7
+ class DockerLabel(StrEnum):
8
+ """Docker Compose labels used for identifying services."""
9
+ SERVICE = "com.docker.compose.service"
10
+
11
+
12
+ class DockerInspectKey(StrEnum):
13
+ """Keys used for inspecting Docker container details."""
14
+ STATE = "State"
15
+ HEALTH = "Health"