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,265 @@
1
+ """
2
+ infrasrv 内部实例管理 API
3
+
4
+ 供 controllersrv 调用,用于多实例管理
5
+ """
6
+ from typing import Optional
7
+ import http
8
+
9
+ from linglong_web import build_success_response
10
+ from cancan_microstack.public.schemas.common import APIResponse
11
+ from cancan_microstack.public.error import HTTPException
12
+ from cancan_microstack.public.const.error import ErrorCode
13
+ from cancan_microstack.public.const.service_consts import InstanceStatus
14
+ from linglong_web.utils import logger
15
+ from cancan_microstack.services.infrasrv.infrastructure.db.operate.service_instance_op import (
16
+ insert_instance,
17
+ update_instance,
18
+ delete_instance_by_id,
19
+ get_instance_by_id,
20
+ list_instances_by_service,
21
+ count_instances_by_service,
22
+ get_instances_by_status,
23
+ )
24
+ from cancan_microstack.services.infrasrv.infrastructure.db.operate.service_info_op import (
25
+ update_service_replicas,
26
+ )
27
+ from cancan_microstack.public.schemas.infra.service_instance import ServiceInstanceCreate, ServiceInstanceUpdate
28
+
29
+
30
+ async def internal_create_instance_handler(
31
+ service_name: str,
32
+ instance_id: str,
33
+ container_name: str,
34
+ compose_service_name: str,
35
+ host: str,
36
+ port: int,
37
+ internal_port: int = 8080,
38
+ status: str = InstanceStatus.STARTING,
39
+ expected_status: str = InstanceStatus.RUNNING,
40
+ instance_metadata: Optional[dict] = None,
41
+ ) -> APIResponse[dict | None]:
42
+ """
43
+ 创建实例记录
44
+
45
+ Args:
46
+ service_name: 服务名称
47
+ instance_id: 实例ID
48
+ container_name: 容器名称
49
+ compose_service_name: Docker Compose 服务名
50
+ host: 宿主机地址
51
+ port: 服务端口
52
+ internal_port: 容器内部端口
53
+ status: 实例状态
54
+ expected_status: 期望状态
55
+ instance_metadata: 实例元数据
56
+ """
57
+ instance_data = ServiceInstanceCreate(
58
+ service_name=service_name,
59
+ instance_id=instance_id,
60
+ container_name=container_name,
61
+ compose_service_name=compose_service_name,
62
+ host=host,
63
+ port=port,
64
+ internal_port=internal_port,
65
+ status=status,
66
+ expected_status=expected_status,
67
+ instance_metadata=instance_metadata or {}
68
+ )
69
+
70
+ await insert_instance(instance_data)
71
+
72
+ logger.info(f"Instance created: {instance_id}")
73
+ return build_success_response(data={"instance_id": instance_id})
74
+
75
+
76
+ async def internal_update_instance_handler(
77
+ instance_id: str,
78
+ status: Optional[str] = None,
79
+ health_status: Optional[str] = None,
80
+ started_at: Optional[str] = None,
81
+ stopped_at: Optional[str] = None,
82
+ last_heartbeat: Optional[str] = None,
83
+ consecutive_failures: Optional[int] = None,
84
+ instance_metadata: Optional[dict] = None,
85
+ ) -> APIResponse[dict | None]:
86
+ """
87
+ 更新实例信息
88
+
89
+ Args:
90
+ instance_id: 实例ID
91
+ status: 实例状态
92
+ health_status: 健康状态
93
+ started_at: 启动时间
94
+ stopped_at: 停止时间
95
+ last_heartbeat: 最后心跳时间
96
+ consecutive_failures: 连续失败次数
97
+ instance_metadata: 实例元数据
98
+ """
99
+ # 注意:last_heartbeat 映射到 last_health_check
100
+ update_data = ServiceInstanceUpdate(
101
+ status=status,
102
+ health_status=health_status,
103
+ started_at=started_at,
104
+ stopped_at=stopped_at,
105
+ last_health_check=last_heartbeat,
106
+ consecutive_failures=consecutive_failures,
107
+ instance_metadata=instance_metadata
108
+ )
109
+
110
+ await update_instance(instance_id, update_data)
111
+
112
+ logger.debug(f"Instance updated: {instance_id}")
113
+ return build_success_response(data={"instance_id": instance_id})
114
+
115
+
116
+ async def internal_delete_instance_handler(instance_id: str) -> APIResponse[dict | None]:
117
+ """
118
+ 删除实例记录
119
+
120
+ Args:
121
+ instance_id: 实例ID
122
+ """
123
+ await delete_instance_by_id(instance_id)
124
+
125
+ logger.info(f"Instance deleted: {instance_id}")
126
+ return build_success_response(data={"instance_id": instance_id})
127
+
128
+
129
+ async def internal_get_instance_handler(instance_id: str) -> APIResponse[dict | None]:
130
+ """
131
+ 获取实例信息
132
+
133
+ Args:
134
+ instance_id: 实例ID
135
+ """
136
+ instance = await get_instance_by_id(instance_id)
137
+
138
+ if not instance:
139
+ raise HTTPException(
140
+ status_code=http.HTTPStatus.NOT_FOUND.value,
141
+ error_code=ErrorCode.HANDLER_NOT_FOUND,
142
+ msg="Instance not found",
143
+ )
144
+
145
+ return build_success_response(data=instance.model_dump())
146
+
147
+
148
+ async def internal_list_instances_handler(
149
+ service_name: Optional[str] = None,
150
+ status: Optional[str] = None,
151
+ ) -> APIResponse[dict]:
152
+ """
153
+ 列出实例
154
+
155
+ Args:
156
+ service_name: 服务名称(可选)
157
+ status: 状态过滤(可选)
158
+ """
159
+ if status:
160
+ instances = await get_instances_by_status(status)
161
+ if service_name:
162
+ instances = [i for i in instances if i.service_name == service_name]
163
+ elif service_name:
164
+ instances = await list_instances_by_service(service_name)
165
+ else:
166
+ # 获取所有实例
167
+ instances = await get_instances_by_status(InstanceStatus.RUNNING)
168
+ instances.extend(await get_instances_by_status(InstanceStatus.STOPPED))
169
+ instances.extend(await get_instances_by_status(InstanceStatus.STARTING))
170
+ instances.extend(await get_instances_by_status(InstanceStatus.STOPPING))
171
+
172
+ return build_success_response(
173
+ data={
174
+ "instances": [i.model_dump() for i in instances],
175
+ "count": len(instances),
176
+ }
177
+ )
178
+
179
+
180
+ async def internal_count_instances_handler(
181
+ service_name: str,
182
+ status: Optional[str] = None,
183
+ ) -> APIResponse[dict]:
184
+ """
185
+ 统计实例数量
186
+
187
+ Args:
188
+ service_name: 服务名称
189
+ status: 状态过滤(可选)
190
+ """
191
+ count = await count_instances_by_service(service_name, status)
192
+
193
+ return build_success_response(data={"count": count})
194
+
195
+
196
+ async def internal_get_next_port_handler(
197
+ service_name: str,
198
+ start_port: int,
199
+ end_port: int,
200
+ ) -> APIResponse[dict | None]:
201
+ """
202
+ 获取服务的下一个可用端口
203
+
204
+ Args:
205
+ service_name: 服务名称
206
+ start_port: 起始端口
207
+ end_port: 结束端口
208
+ """
209
+ # 获取服务的所有实例
210
+ instances = await list_instances_by_service(service_name)
211
+
212
+ # 获取已使用的端口
213
+ used_ports = {inst.port for inst in instances if inst.port}
214
+
215
+ # 查找第一个可用端口
216
+ for port in range(start_port, end_port + 1):
217
+ if port not in used_ports:
218
+ logger.debug(f"Allocated port {port} for service {service_name}")
219
+ return build_success_response(data={"port": port})
220
+
221
+ # 没有可用端口
222
+ logger.warning(f"No available ports for service {service_name} in range {start_port}-{end_port}")
223
+ raise HTTPException(
224
+ status_code=http.HTTPStatus.SERVICE_UNAVAILABLE.value,
225
+ error_code=ErrorCode.SYSTEM_ERROR,
226
+ msg="No available ports",
227
+ )
228
+
229
+
230
+ async def internal_update_service_replicas_handler(
231
+ service_name: str,
232
+ desired_replicas: int,
233
+ actual_replicas: int,
234
+ last_scale_at: Optional[str] = None,
235
+ ) -> APIResponse[dict]:
236
+ """
237
+ 记录服务的副本数信息(仅记录期望状态,不实际扩缩容)
238
+
239
+ ⚠️ 重要:本接口仅把 desired_replicas / actual_replicas 写入 service_info 表,
240
+ 用于记录"期望副本数(desired state)"和上游上报的"实际副本数"。
241
+ 它**不会真正增减运行中的容器**——infrasrv 没有扩缩容执行能力,
242
+ controllersrv 也未实现 scale 动作。要真正改变运行实例数,需由外部编排
243
+ (如手动 docker-compose scale)完成后,再由上游调用本接口回填 actual_replicas。
244
+
245
+ Args:
246
+ service_name: 服务名称
247
+ desired_replicas: 期望副本数(仅记录,不触发扩缩容)
248
+ actual_replicas: 实际副本数(由上游上报回填,本接口不会去核对真实容器数)
249
+ last_scale_at: 最后扩缩容时间 (API 参数保留,但 op 层在 desired_replicas 变更时自动写入)
250
+ """
251
+ service_info = await update_service_replicas(
252
+ service_name=service_name,
253
+ desired_replicas=desired_replicas,
254
+ actual_replicas=actual_replicas,
255
+ )
256
+
257
+ if not service_info:
258
+ raise HTTPException(
259
+ status_code=http.HTTPStatus.NOT_FOUND.value,
260
+ error_code=ErrorCode.HANDLER_NOT_FOUND,
261
+ msg=f"Service info not found for {service_name}"
262
+ )
263
+
264
+ logger.info(f"Service replicas updated: {service_name} (desired={desired_replicas}, actual={actual_replicas})")
265
+ return build_success_response(data=service_info.model_dump())
@@ -0,0 +1,206 @@
1
+ """
2
+ 内部操作管理 API
3
+
4
+ 提供给 controllersrv 使用的内部接口,用于管理操作记录
5
+ """
6
+ from typing import Optional
7
+ from datetime import datetime
8
+ import http
9
+
10
+ from pydantic import (
11
+ BaseModel,
12
+ Field,
13
+ )
14
+ from linglong_web import build_success_response
15
+ from cancan_microstack.public.schemas.common import APIResponse
16
+ from cancan_microstack.public.error import HTTPException
17
+ from cancan_microstack.public.const.error import ErrorCode
18
+ from cancan_microstack.services.infrasrv.infrastructure.db.operate.service_operation_op import (
19
+ create_operation,
20
+ get_operation_by_id,
21
+ update_operation,
22
+ query_operations,
23
+ get_timeout_operations,
24
+ )
25
+ from cancan_microstack.public.schemas.infra.service_operation import (
26
+ ServiceOperation,
27
+ ServiceOperationCreate,
28
+ ServiceOperationUpdate,
29
+ ServiceOperationQuery,
30
+ )
31
+ from linglong_web.utils.time import to_server_tz_iso
32
+
33
+
34
+ def _serialize_operation(operation: Optional[ServiceOperation]) -> Optional[dict]:
35
+ """统一序列化操作记录,确保时间字段为东八区 ISO 字符串 / Serialize operation with Asia/Shanghai timestamps."""
36
+ if not operation:
37
+ return None
38
+ data = operation.model_dump()
39
+ for field_name in ("started_at", "completed_at", "last_retry_at", "created_time", "update_time"):
40
+ data[field_name] = to_server_tz_iso(getattr(operation, field_name, None))
41
+ return data
42
+
43
+
44
+ class InternalOperationCreateRequest(BaseModel):
45
+ """内部操作创建请求"""
46
+ operation_id: str
47
+ operation_type: str
48
+ service_name: str
49
+ operation_params: dict = Field(default_factory=dict)
50
+ status: str = "pending"
51
+ initiated_by: str = "controllersrv"
52
+ initiated_from: str = "localhost"
53
+
54
+
55
+ class InternalOperationUpdateRequest(BaseModel):
56
+ """内部操作更新请求"""
57
+ operation_id: str
58
+ status: Optional[str] = None
59
+ started_at: Optional[str] = None # ISO format string
60
+ completed_at: Optional[str] = None # ISO format string
61
+ result: Optional[dict] = None
62
+ error_message: Optional[str] = None
63
+
64
+
65
+ async def internal_create_operation_handler(
66
+ request: InternalOperationCreateRequest,
67
+ ) -> APIResponse[dict | None]:
68
+ """
69
+ 内部接口:创建操作记录
70
+
71
+ Args:
72
+ request: 操作创建请求
73
+
74
+ Returns:
75
+ 创建结果
76
+ """
77
+ operation_data = ServiceOperationCreate(
78
+ operation_id=request.operation_id,
79
+ operation_type=request.operation_type,
80
+ service_name=request.service_name,
81
+ operation_params=request.operation_params,
82
+ status=request.status,
83
+ initiated_by=request.initiated_by,
84
+ initiated_from=request.initiated_from,
85
+ )
86
+
87
+ operation = await create_operation(operation_data)
88
+
89
+ return build_success_response(
90
+ data={
91
+ "operation": _serialize_operation(operation),
92
+ }
93
+ )
94
+
95
+
96
+ async def internal_update_operation_handler(
97
+ request: InternalOperationUpdateRequest,
98
+ ) -> APIResponse[dict | None]:
99
+ """
100
+ 内部接口:更新操作记录
101
+
102
+ Args:
103
+ request: 操作更新请求
104
+
105
+ Returns:
106
+ 更新结果
107
+ """
108
+ update_data = ServiceOperationUpdate()
109
+
110
+ if request.status:
111
+ update_data.status = request.status
112
+
113
+ if request.started_at:
114
+ update_data.started_at = datetime.fromisoformat(request.started_at.replace('Z', '+00:00'))
115
+
116
+ if request.completed_at:
117
+ update_data.completed_at = datetime.fromisoformat(request.completed_at.replace('Z', '+00:00'))
118
+
119
+ if request.result:
120
+ update_data.result = request.result
121
+
122
+ if request.error_message:
123
+ update_data.error_message = request.error_message
124
+
125
+ operation = await update_operation(request.operation_id, update_data)
126
+
127
+ return build_success_response(
128
+ data={
129
+ "operation": _serialize_operation(operation),
130
+ }
131
+ )
132
+
133
+
134
+ async def internal_get_operation_handler(operation_id: str) -> APIResponse[dict | None]:
135
+ """
136
+ 内部接口:获取操作记录
137
+
138
+ Args:
139
+ operation_id: 操作ID
140
+
141
+ Returns:
142
+ 操作记录
143
+ """
144
+ operation = await get_operation_by_id(operation_id)
145
+
146
+ if operation:
147
+ return build_success_response(
148
+ data={
149
+ "operation": _serialize_operation(operation),
150
+ }
151
+ )
152
+ else:
153
+ raise HTTPException(
154
+ status_code=http.HTTPStatus.NOT_FOUND.value,
155
+ error_code=ErrorCode.HANDLER_NOT_FOUND,
156
+ msg=f"Operation not found: {operation_id}",
157
+ )
158
+
159
+
160
+ async def internal_list_operations_handler(
161
+ service_name: Optional[str] = None,
162
+ status: Optional[str] = None,
163
+ limit: int = 20,
164
+ ) -> APIResponse[dict]:
165
+ """
166
+ 内部接口:查询操作列表
167
+
168
+ Args:
169
+ service_name: 服务名称过滤
170
+ status: 状态过滤
171
+ limit: 返回数量限制
172
+
173
+ Returns:
174
+ 操作列表
175
+ """
176
+ query = ServiceOperationQuery(
177
+ service_name=service_name,
178
+ status=status,
179
+ limit=limit
180
+ )
181
+
182
+ operations = await query_operations(query)
183
+
184
+ return build_success_response(
185
+ data={
186
+ "operations": [_serialize_operation(op) for op in operations],
187
+ "count": len(operations),
188
+ }
189
+ )
190
+
191
+
192
+ async def internal_check_timeouts_handler() -> APIResponse[dict]:
193
+ """
194
+ 内部接口:检查超时操作
195
+
196
+ Returns:
197
+ 超时操作列表
198
+ """
199
+ timeout_operations = await get_timeout_operations()
200
+
201
+ return build_success_response(
202
+ data={
203
+ "timeout_operations": [_serialize_operation(op) for op in timeout_operations],
204
+ "count": len(timeout_operations),
205
+ }
206
+ )
@@ -0,0 +1,50 @@
1
+ from linglong_web import build_success_response
2
+ from cancan_microstack.public.schemas.common import APIResponse
3
+ from cancan_microstack.services.infrasrv.application.service_config import ServiceConfigApp
4
+
5
+ _service_config_app = ServiceConfigApp()
6
+
7
+
8
+ async def get_service_config_handler(service_name: str) -> APIResponse[dict | None]:
9
+ """
10
+ 获取服务配置
11
+ 供业务服务启动时拉取配置使用
12
+ """
13
+ data = await _service_config_app.get_service_config(service_name)
14
+ return build_success_response(data=data)
15
+
16
+
17
+ async def insert_service_config_handler(service_name: str, conf_data: dict) -> APIResponse[dict]:
18
+ """
19
+ 插入服务配置
20
+ 供配置管理使用
21
+ """
22
+ await _service_config_app.insert_service_config(service_name, conf_data)
23
+ return build_success_response(data={"message": "Service config inserted successfully"})
24
+
25
+
26
+ async def update_service_config_handler(service_name: str, conf_data: dict) -> APIResponse[dict]:
27
+ """
28
+ 更新服务配置
29
+ 供配置管理使用
30
+ """
31
+ await _service_config_app.update_service_config(service_name, conf_data)
32
+ return build_success_response(data={"message": "Service config updated successfully"})
33
+
34
+
35
+ async def get_all_service_configs_handler() -> APIResponse[dict]:
36
+ """
37
+ 获取所有服务配置
38
+ 供配置管理使用
39
+ """
40
+ data = await _service_config_app.get_all_service_configs()
41
+ return build_success_response(data=data)
42
+
43
+
44
+ async def delete_service_config_handler(service_name: str, conf_key: str) -> APIResponse[dict]:
45
+ """
46
+ 删除服务配置
47
+ 供配置管理使用
48
+ """
49
+ await _service_config_app.delete_service_config(service_name, conf_key)
50
+ return build_success_response(data={"message": "Service config deleted successfully"})
@@ -0,0 +1,49 @@
1
+ """
2
+ 服务行为日志查询 API - 为 opsbffsrv 提供日志查询接口
3
+ """
4
+
5
+ from typing import Optional
6
+
7
+ from linglong_web.utils import logger
8
+ from linglong_web import build_success_response
9
+ from cancan_microstack.public.schemas.common import APIResponse
10
+ from cancan_microstack.public.error import ParamError
11
+ from cancan_microstack.services.infrasrv.application.service_logs_app import ServiceLogsApp
12
+
13
+ _service_logs_app = ServiceLogsApp()
14
+
15
+
16
+ async def get_service_logs_handler(
17
+ service_name: Optional[str] = None,
18
+ action_type: Optional[str] = None,
19
+ action_status: Optional[str] = None,
20
+ limit: int = 100,
21
+ ) -> APIResponse[list[dict]]:
22
+ """
23
+ 查询服务行为日志
24
+
25
+ Args:
26
+ service_name: 服务名称(可选)
27
+ action_type: 操作类型(可选)
28
+ action_status: 操作状态(可选)
29
+ limit: 返回数量限制
30
+
31
+ Returns:
32
+ 统一响应格式
33
+ """
34
+ logger.info(
35
+ f"Query service logs: service_name={service_name}, "
36
+ f"action_type={action_type}, action_status={action_status}, limit={limit}"
37
+ )
38
+
39
+ if limit < 1 or limit > 1000:
40
+ raise ParamError("limit must be between 1 and 1000")
41
+
42
+ logs = await _service_logs_app.query_logs(
43
+ service_name=service_name,
44
+ action_type=action_type,
45
+ action_status=action_status,
46
+ limit=limit
47
+ )
48
+
49
+ return build_success_response(data=[log.model_dump() for log in logs])
@@ -0,0 +1,113 @@
1
+ """
2
+ 服务管理 API 接口层 / Service Management API Interface Layer
3
+
4
+ 提供统一的服务管理接口,供 opsbffsrv 调用 / Provides unified service management interface for opsbffsrv
5
+ """
6
+ from linglong_web.utils import logger
7
+ from linglong_web import build_success_response
8
+ from linglong_web.utils.time import to_server_tz_iso
9
+ from cancan_microstack.public.schemas.common import APIResponse
10
+ from cancan_microstack.public.schemas.infra.service_management import (
11
+ ServiceManagementRequest,
12
+ ServiceManagementResponse,
13
+ ServiceManagementAPIResponse,
14
+ )
15
+ from cancan_microstack.public.const.operation_consts import (
16
+ OperationType,
17
+ )
18
+ from cancan_microstack.services.infrasrv.application.service_management_app import ServiceManagementApp
19
+
20
+ # 全局应用层实例 / Global application layer instance
21
+ _app = ServiceManagementApp()
22
+
23
+
24
+ def _build_service_management_response(
25
+ response: ServiceManagementResponse,
26
+ ) -> APIResponse[dict]:
27
+ """将领域响应转换为标准 API 响应 / Convert domain response to standard API response."""
28
+
29
+ api_response = ServiceManagementAPIResponse(
30
+ operation_id=response.operation_id,
31
+ status=response.status,
32
+ service_name=response.service_name,
33
+ message=response.message,
34
+ result=response.result,
35
+ error_message=response.error_message,
36
+ # 出参统一转换为东八区,便于前端展示 / Convert timestamps to Asia/Shanghai for UI clarity
37
+ started_at=to_server_tz_iso(response.started_at),
38
+ completed_at=to_server_tz_iso(response.completed_at),
39
+ )
40
+ return build_success_response(data=api_response.model_dump())
41
+
42
+
43
+ async def start_service_handler(
44
+ request: ServiceManagementRequest,
45
+ ) -> APIResponse[dict]:
46
+ """
47
+ 启动服务 API Handler / Start Service API Handler
48
+
49
+ Args:
50
+ request: 服务管理请求 / Service management request
51
+
52
+ Returns:
53
+ 统一响应格式 / Unified response format
54
+ """
55
+ logger.info(
56
+ f"[API] Received start service request: operation_id={request.operation_id}, service={request.service_name}")
57
+
58
+ # 确保操作类型正确 / Ensure correct operation type
59
+ request.operation_type = OperationType.START
60
+
61
+ # 调用应用层执行操作 / Call application layer to execute operation
62
+ response: ServiceManagementResponse = await _app.execute_service_management(request)
63
+
64
+ return _build_service_management_response(response)
65
+
66
+
67
+ async def stop_service_handler(
68
+ request: ServiceManagementRequest,
69
+ ) -> APIResponse[dict]:
70
+ """
71
+ 停止服务 API Handler / Stop Service API Handler
72
+
73
+ Args:
74
+ request: 服务管理请求 / Service management request
75
+
76
+ Returns:
77
+ 统一响应格式 / Unified response format
78
+ """
79
+ logger.info(
80
+ f"[API] Received stop service request: operation_id={request.operation_id}, service={request.service_name}")
81
+
82
+ # 确保操作类型正确 / Ensure correct operation type
83
+ request.operation_type = OperationType.STOP
84
+
85
+ # 调用应用层执行操作 / Call application layer to execute operation
86
+ response: ServiceManagementResponse = await _app.execute_service_management(request)
87
+
88
+ return _build_service_management_response(response)
89
+
90
+
91
+ async def restart_service_handler(
92
+ request: ServiceManagementRequest,
93
+ ) -> APIResponse[dict]:
94
+ """
95
+ 重启服务 API Handler / Restart Service API Handler
96
+
97
+ Args:
98
+ request: 服务管理请求 / Service management request
99
+
100
+ Returns:
101
+ 统一响应格式 / Unified response format
102
+ """
103
+ logger.info(
104
+ f"[API] Received restart service request: operation_id={request.operation_id}, service={request.service_name}")
105
+
106
+ # 确保操作类型正确 / Ensure correct operation type
107
+ request.operation_type = OperationType.RESTART
108
+
109
+ # 调用应用层执行操作 / Call application layer to execute operation
110
+ response: ServiceManagementResponse = await _app.execute_service_management(request)
111
+
112
+ return _build_service_management_response(response)
113
+