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,566 @@
1
+ """
2
+ Workflow-related Pydantic models shared by infra services.
3
+ 工作流相关的 Pydantic 数据模型,供基础设施服务共享
4
+ """
5
+ import uuid
6
+ from datetime import datetime
7
+ from typing import (
8
+ Any,
9
+ Dict,
10
+ List,
11
+ Literal,
12
+ Optional,
13
+ Union,
14
+ )
15
+
16
+ from pydantic import (
17
+ AliasChoices,
18
+ BaseModel,
19
+ ConfigDict,
20
+ Field,
21
+ model_validator,
22
+ )
23
+
24
+ from cancan_microstack.public.const.workflow_consts import WorkflowEngineAlertReason
25
+ from cancan_microstack.public.schemas.infra.enums import (
26
+ CallbackAckStatus,
27
+ EndStatus,
28
+ ExecutionLogStatus,
29
+ JoinMode,
30
+ NodeStatus,
31
+ NodeType,
32
+ TransformEngine,
33
+ TriggerDispatchStatus,
34
+ TriggerType,
35
+ WorkflowStatus,
36
+ WorkflowEngineAlertStatus,
37
+ WorkflowEngineAlertSeverity,
38
+ WorkflowEngineAlertCategory,
39
+ )
40
+
41
+
42
+ # ==================== VueFlow Graph Metadata ====================
43
+ class VueFlowPosition(BaseModel):
44
+ """VueFlow 节点坐标 / VueFlow node coordinates"""
45
+
46
+ model_config = ConfigDict(extra="allow")
47
+
48
+ x: float
49
+ y: float
50
+
51
+
52
+ class WorkflowGraphNode(BaseModel):
53
+ """保存 VueFlow 节点的可视化信息 / Stores VueFlow node metadata"""
54
+
55
+ model_config = ConfigDict(extra="allow")
56
+
57
+ node_id: str
58
+ label: str
59
+ type: NodeType
60
+ position: VueFlowPosition
61
+ ui: Dict[str, Any] = Field(default_factory=dict)
62
+ data: Dict[str, Any] = Field(default_factory=dict)
63
+
64
+
65
+ class WorkflowGraphEdge(BaseModel):
66
+ """保存 VueFlow 边的可视化信息 / Stores VueFlow edge metadata"""
67
+
68
+ model_config = ConfigDict(extra="allow")
69
+
70
+ id: str
71
+ source: str
72
+ target: str
73
+ sourceHandle: Optional[str] = None
74
+ targetHandle: Optional[str] = None
75
+ label: Optional[str] = None
76
+ animated: bool = False
77
+ type: str = "smoothstep"
78
+
79
+
80
+ class WorkflowGraphData(BaseModel):
81
+ """绘图数据载体,包含节点与连线 / Aggregated graph payload"""
82
+
83
+ nodes: List[WorkflowGraphNode] = Field(default_factory=list)
84
+ edges: List[WorkflowGraphEdge] = Field(default_factory=list)
85
+ version: Optional[int] = None
86
+
87
+
88
+ # ==================== Node Configurations ====================
89
+ class TriggerRule(BaseModel):
90
+ field: str
91
+ operator: str
92
+ value: Any
93
+
94
+
95
+ class TriggerGroup(BaseModel):
96
+ logic: str = "AND"
97
+ children: List[Union["TriggerGroup", TriggerRule]] = Field(default_factory=list)
98
+
99
+
100
+ class StartNodeConfig(BaseModel):
101
+ trigger_rules: Optional[TriggerGroup] = None
102
+
103
+
104
+ class RequestConfig(BaseModel):
105
+ method: str = "GET"
106
+ url: str
107
+ params: Dict[str, str] = Field(default_factory=dict)
108
+ headers: Dict[str, str] = Field(default_factory=dict)
109
+ body_type: Literal["auto", "json", "form-urlencoded", "multipart", "raw"] = "auto"
110
+ body: Any = None
111
+ json_body: Any = None
112
+ form_body: Any = None
113
+ raw_body: Any = None
114
+ timeout_seconds: int = 30
115
+
116
+
117
+ class RetryPolicy(BaseModel):
118
+ enabled: bool = False
119
+ max_attempts: int = 1
120
+ interval_seconds: int = 5
121
+ retry_on_status: Optional[List[Union[int, str]]] = None
122
+
123
+
124
+ class FailureStrategy(BaseModel):
125
+ async_wait_timeout: int = 3600
126
+ action: str = "FAIL_FLOW"
127
+
128
+
129
+ class ActionNodeConfig(BaseModel):
130
+ async_mode: bool = False
131
+ request: RequestConfig
132
+ retry_policy: Optional[RetryPolicy] = None
133
+ failure_strategy: Optional[FailureStrategy] = None
134
+ context_mappings: Dict[str, str] = Field(
135
+ default_factory=dict,
136
+ description="响应字段映射到 global_context 业务键,格式: {'biz.user_id': 'json_body.data.user_id'}",
137
+ )
138
+
139
+
140
+ class TransformNodeConfig(BaseModel):
141
+ engine: TransformEngine = TransformEngine.JINJA2
142
+ output_schema: Dict[str, str] = Field(default_factory=dict)
143
+
144
+
145
+ class LogicNodeConfig(BaseModel):
146
+ condition: str
147
+ true_next_node_id: Optional[str] = None
148
+ false_next_node_id: Optional[str] = None
149
+
150
+
151
+ class ForkNodeConfig(BaseModel):
152
+ branch_node_ids: List[str] = Field(default_factory=list)
153
+ branch_labels: Dict[str, str] = Field(default_factory=dict)
154
+
155
+
156
+ class JoinNodeConfig(BaseModel):
157
+ mode: JoinMode = JoinMode.ALL
158
+ timeout_seconds: int = 3600
159
+ merge_strategy: str = "MAP"
160
+
161
+
162
+ class LoopNodeConfig(BaseModel):
163
+ """循环节点配置,描述循环体入口与退出路径
164
+ Loop node configuration describing loop body entry and exit paths"""
165
+
166
+ condition: str
167
+ body_entry_id: Optional[str] = Field(default=None, description="循环体入口节点 ID / Loop body entry node id")
168
+ exit_node_id: Optional[str] = Field(default=None, description="循环退出节点 ID / Loop exit node id")
169
+ jump_target_id: Optional[str] = Field(default=None,
170
+ description="兼容字段,等价于 body_entry_id / Backward compatible alias of body_entry_id")
171
+ max_iterations: int = 10
172
+
173
+ def model_post_init(self, __context: Any) -> None: # type: ignore[override]
174
+ """保持兼容性:自动同步 body_entry 与旧字段 jump_target
175
+ Keep backward compatibility by syncing body_entry with legacy jump_target"""
176
+
177
+ # 如果历史数据只有 jump_target_id,则复制到 body_entry_id / migrate legacy payloads
178
+ if self.body_entry_id is None and self.jump_target_id:
179
+ self.body_entry_id = self.jump_target_id
180
+ # 保持旧字段依旧可用 / keep legacy field populated for downstream consumers
181
+ if self.body_entry_id and not self.jump_target_id:
182
+ self.jump_target_id = self.body_entry_id
183
+
184
+
185
+ class EndNodeConfig(BaseModel):
186
+ status: EndStatus = EndStatus.SUCCESS
187
+ output_schema: Dict[str, str] = Field(default_factory=dict)
188
+
189
+
190
+ NodeConfigData = Union[
191
+ StartNodeConfig,
192
+ ActionNodeConfig,
193
+ TransformNodeConfig,
194
+ LogicNodeConfig,
195
+ ForkNodeConfig,
196
+ JoinNodeConfig,
197
+ LoopNodeConfig,
198
+ EndNodeConfig,
199
+ Dict[str, Any],
200
+ ]
201
+
202
+
203
+ class NodeConfig(BaseModel):
204
+ """节点逻辑配置 / Logical node definition"""
205
+
206
+ id: str
207
+ name: str
208
+ type: NodeType
209
+ next_node_id: Optional[str] = None
210
+ next_node_ids: List[str] = Field(default_factory=list)
211
+ config: Optional[NodeConfigData] = None
212
+
213
+
214
+ # ==================== Workflow Definition ====================
215
+ class WorkflowDefinitionBase(BaseModel):
216
+ name: str = Field(..., max_length=255)
217
+ description: Optional[str] = None
218
+ schedule: Optional[str] = Field(default=None, max_length=100)
219
+ graph_data: WorkflowGraphData = Field(default_factory=WorkflowGraphData)
220
+ nodes_config: Dict[str, NodeConfig] = Field(default_factory=dict)
221
+ global_context: Dict[str, Any] = Field(default_factory=dict)
222
+ is_active: bool = False
223
+
224
+
225
+ class WorkflowDefinitionCreate(WorkflowDefinitionBase):
226
+ pass
227
+
228
+
229
+ class WorkflowDefinitionUpdate(BaseModel):
230
+ name: Optional[str] = Field(default=None, max_length=255)
231
+ description: Optional[str] = None
232
+ schedule: Optional[str] = Field(default=None, max_length=100)
233
+ graph_data: Optional[WorkflowGraphData] = None
234
+ nodes_config: Optional[Dict[str, NodeConfig]] = None
235
+ global_context: Optional[Dict[str, Any]] = None
236
+ is_active: Optional[bool] = None
237
+ flag: Optional[int] = None
238
+ change_summary: Optional[str] = Field(default=None, max_length=255)
239
+
240
+
241
+ class WorkflowDefinition(WorkflowDefinitionBase):
242
+ model_config = ConfigDict(from_attributes=True)
243
+
244
+ id: uuid.UUID
245
+ version: int = 1
246
+ flag: int
247
+ created_time: datetime
248
+ update_time: datetime
249
+
250
+
251
+ class WorkflowDefinitionVersion(BaseModel):
252
+ """工作流版本快照 / Workflow definition version snapshot"""
253
+
254
+ model_config = ConfigDict(from_attributes=True)
255
+
256
+ id: uuid.UUID
257
+ workflow_id: uuid.UUID
258
+ version: int
259
+ name: str
260
+ description: Optional[str] = None
261
+ schedule: Optional[str] = None
262
+ graph_data: WorkflowGraphData = Field(default_factory=WorkflowGraphData)
263
+ nodes_config: Dict[str, NodeConfig] = Field(default_factory=dict)
264
+ global_context: Dict[str, Any] = Field(default_factory=dict)
265
+ is_active: bool = False
266
+ change_summary: Optional[str] = None
267
+ created_time: datetime
268
+
269
+
270
+ class WorkflowVersionListResponse(BaseModel):
271
+ """工作流版本列表响应 / Workflow version listing response"""
272
+
273
+ workflow_id: uuid.UUID
274
+ versions: List[WorkflowDefinitionVersion] = Field(default_factory=list)
275
+
276
+
277
+ class WorkflowListQuery(BaseModel):
278
+ keyword: Optional[str] = None
279
+ status: Optional[str] = Field(default=None, pattern="^(ACTIVE|INACTIVE)$")
280
+ page: int = Field(default=1, ge=1)
281
+ page_size: int = Field(default=20, ge=1, le=100)
282
+
283
+
284
+ class WorkflowListResponse(BaseModel):
285
+ list: List[WorkflowDefinition]
286
+ total: int
287
+ page: int
288
+ page_size: int
289
+
290
+
291
+ class DuplicateWorkflowPayload(BaseModel):
292
+ source_workflow_id: str
293
+ name: str
294
+
295
+
296
+ # ==================== Workflow Run & Instances ====================
297
+ class WorkflowRunQuery(BaseModel):
298
+ workflow_id: Optional[str] = None
299
+ reqid: Optional[str] = None
300
+ status: Optional[WorkflowStatus] = None
301
+ date_from: Optional[datetime] = None
302
+ date_to: Optional[datetime] = None
303
+ page: int = Field(default=1, ge=1)
304
+ page_size: int = Field(default=20, ge=1, le=100)
305
+
306
+
307
+ class WorkflowRunBase(BaseModel):
308
+ workflow_id: uuid.UUID
309
+ status: WorkflowStatus = WorkflowStatus.PENDING
310
+ trigger_type: TriggerType
311
+ trigger_context: Dict[str, Any] = Field(default_factory=dict)
312
+ global_context: Dict[str, Any] = Field(default_factory=dict)
313
+ definition_version: Optional[int] = None
314
+ definition_snapshot: Optional[Dict[str, Any]] = None
315
+
316
+
317
+ class WorkflowRunCreate(WorkflowRunBase):
318
+ id: uuid.UUID = Field(default_factory=uuid.uuid4)
319
+
320
+
321
+ class WorkflowRunUpdate(BaseModel):
322
+ status: Optional[WorkflowStatus] = None
323
+ global_context: Optional[Dict[str, Any]] = None
324
+ finished_at: Optional[datetime] = None
325
+ duration_ms: Optional[int] = None
326
+
327
+
328
+ class WorkflowRun(WorkflowRunBase):
329
+ model_config = ConfigDict(from_attributes=True)
330
+
331
+ id: uuid.UUID
332
+ workflow_name: Optional[str] = None
333
+ reqid: Optional[str] = None
334
+ started_at: datetime
335
+ finished_at: Optional[datetime] = None
336
+ duration_ms: Optional[int] = None
337
+ flag: int
338
+ created_time: datetime
339
+ update_time: datetime
340
+
341
+ @model_validator(mode="after")
342
+ def _hydrate_reqid(self):
343
+ """从运行上下文补全 reqid 字段。
344
+ Hydrate reqid from run contexts when response payload lacks reqid.
345
+ """
346
+
347
+ if self.reqid:
348
+ return self
349
+
350
+ for context_data in (self.trigger_context, self.global_context):
351
+ if not isinstance(context_data, dict):
352
+ continue
353
+ candidate = str(context_data.get("reqid") or "").strip()
354
+ if candidate:
355
+ self.reqid = candidate
356
+ break
357
+
358
+ return self
359
+
360
+
361
+ class WorkflowRunListResponse(BaseModel):
362
+ list: List[WorkflowRun]
363
+ total: int
364
+ page: int
365
+ page_size: int
366
+
367
+
368
+ class NodeInstanceBase(BaseModel):
369
+ run_id: uuid.UUID
370
+ node_id: str
371
+ loop_index: int = 1
372
+ status: NodeStatus = NodeStatus.PENDING
373
+ input_data: Dict[str, Any] = Field(default_factory=dict)
374
+ final_output: Optional[Dict[str, Any]] = None
375
+ attempt_count: int = 0
376
+ error_msg: Optional[str] = None
377
+
378
+
379
+ class NodeInstance(NodeInstanceBase):
380
+ model_config = ConfigDict(from_attributes=True)
381
+
382
+ id: uuid.UUID
383
+ flag: int
384
+ created_time: datetime
385
+ update_time: datetime
386
+
387
+
388
+ class ExecutionLogBase(BaseModel):
389
+ node_instance_id: uuid.UUID
390
+ attempt_no: int
391
+ status: ExecutionLogStatus = ExecutionLogStatus.PENDING
392
+ request_snapshot: Dict[str, Any] = Field(default_factory=dict)
393
+ response_snapshot: Optional[Dict[str, Any]] = None
394
+ error_detail: Optional[str] = None
395
+ duration_ms: Optional[int] = None
396
+ started_at: Optional[datetime] = Field(
397
+ default=None,
398
+ validation_alias=AliasChoices("started_at", "start_time"),
399
+ serialization_alias="started_at",
400
+ )
401
+ finished_at: Optional[datetime] = Field(
402
+ default=None,
403
+ validation_alias=AliasChoices("finished_at", "end_time"),
404
+ serialization_alias="finished_at",
405
+ )
406
+
407
+
408
+ class ExecutionLog(ExecutionLogBase):
409
+ model_config = ConfigDict(from_attributes=True)
410
+
411
+ id: uuid.UUID
412
+ flag: int
413
+ created_time: datetime
414
+ update_time: datetime
415
+
416
+
417
+ class NodeExecutionHistory(BaseModel):
418
+ node_id: str
419
+ loop_index: int
420
+ status: NodeStatus
421
+ output: Optional[Dict[str, Any]] = None
422
+ logs: List[ExecutionLog] = Field(default_factory=list)
423
+
424
+
425
+ class NodeExecutionHistoryResponse(BaseModel):
426
+ histories: List[NodeExecutionHistory] = Field(default_factory=list)
427
+
428
+
429
+ # ==================== Runtime Context Models ====================
430
+ class NodeOutput(BaseModel):
431
+ output: Optional[Dict[str, Any]] = None
432
+ status: NodeStatus = NodeStatus.PENDING
433
+
434
+
435
+ class WorkflowExecutionContext(BaseModel):
436
+ run_id: uuid.UUID
437
+ global_context: Dict[str, Any] = Field(default_factory=dict)
438
+ nodes: Dict[str, NodeOutput] = Field(default_factory=dict)
439
+ loop_index: int = 1
440
+ callback_url: Optional[str] = None
441
+
442
+
443
+ class HttpResponseOutput(BaseModel):
444
+ status_code: int
445
+ headers: Dict[str, Any]
446
+ text: Optional[str] = None
447
+ json_body: Optional[Dict[str, Any]] = None
448
+ ok: bool = True
449
+
450
+
451
+ # ==================== Public API Payloads ====================
452
+ class WorkflowTriggerRequest(BaseModel):
453
+ trigger_context: Dict[str, Any] = Field(default_factory=dict)
454
+
455
+
456
+ class WorkflowTriggerResponse(BaseModel):
457
+ run_id: str
458
+ dispatch_status: TriggerDispatchStatus
459
+
460
+
461
+ class WorkflowRollbackRequest(BaseModel):
462
+ """工作流回滚请求载体 / Workflow rollback request payload"""
463
+
464
+ target_version: int = Field(..., ge=1)
465
+ reason: Optional[str] = Field(default=None, max_length=255)
466
+
467
+
468
+ class WorkflowStats(BaseModel):
469
+ total_definitions: int = 0
470
+ active_definitions: int = 0
471
+ scheduled_definitions: int = 0
472
+ total_runs: int = 0
473
+ runs_by_status: Dict[str, int] = Field(default_factory=dict)
474
+ runs_today: int = 0
475
+ failed_runs_today: int = 0
476
+ success_rate_24h: float = 0.0
477
+ running_runs: int = 0
478
+ pending_runs: int = 0
479
+ active_node_instances: int = 0
480
+ waiting_node_instances: int = 0
481
+ inflight_attempts: int = 0
482
+ next_cron_window: Optional[str] = None
483
+
484
+
485
+ class RunGraphNode(BaseModel):
486
+ node_id: str
487
+ label: str
488
+ type: NodeType
489
+ status: NodeStatus
490
+ loop_index: int = 1
491
+ position: Optional[VueFlowPosition] = None
492
+ ui: Dict[str, Any] = Field(default_factory=dict)
493
+ last_output: Optional[Dict[str, Any]] = None
494
+ node_config_snapshot: Optional[Dict[str, Any]] = None
495
+
496
+
497
+ class RunGraphResponse(BaseModel):
498
+ run_id: str
499
+ status: WorkflowStatus
500
+ graph_version: Optional[int] = None
501
+ nodes: List[RunGraphNode] = Field(default_factory=list)
502
+ edges: List[WorkflowGraphEdge] = Field(default_factory=list)
503
+
504
+
505
+ class CallbackAckResponse(BaseModel):
506
+ status: CallbackAckStatus
507
+
508
+
509
+ # ==================== Engine Alerts ====================
510
+ class WorkflowEngineAlertDetail(BaseModel):
511
+ """工作流引擎告警详情载荷 / Structured alert detail payload."""
512
+
513
+ model_config = ConfigDict(extra="allow")
514
+
515
+ run_id: Optional[str] = None
516
+ workflow_id: Optional[str] = None
517
+ node_id: Optional[str] = None
518
+ error: Optional[str] = None
519
+
520
+
521
+ class WorkflowEngineAlertBase(BaseModel):
522
+ run_id: Optional[uuid.UUID] = None
523
+ node_id: str
524
+ loop_index: int = 1
525
+ severity: WorkflowEngineAlertSeverity = WorkflowEngineAlertSeverity.CRITICAL
526
+ category: WorkflowEngineAlertCategory = WorkflowEngineAlertCategory.ORCHESTRATOR_GUARD
527
+ reason: WorkflowEngineAlertReason
528
+ detail: WorkflowEngineAlertDetail = Field(default_factory=WorkflowEngineAlertDetail)
529
+ status: WorkflowEngineAlertStatus = WorkflowEngineAlertStatus.OPEN
530
+ note: Optional[str] = None
531
+
532
+
533
+ class WorkflowEngineAlert(WorkflowEngineAlertBase):
534
+ model_config = ConfigDict(from_attributes=True)
535
+
536
+ id: uuid.UUID
537
+ acknowledged_by: Optional[str] = None
538
+ acknowledged_at: Optional[datetime] = None
539
+ resolved_by: Optional[str] = None
540
+ resolved_at: Optional[datetime] = None
541
+ created_time: datetime
542
+ update_time: datetime
543
+
544
+
545
+ class WorkflowEngineAlertCreate(WorkflowEngineAlertBase):
546
+ pass
547
+
548
+
549
+ class WorkflowEngineAlertAckRequest(BaseModel):
550
+ operator: Optional[str] = Field(default=None, max_length=64)
551
+ note: Optional[str] = Field(default=None, max_length=500)
552
+
553
+
554
+ class WorkflowEngineAlertQuery(BaseModel):
555
+ status: Optional[WorkflowEngineAlertStatus] = None
556
+ severity: Optional[WorkflowEngineAlertSeverity] = None
557
+ page: int = Field(default=1, ge=1)
558
+ page_size: int = Field(default=20, ge=1, le=200)
559
+ run_id: Optional[str] = None
560
+
561
+
562
+ class WorkflowEngineAlertListResponse(BaseModel):
563
+ list: List[WorkflowEngineAlert] = Field(default_factory=list)
564
+ total: int = 0
565
+ page: int = 1
566
+ page_size: int = 20
@@ -0,0 +1 @@
1
+ """日志事件类型导出 / Log event type exports."""
@@ -0,0 +1,121 @@
1
+ """业务日志事件模型 / Business log event models."""
2
+ from datetime import (
3
+ datetime,
4
+ timezone,
5
+ )
6
+ from typing import (
7
+ Any,
8
+ Dict,
9
+ List,
10
+ Optional,
11
+ )
12
+
13
+ from pydantic import (
14
+ BaseModel,
15
+ ConfigDict,
16
+ Field,
17
+ ValidationInfo,
18
+ field_serializer,
19
+ field_validator,
20
+ )
21
+
22
+ from cancan_microstack.public.const.app_consts import LogLevelEnum
23
+
24
+
25
+ class LogEventBase(BaseModel):
26
+ """日志事件公共字段 / Shared log event fields."""
27
+
28
+ model_config = ConfigDict(
29
+ from_attributes=True,
30
+ populate_by_name=True,
31
+ )
32
+
33
+ event_id: str = Field(..., description="日志事件唯一 ID / Unique log event id")
34
+ service_name: str = Field(..., description="服务名称 / Service name")
35
+ instance_id: str = Field(..., description="实例 ID / Instance identifier")
36
+ level: LogLevelEnum = Field(..., description="日志等级 / Log level")
37
+ message: str = Field(..., description="日志内容 / Log message body")
38
+ timestamp: datetime = Field(..., description="UTC 时间戳 / UTC timestamp")
39
+ ip: str = Field(..., description="实例 IP / Instance IP address")
40
+ host: str = Field(..., description="主机名 / Hostname")
41
+ logger_name: str = Field(..., description="记录器名称 / Logger name")
42
+ file: str = Field(..., description="源文件路径 / Source file path")
43
+ line_no: int = Field(..., description="行号 / Source line number")
44
+ func_name: str = Field(..., description="函数名 / Function name")
45
+ trace_id: str = Field(..., description="请求/链路 ID / Trace identifier")
46
+ metadata: Dict[str, Any] = Field(default_factory=dict, description="附加元数据 / Additional metadata")
47
+
48
+ @field_serializer("timestamp", when_used="json")
49
+ def serialize_timestamp(self, value: datetime) -> str:
50
+ """确保输出为带时区的 ISO 8601 字符串。
51
+ Ensure JSON output is timezone-aware ISO 8601.
52
+ """
53
+
54
+ if value.tzinfo is None:
55
+ value = value.replace(tzinfo=timezone.utc)
56
+ return value.isoformat()
57
+
58
+
59
+ class LogEventCreate(LogEventBase):
60
+ """生产端使用的日志事件结构 / Producer-side log event structure."""
61
+
62
+
63
+ class LogEventDocument(LogEventBase):
64
+ """MongoDB 持久化结构 / MongoDB document representation."""
65
+
66
+ metadata_flattened: List[str] = Field(
67
+ default_factory=list,
68
+ description="扁平化元数据用于搜索 / Flattened metadata tokens",
69
+ )
70
+ created_at: datetime = Field(
71
+ default_factory=lambda: datetime.now(timezone.utc),
72
+ description="文档创建时间 / Document creation time",
73
+ )
74
+
75
+ @field_serializer("created_at", when_used="json")
76
+ def serialize_created_at(self, value: datetime) -> str:
77
+ """确保输出为带时区的 ISO 8601 字符串。
78
+ Ensure JSON output is timezone-aware ISO 8601.
79
+ """
80
+
81
+ if value.tzinfo is None:
82
+ value = value.replace(tzinfo=timezone.utc)
83
+ return value.isoformat()
84
+
85
+
86
+ class LogQueryRequest(BaseModel):
87
+ """日志查询请求参数 / Log query request DTO."""
88
+
89
+ model_config = ConfigDict(from_attributes=True, populate_by_name=True)
90
+
91
+ service_names: List[str] = Field(..., min_length=1, description="服务列表 / Service names")
92
+ start_time: datetime = Field(..., description="开始时间 / Start time (UTC)")
93
+ end_time: datetime = Field(..., description="结束时间 / End time (UTC)")
94
+ levels: Optional[List[LogLevelEnum]] = Field(default=None, description="日志等级过滤 / Optional log levels")
95
+ keywords: Optional[List[str]] = Field(default=None, description="关键字列表 / Keywords for text search")
96
+ method_names: Optional[List[str]] = Field(default=None, description="方法名过滤 / Method name filters")
97
+ ip_addresses: Optional[List[str]] = Field(default=None, description="IP 过滤 / IP filters")
98
+ instance_ids: Optional[List[str]] = Field(default=None, description="实例过滤 / Instance filters")
99
+ page: int = Field(default=1, ge=1, description="页码 / Page number")
100
+ page_size: int = Field(default=100, ge=1, le=500, description="每页数量 / Page size")
101
+
102
+ @field_validator("end_time")
103
+ @classmethod
104
+ def validate_time_range(cls, end_time: datetime, info: ValidationInfo) -> datetime:
105
+ """确保结束时间大于开始时间 / Ensure end_time > start_time."""
106
+ start_time = info.data.get("start_time")
107
+ if start_time and end_time <= start_time:
108
+ raise ValueError("end_time must be greater than start_time")
109
+ return end_time
110
+
111
+
112
+ class LogQueryResponse(BaseModel):
113
+ """日志查询响应结构 / Log query response DTO."""
114
+
115
+ model_config = ConfigDict(from_attributes=True, populate_by_name=True)
116
+
117
+ items: List[LogEventDocument] = Field(default_factory=list, description="日志列表 / Log entries")
118
+ total: int = Field(default=0, ge=0, description="总数 / Total count")
119
+ page: int = Field(default=1, ge=1, description="当前页 / Current page")
120
+ page_size: int = Field(default=100, ge=1, description="每页数量 / Page size")
121
+ has_next: bool = Field(default=False, description="是否有下一页 / Whether more pages exist")
@@ -0,0 +1 @@
1
+ """opsbffsrv 模块的类型聚合 / Aggregated type exports for opsbffsrv."""
@@ -0,0 +1,17 @@
1
+ """
2
+ Pydantic models for asynchronous operations in opsbffsrv.
3
+ """
4
+ from pydantic import (
5
+ BaseModel,
6
+ Field,
7
+ )
8
+
9
+ from cancan_microstack.public.const.operation_consts import OperationStatus
10
+
11
+
12
+ class AsyncOperationResponse(BaseModel):
13
+ """Response model for submitting an asynchronous operation."""
14
+ operation_id: str = Field(..., description="The unique ID of the submitted operation.")
15
+ status: OperationStatus = Field(..., description="The initial status of the operation.")
16
+ message: str = Field(..., description="A message indicating the result of the submission.")
17
+ service_name: str = Field(..., description="The full name of the target service.")