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.
- cancan_microstack/__init__.py +14 -0
- cancan_microstack/__version__.py +10 -0
- cancan_microstack/assets/__init__.py +6 -0
- cancan_microstack/assets/builds/caddy/Caddyfile +187 -0
- cancan_microstack/assets/builds/caddy/DEPLOYMENT.md +303 -0
- cancan_microstack/assets/builds/caddy/Dockerfile +46 -0
- cancan_microstack/assets/builds/caddy/README.md +343 -0
- cancan_microstack/assets/builds/caddy/geoip/README.md +5 -0
- cancan_microstack/assets/builds/caddy/start.sh +78 -0
- cancan_microstack/assets/builds/caddy/waf/coraza.conf +179 -0
- cancan_microstack/assets/builds/service/Dockerfile +59 -0
- cancan_microstack/assets/builds/service/README.md +13 -0
- cancan_microstack/assets/ddl/create_db.sql +22 -0
- cancan_microstack/assets/ddl/infra/execution_log_tbl.sql +46 -0
- cancan_microstack/assets/ddl/infra/node_instance_tbl.sql +56 -0
- cancan_microstack/assets/ddl/infra/service_action_log_tbl.sql +36 -0
- cancan_microstack/assets/ddl/infra/service_config_tbl.sql +26 -0
- cancan_microstack/assets/ddl/infra/service_info_tbl.sql +45 -0
- cancan_microstack/assets/ddl/infra/service_instance_tbl.sql +54 -0
- cancan_microstack/assets/ddl/infra/service_operation_tbl.sql +47 -0
- cancan_microstack/assets/ddl/infra/workflow_definition_tbl.sql +60 -0
- cancan_microstack/assets/ddl/infra/workflow_definition_version_tbl.sql +35 -0
- cancan_microstack/assets/ddl/infra/workflow_engine_alert_tbl.sql +34 -0
- cancan_microstack/assets/ddl/infra/workflow_run_tbl.sql +52 -0
- cancan_microstack/assets/ddl/ops/admin_user_tbl.sql +34 -0
- cancan_microstack/assets/ddl/ops/caddy_access_log_tbl.sql +91 -0
- cancan_microstack/assets/ddl/ops/caddy_certificate_tbl.sql +59 -0
- cancan_microstack/assets/ddl/ops/caddy_rate_limit_tbl.sql +64 -0
- cancan_microstack/assets/ddl/ops/caddy_route_tbl.sql +63 -0
- cancan_microstack/assets/ddl/ops/caddy_stats_tbl.sql +77 -0
- cancan_microstack/assets/ddl/trigger.sql +21 -0
- cancan_microstack/assets/docker/docker-compose.infra.yml +401 -0
- cancan_microstack/assets/scripts/README.md +195 -0
- cancan_microstack/assets/scripts/docker/build_images.sh +44 -0
- cancan_microstack/assets/scripts/docker/force_rebuild_images.sh +38 -0
- cancan_microstack/assets/scripts/docker/rebuild_all.sh +34 -0
- cancan_microstack/assets/scripts/docker/rebuild_compose.sh +61 -0
- cancan_microstack/assets/scripts/docker/restart.sh +35 -0
- cancan_microstack/assets/scripts/docker/restart_compose.sh +35 -0
- cancan_microstack/assets/scripts/docker/start.sh +78 -0
- cancan_microstack/assets/scripts/docker/start_all.sh +46 -0
- cancan_microstack/assets/scripts/docker/start_compose.sh +66 -0
- cancan_microstack/assets/scripts/docker/stop.sh +67 -0
- cancan_microstack/assets/scripts/docker/stop_all.sh +38 -0
- cancan_microstack/assets/scripts/docker/stop_compose.sh +38 -0
- cancan_microstack/assets/scripts/podman/build_images_podman.sh +59 -0
- cancan_microstack/assets/scripts/podman/cleanup_podman.sh +25 -0
- cancan_microstack/assets/scripts/podman/force_rebuild_images_podman.sh +56 -0
- cancan_microstack/assets/scripts/podman/rebuild_all_podman.sh +37 -0
- cancan_microstack/assets/scripts/podman/rebuild_compose_podman.sh +60 -0
- cancan_microstack/assets/scripts/podman/restart_compose_podman.sh +73 -0
- cancan_microstack/assets/scripts/podman/start_all_podman.sh +66 -0
- cancan_microstack/assets/scripts/podman/start_compose_podman.sh +80 -0
- cancan_microstack/assets/scripts/podman/start_podman.sh +91 -0
- cancan_microstack/assets/scripts/podman/stop.sh +73 -0
- cancan_microstack/assets/scripts/podman/stop_all_podman.sh +34 -0
- cancan_microstack/assets/scripts/podman/stop_compose_podman.sh +58 -0
- cancan_microstack/assets/scripts/start_controllersrv.sh +9 -0
- cancan_microstack/assets/scripts/utils/check_all_db_tables.sh +104 -0
- cancan_microstack/assets/scripts/utils/check_env.sh +177 -0
- cancan_microstack/assets/scripts/utils/check_service_management_deployment.sh +225 -0
- cancan_microstack/assets/scripts/utils/deploy_service_management.sh +176 -0
- cancan_microstack/assets/scripts/utils/force_reload_infrasrv.sh +52 -0
- cancan_microstack/assets/scripts/utils/monitor_service_management.sh +187 -0
- cancan_microstack/assets/scripts/utils/reset_postgres_volume.sh +68 -0
- cancan_microstack/assets/scripts/utils/test_async_operations.sh +141 -0
- cancan_microstack/assets/scripts/utils/verify_real_operations.sh +76 -0
- cancan_microstack/assets/service/Dockerfile +65 -0
- cancan_microstack/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-BOKUurnM.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConfigManage-DKV5YOUz.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConfigManage-Y5bhy7wG.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ConsoleManage-8ljYvCW2.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ConsoleManage-BWpyqbuQ.css +1 -0
- cancan_microstack/assets/www/adminops/assets/DashboardNew-B9Nf1OPl.js +1 -0
- cancan_microstack/assets/www/adminops/assets/DashboardNew-DYWZKQ1V.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LogSearch-CA0Jhe78.js +1 -0
- cancan_microstack/assets/www/adminops/assets/LogSearch-CCZfTNPF.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LoginView-BId3kP3M.css +1 -0
- cancan_microstack/assets/www/adminops/assets/LoginView-BQZTV_Qy.js +1 -0
- cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-BdEYwqFq.js +1 -0
- cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-D-pASR8G.css +1 -0
- cancan_microstack/assets/www/adminops/assets/PageContainer-Byss-yUC.js +1 -0
- cancan_microstack/assets/www/adminops/assets/PageContainer-C3nSZwM7.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RateLimitManage-BDI8jLpC.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RateLimitManage-DJY4NiF-.js +1 -0
- cancan_microstack/assets/www/adminops/assets/RouteManage-DaUQ4QLw.css +1 -0
- cancan_microstack/assets/www/adminops/assets/RouteManage-w9XCU0UA.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceCard-BFzHe6Tw.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceCard-BJUhWnA-.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceDetail-Cw24WuKp.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceDetail-Yum47zdB.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceList-C7ryvbhE.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceList-Cgd01fUx.css +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceLogs-COpG9H0h.js +1 -0
- cancan_microstack/assets/www/adminops/assets/ServiceLogs-H_Alq0cf.css +1 -0
- cancan_microstack/assets/www/adminops/assets/StatsOverview-D0TwMQkA.js +39 -0
- cancan_microstack/assets/www/adminops/assets/StatsOverview-lqAN6pqM.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpBindView-CWlAmzFt.js +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpBindView-HoQC1lhx.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpVerifyView-BHN1VtX1.css +1 -0
- cancan_microstack/assets/www/adminops/assets/TotpVerifyView-D3w_lZk8.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowCenter-DU_mpIA0.css +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowCenter-i50rZyxN.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-CnHokPL9.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-DaZaZpLd.css +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowRuns-B09hK48c.js +1 -0
- cancan_microstack/assets/www/adminops/assets/WorkflowRuns-wGutKIIU.css +1 -0
- cancan_microstack/assets/www/adminops/assets/caddy-nnCKf8fG.js +1 -0
- cancan_microstack/assets/www/adminops/assets/format-Cuzxgna9.js +1 -0
- cancan_microstack/assets/www/adminops/assets/index-CiFlm8oc.js +64 -0
- cancan_microstack/assets/www/adminops/assets/index-UW0T1Dkc.css +1 -0
- cancan_microstack/assets/www/adminops/assets/service-BYlgGPs_.js +1 -0
- cancan_microstack/assets/www/adminops/assets/service-operation-6GzLw2Z1.js +1 -0
- cancan_microstack/assets/www/adminops/assets/style-CcIXnQ5y.css +1 -0
- cancan_microstack/assets/www/adminops/assets/style-lRnStdGu.js +39 -0
- cancan_microstack/assets/www/adminops/assets/useDebounce-BRlqfXqf.js +1 -0
- cancan_microstack/assets/www/adminops/assets/workflow-CUXs39Ac.js +1 -0
- cancan_microstack/assets/www/adminops/index.html +16 -0
- cancan_microstack/assets/www/adminops/vite.svg +1 -0
- cancan_microstack/cli/__init__.py +14 -0
- cancan_microstack/cli/__main__.py +9 -0
- cancan_microstack/cli/main.py +552 -0
- cancan_microstack/cmd/__init__.py +54 -0
- cancan_microstack/cmd/cancan/__init__.py +12 -0
- cancan_microstack/cmd/cancan/run.py +395 -0
- cancan_microstack/cmd/controllersrv/__init__.py +0 -0
- cancan_microstack/cmd/controllersrv/run.py +131 -0
- cancan_microstack/cmd/infrasrv/__init__.py +5 -0
- cancan_microstack/cmd/infrasrv/run.py +100 -0
- cancan_microstack/cmd/opsbffsrv/__init__.py +5 -0
- cancan_microstack/cmd/opsbffsrv/run.py +96 -0
- cancan_microstack/core/__init__.py +5 -0
- cancan_microstack/core/assets.py +123 -0
- cancan_microstack/core/compose_builder.py +102 -0
- cancan_microstack/core/doctor.py +152 -0
- cancan_microstack/core/microstack.py +71 -0
- cancan_microstack/core/runner.py +56 -0
- cancan_microstack/core/stack_manager.py +186 -0
- cancan_microstack/public/__init__.py +7 -0
- cancan_microstack/public/api/__init__.py +1 -0
- cancan_microstack/public/api/controllersrv_client.py +277 -0
- cancan_microstack/public/api/infrasrv_client.py +404 -0
- cancan_microstack/public/const/__init__.py +1 -0
- cancan_microstack/public/const/action_consts.py +18 -0
- cancan_microstack/public/const/app_consts.py +42 -0
- cancan_microstack/public/const/caddy_consts.py +22 -0
- cancan_microstack/public/const/controllersrv_consts.py +163 -0
- cancan_microstack/public/const/docker_consts.py +15 -0
- cancan_microstack/public/const/error.py +56 -0
- cancan_microstack/public/const/health_consts.py +52 -0
- cancan_microstack/public/const/hook_enums.py +56 -0
- cancan_microstack/public/const/logging_enums.py +13 -0
- cancan_microstack/public/const/metrics_enums.py +36 -0
- cancan_microstack/public/const/monitor_enums.py +26 -0
- cancan_microstack/public/const/operation_consts.py +53 -0
- cancan_microstack/public/const/opsbffsrv_error.py +92 -0
- cancan_microstack/public/const/overrides_consts.py +13 -0
- cancan_microstack/public/const/redis.py +17 -0
- cancan_microstack/public/const/service_consts.py +15 -0
- cancan_microstack/public/const/workflow_consts.py +65 -0
- cancan_microstack/public/error.py +41 -0
- cancan_microstack/public/logging/__init__.py +0 -0
- cancan_microstack/public/logging/initializer.py +109 -0
- cancan_microstack/public/logging/mq_handler.py +279 -0
- cancan_microstack/public/schemas/__init__.py +1 -0
- cancan_microstack/public/schemas/caddy/__init__.py +381 -0
- cancan_microstack/public/schemas/caddy/analysis.py +90 -0
- cancan_microstack/public/schemas/caddy/route.py +18 -0
- cancan_microstack/public/schemas/common.py +79 -0
- cancan_microstack/public/schemas/controllersrv/__init__.py +3 -0
- cancan_microstack/public/schemas/controllersrv/async_requests.py +30 -0
- cancan_microstack/public/schemas/controllersrv/compose_models.py +47 -0
- cancan_microstack/public/schemas/controllersrv/const.py +24 -0
- cancan_microstack/public/schemas/controllersrv/docker_models.py +45 -0
- cancan_microstack/public/schemas/controllersrv/docker_responses.py +104 -0
- cancan_microstack/public/schemas/controllersrv/requests.py +54 -0
- cancan_microstack/public/schemas/controllersrv/responses.py +124 -0
- cancan_microstack/public/schemas/controllersrv/task_models.py +102 -0
- cancan_microstack/public/schemas/controllersrv/validation.py +23 -0
- cancan_microstack/public/schemas/hook_metrics.py +124 -0
- cancan_microstack/public/schemas/hooks.py +39 -0
- cancan_microstack/public/schemas/infra/__init__.py +0 -0
- cancan_microstack/public/schemas/infra/cleanup.py +25 -0
- cancan_microstack/public/schemas/infra/container.py +74 -0
- cancan_microstack/public/schemas/infra/enums.py +135 -0
- cancan_microstack/public/schemas/infra/health_check.py +42 -0
- cancan_microstack/public/schemas/infra/hook_log.py +42 -0
- cancan_microstack/public/schemas/infra/operation.py +90 -0
- cancan_microstack/public/schemas/infra/overview.py +25 -0
- cancan_microstack/public/schemas/infra/push.py +33 -0
- cancan_microstack/public/schemas/infra/service_action_log.py +47 -0
- cancan_microstack/public/schemas/infra/service_config.py +10 -0
- cancan_microstack/public/schemas/infra/service_info.py +69 -0
- cancan_microstack/public/schemas/infra/service_instance.py +93 -0
- cancan_microstack/public/schemas/infra/service_management.py +152 -0
- cancan_microstack/public/schemas/infra/service_operation.py +79 -0
- cancan_microstack/public/schemas/infra/service_registry.py +158 -0
- cancan_microstack/public/schemas/infra/status_types.py +19 -0
- cancan_microstack/public/schemas/infra/workflow.py +566 -0
- cancan_microstack/public/schemas/logging/__init__.py +1 -0
- cancan_microstack/public/schemas/logging/log_event.py +121 -0
- cancan_microstack/public/schemas/opsbffsrv/__init__.py +1 -0
- cancan_microstack/public/schemas/opsbffsrv/async_ops.py +17 -0
- cancan_microstack/public/schemas/opsbffsrv/db_admin.py +147 -0
- cancan_microstack/public/schemas/opsbffsrv/db_init.py +48 -0
- cancan_microstack/public/schemas/opsbffsrv/service_config.py +89 -0
- cancan_microstack/public/schemas/opsbffsrv/service_logs.py +54 -0
- cancan_microstack/public/schemas/service_operation.py +24 -0
- cancan_microstack/public/schemas/service_registry.py +40 -0
- cancan_microstack/public/types/__init__.py +7 -0
- cancan_microstack/public/web/__init__.py +0 -0
- cancan_microstack/public/web/config_value.py +105 -0
- cancan_microstack/public/web/server.py +385 -0
- cancan_microstack/py.typed +0 -0
- cancan_microstack/runtime/__init__.py +0 -0
- cancan_microstack/runtime/compose_cmd.py +228 -0
- cancan_microstack/runtime/host_daemon.py +318 -0
- cancan_microstack/runtime/overrides.py +103 -0
- cancan_microstack/runtime/resources.py +25 -0
- cancan_microstack/runtime/workspace.py +94 -0
- cancan_microstack/services/__init__.py +0 -0
- cancan_microstack/services/controllersrv/__init__.py +8 -0
- cancan_microstack/services/controllersrv/application/__init__.py +0 -0
- cancan_microstack/services/controllersrv/application/docker_compose_app.py +427 -0
- cancan_microstack/services/controllersrv/conf/__init__.py +0 -0
- cancan_microstack/services/controllersrv/conf/config.py +76 -0
- cancan_microstack/services/controllersrv/conf/settings.py +54 -0
- cancan_microstack/services/controllersrv/domain/__init__.py +0 -0
- cancan_microstack/services/controllersrv/domain/docker_compose/__init__.py +0 -0
- cancan_microstack/services/controllersrv/domain/docker_compose/docker_compose_domain.py +278 -0
- cancan_microstack/services/controllersrv/domain/service_validator.py +327 -0
- cancan_microstack/services/controllersrv/domain/task/__init__.py +17 -0
- cancan_microstack/services/controllersrv/domain/task/task_queue.py +286 -0
- cancan_microstack/services/controllersrv/domain/task/task_worker.py +495 -0
- cancan_microstack/services/controllersrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/controllersrv/interface/api/docker_control_api.py +470 -0
- cancan_microstack/services/controllersrv/router.py +132 -0
- cancan_microstack/services/infrasrv/__init__.py +4 -0
- cancan_microstack/services/infrasrv/application/__init__.py +0 -0
- cancan_microstack/services/infrasrv/application/health_check_app.py +24 -0
- cancan_microstack/services/infrasrv/application/logging/__init__.py +1 -0
- cancan_microstack/services/infrasrv/application/logging/log_ingestion_service.py +183 -0
- cancan_microstack/services/infrasrv/application/service_config.py +22 -0
- cancan_microstack/services/infrasrv/application/service_logs_app.py +53 -0
- cancan_microstack/services/infrasrv/application/service_management_app.py +689 -0
- cancan_microstack/services/infrasrv/application/service_operation_tracker.py +251 -0
- cancan_microstack/services/infrasrv/application/service_registry.py +53 -0
- cancan_microstack/services/infrasrv/application/workflow/__init__.py +0 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_app.py +991 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_queue.py +302 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_tasks.py +46 -0
- cancan_microstack/services/infrasrv/application/workflow/workflow_worker_runtime.py +122 -0
- cancan_microstack/services/infrasrv/conf/__init__.py +0 -0
- cancan_microstack/services/infrasrv/conf/config.py +98 -0
- cancan_microstack/services/infrasrv/domain/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/health_check/__init__.py +3 -0
- cancan_microstack/services/infrasrv/domain/health_check/health_check_domain.py +576 -0
- cancan_microstack/services/infrasrv/domain/hooks/__init__.py +19 -0
- cancan_microstack/services/infrasrv/domain/hooks/builtin_hooks.py +308 -0
- cancan_microstack/services/infrasrv/domain/hooks/hook_registry.py +43 -0
- cancan_microstack/services/infrasrv/domain/hooks/hooks_log_utils.py +275 -0
- cancan_microstack/services/infrasrv/domain/hooks/init.py +17 -0
- cancan_microstack/services/infrasrv/domain/hooks/metrics.py +205 -0
- cancan_microstack/services/infrasrv/domain/hooks/pre_registration_hooks.py +490 -0
- cancan_microstack/services/infrasrv/domain/registry/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/registry/service_registry.py +509 -0
- cancan_microstack/services/infrasrv/domain/service_config/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/service_config/service_config.py +50 -0
- cancan_microstack/services/infrasrv/domain/service_logs/__init__.py +0 -0
- cancan_microstack/services/infrasrv/domain/service_logs/service_logs_domain.py +51 -0
- cancan_microstack/services/infrasrv/domain/workflow/__init__.py +4 -0
- cancan_microstack/services/infrasrv/domain/workflow/engine.py +159 -0
- cancan_microstack/services/infrasrv/domain/workflow/node_handlers.py +509 -0
- cancan_microstack/services/infrasrv/domain/workflow/workflow_domain.py +164 -0
- cancan_microstack/services/infrasrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/api/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/api/controllersrv_api.py +165 -0
- cancan_microstack/services/infrasrv/infrastructure/cache/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/cache/service_registry_cache.py +174 -0
- cancan_microstack/services/infrasrv/infrastructure/db/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/execution_log_tbl.py +53 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/node_instance_tbl.py +55 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_config_tbl.py +30 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_info_tbl.py +59 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_instance_tbl.py +88 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/service_operation_tbl.py +73 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_tbl.py +55 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_version_tbl.py +43 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_engine_alert_tbl.py +57 -0
- cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_run_tbl.py +56 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/__init__.py +0 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_action_log_op.py +239 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config.py +80 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config_manager.py +198 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_info_op.py +297 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_instance_op.py +688 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_operation_op.py +387 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/service_registry.py +124 -0
- cancan_microstack/services/infrasrv/infrastructure/db/operate/workflow_op.py +804 -0
- cancan_microstack/services/infrasrv/infrastructure/ddl_manager.py +31 -0
- cancan_microstack/services/infrasrv/infrastructure/mongo/__init__.py +1 -0
- cancan_microstack/services/infrasrv/infrastructure/mongo/log_repository.py +129 -0
- cancan_microstack/services/infrasrv/interface/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/api/health_check_api.py +29 -0
- cancan_microstack/services/infrasrv/interface/api/hooks.py +284 -0
- cancan_microstack/services/infrasrv/interface/api/internal.py +49 -0
- cancan_microstack/services/infrasrv/interface/api/internal_instance_api.py +265 -0
- cancan_microstack/services/infrasrv/interface/api/internal_operation_api.py +206 -0
- cancan_microstack/services/infrasrv/interface/api/service_config.py +50 -0
- cancan_microstack/services/infrasrv/interface/api/service_logs_api.py +49 -0
- cancan_microstack/services/infrasrv/interface/api/service_management_api.py +113 -0
- cancan_microstack/services/infrasrv/interface/api/service_registry.py +117 -0
- cancan_microstack/services/infrasrv/interface/api/workflow_api.py +303 -0
- cancan_microstack/services/infrasrv/interface/schedule/__init__.py +0 -0
- cancan_microstack/services/infrasrv/interface/schedule/cleanup.py +13 -0
- cancan_microstack/services/infrasrv/interface/schedule/health_check.py +27 -0
- cancan_microstack/services/infrasrv/interface/schedule/log_cleanup.py +26 -0
- cancan_microstack/services/infrasrv/interface/schedule/operation_tracker.py +25 -0
- cancan_microstack/services/infrasrv/interface/schedule/scheduler.py +39 -0
- cancan_microstack/services/infrasrv/interface/schedule/workflow_scheduler.py +115 -0
- cancan_microstack/services/infrasrv/router.py +341 -0
- cancan_microstack/services/opsbffsrv/__init__.py +4 -0
- cancan_microstack/services/opsbffsrv/application/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/application/async_operation_app.py +150 -0
- cancan_microstack/services/opsbffsrv/application/auth_app.py +285 -0
- cancan_microstack/services/opsbffsrv/application/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/application/caddy/access_log_analysis_app.py +344 -0
- cancan_microstack/services/opsbffsrv/application/caddy/access_log_ingestion_service.py +169 -0
- cancan_microstack/services/opsbffsrv/application/caddy/certificate_management_app.py +355 -0
- cancan_microstack/services/opsbffsrv/application/caddy/rate_limit_management_app.py +496 -0
- cancan_microstack/services/opsbffsrv/application/caddy/route_management_app.py +401 -0
- cancan_microstack/services/opsbffsrv/application/caddy/stats_aggregation_app.py +364 -0
- cancan_microstack/services/opsbffsrv/application/db_admin_app.py +103 -0
- cancan_microstack/services/opsbffsrv/application/db_init_app.py +283 -0
- cancan_microstack/services/opsbffsrv/application/logging/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/application/logging/log_query_app.py +28 -0
- cancan_microstack/services/opsbffsrv/application/service_config.py +158 -0
- cancan_microstack/services/opsbffsrv/application/service_logs_app.py +74 -0
- cancan_microstack/services/opsbffsrv/application/service_registry.py +36 -0
- cancan_microstack/services/opsbffsrv/application/workflow_ops_app.py +730 -0
- cancan_microstack/services/opsbffsrv/conf/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/conf/config.py +224 -0
- cancan_microstack/services/opsbffsrv/domain/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/auth/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/auth/admin_init.py +38 -0
- cancan_microstack/services/opsbffsrv/domain/auth/auth_domain.py +108 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/access_log_analysis.py +358 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/certificate_management.py +325 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/default_routes.py +53 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/rate_limit_management.py +308 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/route_management.py +279 -0
- cancan_microstack/services/opsbffsrv/domain/caddy/stats_aggregation.py +654 -0
- cancan_microstack/services/opsbffsrv/domain/db_admin/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/db_admin/db_admin_domain.py +118 -0
- cancan_microstack/services/opsbffsrv/domain/db_init/__init__.py +3 -0
- cancan_microstack/services/opsbffsrv/domain/db_init/db_init_domain.py +358 -0
- cancan_microstack/services/opsbffsrv/domain/logging/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/domain/logging/log_query_domain.py +99 -0
- cancan_microstack/services/opsbffsrv/domain/service_config/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/service_config/service_config.py +81 -0
- cancan_microstack/services/opsbffsrv/domain/service_registry/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/domain/service_registry/service_registry.py +292 -0
- cancan_microstack/services/opsbffsrv/infrastructure/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/api/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/api/infrasrv_api.py +242 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/captcha_service.py +67 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/password_service.py +12 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/redis_store.py +131 -0
- cancan_microstack/services/opsbffsrv/infrastructure/auth/totp_service.py +59 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/access_log_parser.py +307 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/admin_api_client.py +678 -0
- cancan_microstack/services/opsbffsrv/infrastructure/caddy/ip_geo_locator.py +176 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/admin_user_tbl.py +33 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_access_log_tbl.py +90 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_certificate_tbl.py +65 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_rate_limit_tbl.py +69 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_route_tbl.py +66 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_stats_tbl.py +78 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_config_tbl.py +30 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_info_tbl.py +51 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_instance_tbl.py +68 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/admin_user_operate.py +59 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_access_log.py +531 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_certificate.py +451 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_rate_limit.py +360 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_route.py +271 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_stats.py +343 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_action_log_op.py +57 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_config.py +86 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_info_op.py +79 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_instance.py +58 -0
- cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_registry.py +138 -0
- cancan_microstack/services/opsbffsrv/infrastructure/ddl_manager.py +31 -0
- cancan_microstack/services/opsbffsrv/infrastructure/mongo/__init__.py +1 -0
- cancan_microstack/services/opsbffsrv/infrastructure/mongo/log_query_repository.py +87 -0
- cancan_microstack/services/opsbffsrv/interface/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/api/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/api/async_operation_api.py +137 -0
- cancan_microstack/services/opsbffsrv/interface/api/auth_api.py +113 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/__init__.py +3 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/access_log_api.py +174 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/certificate_api.py +235 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/rate_limit_api.py +302 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/route_api.py +250 -0
- cancan_microstack/services/opsbffsrv/interface/api/caddy/stats_api.py +243 -0
- cancan_microstack/services/opsbffsrv/interface/api/db_admin_api.py +62 -0
- cancan_microstack/services/opsbffsrv/interface/api/db_init_api.py +109 -0
- cancan_microstack/services/opsbffsrv/interface/api/instance_management_api.py +165 -0
- cancan_microstack/services/opsbffsrv/interface/api/log_query_api.py +41 -0
- cancan_microstack/services/opsbffsrv/interface/api/mongo_express_proxy_api.py +181 -0
- cancan_microstack/services/opsbffsrv/interface/api/pgweb_proxy_api.py +154 -0
- cancan_microstack/services/opsbffsrv/interface/api/rabbitmq_mgmt_proxy_api.py +518 -0
- cancan_microstack/services/opsbffsrv/interface/api/redis_commander_proxy_api.py +133 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_config.py +146 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_logs_api.py +81 -0
- cancan_microstack/services/opsbffsrv/interface/api/service_registry.py +66 -0
- cancan_microstack/services/opsbffsrv/interface/api/workflow_ops_api.py +413 -0
- cancan_microstack/services/opsbffsrv/interface/middleware/__init__.py +0 -0
- cancan_microstack/services/opsbffsrv/interface/middleware/auth_middleware.py +52 -0
- cancan_microstack/services/opsbffsrv/router.py +901 -0
- cancan_microstack/utils/__init__.py +1 -0
- cancan_microstack/utils/container_env.py +218 -0
- cancan_microstack-0.0.1.dist-info/METADATA +155 -0
- cancan_microstack-0.0.1.dist-info/RECORD +440 -0
- cancan_microstack-0.0.1.dist-info/WHEEL +5 -0
- cancan_microstack-0.0.1.dist-info/entry_points.txt +2 -0
- cancan_microstack-0.0.1.dist-info/licenses/LICENSE +21 -0
- 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
|
+
|