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,31 @@
|
|
|
1
|
+
"""InfraSrv DDL 管理入口
|
|
2
|
+
InfraSrv entry point wiring the shared AutoDDLManager with service config.
|
|
3
|
+
"""
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from linglong_web import LinglongConfig
|
|
7
|
+
from linglong_web import (
|
|
8
|
+
AutoDDLManager,
|
|
9
|
+
DDLManagerConfig,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
from cancan_microstack.runtime.resources import resolve_workspace_or_asset
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _build_manager() -> AutoDDLManager:
|
|
16
|
+
"""构建通用 DDL 管理器实例 / Build service-specific AutoDDLManager"""
|
|
17
|
+
|
|
18
|
+
trigger_file = resolve_workspace_or_asset("ddl/trigger.sql", "ddl/trigger.sql")
|
|
19
|
+
|
|
20
|
+
config = DDLManagerConfig(
|
|
21
|
+
script_path=Path(LinglongConfig.DDL_SCRIPT_PATH),
|
|
22
|
+
enable_auto_init=LinglongConfig.ENABLE_DDL_AUTO_INIT,
|
|
23
|
+
trigger_sql_paths=(trigger_file,),
|
|
24
|
+
required_extensions=LinglongConfig.DDL_REQUIRED_EXTENSIONS,
|
|
25
|
+
)
|
|
26
|
+
return AutoDDLManager(config)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def init_ddl() -> bool:
|
|
30
|
+
"""初始化 DDL(供 AppServer 调用)/ Trigger schema auto-initialization"""
|
|
31
|
+
return await _build_manager().check_and_init_tables()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""infrasrv Mongo infrastructure package."""
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""MongoDB 日志存储仓库 / MongoDB repository for log documents."""
|
|
2
|
+
import asyncio
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing import (
|
|
5
|
+
Any,
|
|
6
|
+
List,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
from pymongo.asynchronous.collection import AsyncCollection
|
|
10
|
+
from pymongo import ASCENDING, DESCENDING
|
|
11
|
+
|
|
12
|
+
from cancan_microstack.public.schemas.logging.log_event import LogEventDocument
|
|
13
|
+
from linglong_web import LinglongConfig
|
|
14
|
+
from linglong_web import Rmanager
|
|
15
|
+
from linglong_web.utils import logger
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class InfraLogRepository:
|
|
19
|
+
"""封装 MongoDB 访问逻辑 / Encapsulate MongoDB operations for logs."""
|
|
20
|
+
|
|
21
|
+
def __init__(self) -> None:
|
|
22
|
+
"""
|
|
23
|
+
初始化仓库。
|
|
24
|
+
它从全局资源管理器获取 MongoDB 客户端,并从配置中获取数据库和集合名称。
|
|
25
|
+
|
|
26
|
+
Initializes the repository.
|
|
27
|
+
It reads database/collection names from the config; the MongoDB client is read
|
|
28
|
+
lazily at use time (see _init_collection), since resource initialization may happen
|
|
29
|
+
later in the server lifecycle.
|
|
30
|
+
"""
|
|
31
|
+
# 注意:不要在 __init__ 缓存 Rmanager.MongoClient。
|
|
32
|
+
# 该仓库可能在资源初始化之前被创建,缓存 None 会导致整个进程拿不到 client。
|
|
33
|
+
# 与 opsbffsrv 的 LogQueryRepository 保持一致:在使用处惰性读取。
|
|
34
|
+
# Note: do NOT cache Rmanager.MongoClient at __init__ time. This repo may be created
|
|
35
|
+
# before resources are initialized; caching None would make the client unavailable forever.
|
|
36
|
+
# Aligned with opsbffsrv's LogQueryRepository: read it lazily at use time.
|
|
37
|
+
self._db_name = LinglongConfig.MONGODB_DB
|
|
38
|
+
self._collection_name = LinglongConfig.MONGODB_COLLECTION
|
|
39
|
+
self._collection: AsyncCollection | None = None
|
|
40
|
+
self._index_lock = asyncio.Lock()
|
|
41
|
+
|
|
42
|
+
async def _init_collection(self) -> AsyncCollection:
|
|
43
|
+
"""
|
|
44
|
+
按需初始化集合对象并确保索引存在。
|
|
45
|
+
使用锁来防止并发的索引创建。
|
|
46
|
+
|
|
47
|
+
Initializes the collection object on-demand and ensures indexes exist.
|
|
48
|
+
Uses a lock to prevent concurrent index creation.
|
|
49
|
+
"""
|
|
50
|
+
if self._collection is not None:
|
|
51
|
+
return self._collection
|
|
52
|
+
|
|
53
|
+
async with self._index_lock:
|
|
54
|
+
# Double-check after acquiring the lock
|
|
55
|
+
if self._collection is not None:
|
|
56
|
+
return self._collection
|
|
57
|
+
|
|
58
|
+
client = Rmanager.MongoClient
|
|
59
|
+
if not client:
|
|
60
|
+
raise RuntimeError("MongoDB client is not available in Rmanager.")
|
|
61
|
+
|
|
62
|
+
collection = client[self._db_name][self._collection_name]
|
|
63
|
+
await self._ensure_indexes(collection)
|
|
64
|
+
self._collection = collection
|
|
65
|
+
logger.info(
|
|
66
|
+
"InfraLogRepository collection '%s/%s' initialized.", self._db_name, self._collection_name
|
|
67
|
+
)
|
|
68
|
+
return self._collection
|
|
69
|
+
|
|
70
|
+
async def _get_collection(self) -> AsyncCollection:
|
|
71
|
+
"""获取集合对象,如果需要则先进行初始化。/ Gets the collection object, initializing it if necessary."""
|
|
72
|
+
if self._collection is not None:
|
|
73
|
+
return self._collection
|
|
74
|
+
return await self._init_collection()
|
|
75
|
+
|
|
76
|
+
async def _ensure_indexes(self, collection: AsyncCollection) -> None:
|
|
77
|
+
"""确保 MongoDB 集合上存在所有必需的索引。/ Ensures all required indexes exist on the MongoDB collection."""
|
|
78
|
+
await collection.create_index(
|
|
79
|
+
[("service_name", ASCENDING), ("timestamp", DESCENDING)],
|
|
80
|
+
name="idx_service_ts",
|
|
81
|
+
)
|
|
82
|
+
await collection.create_index(
|
|
83
|
+
[("level", ASCENDING), ("timestamp", DESCENDING)],
|
|
84
|
+
name="idx_level_ts",
|
|
85
|
+
)
|
|
86
|
+
await collection.create_index(
|
|
87
|
+
[("ip", ASCENDING), ("timestamp", DESCENDING)],
|
|
88
|
+
name="idx_ip_ts",
|
|
89
|
+
)
|
|
90
|
+
await collection.create_index(
|
|
91
|
+
[("func_name", ASCENDING), ("timestamp", DESCENDING)],
|
|
92
|
+
name="idx_func_ts",
|
|
93
|
+
)
|
|
94
|
+
await collection.create_index(
|
|
95
|
+
[("message", "text"), ("metadata_flattened", "text")],
|
|
96
|
+
name="idx_text_search",
|
|
97
|
+
default_language="english",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
async def insert_event(self, document: LogEventDocument) -> None:
|
|
101
|
+
"""向集合中插入一个新的日志文档。/ Inserts a new log document into the collection."""
|
|
102
|
+
collection = await self._get_collection()
|
|
103
|
+
payload = document.model_dump()
|
|
104
|
+
await collection.insert_one(payload)
|
|
105
|
+
|
|
106
|
+
async def cleanup_older_than(self, cutoff: datetime, batch_limit: int) -> int:
|
|
107
|
+
"""删除早于给定截止时间的日志。/ Deletes logs older than a given cutoff time."""
|
|
108
|
+
collection = await self._get_collection()
|
|
109
|
+
cursor = (
|
|
110
|
+
collection.find({"timestamp": {"$lt": cutoff}}, projection={"_id": 1})
|
|
111
|
+
.sort("timestamp", ASCENDING)
|
|
112
|
+
.limit(batch_limit)
|
|
113
|
+
)
|
|
114
|
+
ids: List[Any] = [doc["_id"] async for doc in cursor]
|
|
115
|
+
|
|
116
|
+
if not ids:
|
|
117
|
+
return 0
|
|
118
|
+
result = await collection.delete_many({"_id": {"$in": ids}})
|
|
119
|
+
return int(result.deleted_count)
|
|
120
|
+
|
|
121
|
+
async def count_by_time_range(self, start: datetime, end: datetime) -> int:
|
|
122
|
+
"""计算给定时间范围内的文档数量。/ Counts documents within a given time range."""
|
|
123
|
+
collection = await self._get_collection()
|
|
124
|
+
return await collection.count_documents({"timestamp": {"$gte": start, "$lte": end}})
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
async def collection(self) -> AsyncCollection:
|
|
128
|
+
"""提供对底层集合对象的异步属性访问。/ Provides async property access to the underlying collection object."""
|
|
129
|
+
return await self._get_collection()
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""
|
|
2
|
+
健康检查 API
|
|
3
|
+
|
|
4
|
+
支持多实例健康检查
|
|
5
|
+
"""
|
|
6
|
+
from linglong_web import build_success_response
|
|
7
|
+
from cancan_microstack.public.schemas.common import APIResponse
|
|
8
|
+
from cancan_microstack.services.infrasrv.application.health_check_app import HealthCheckApp
|
|
9
|
+
|
|
10
|
+
_health_check_app = HealthCheckApp()
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def health_check_all_instances_handler() -> APIResponse[dict | None]:
|
|
14
|
+
"""
|
|
15
|
+
对所有实例进行健康检查
|
|
16
|
+
|
|
17
|
+
功能:
|
|
18
|
+
- 支持多实例检查
|
|
19
|
+
- 操作窗口期豁免
|
|
20
|
+
- 区分正常/异常关闭
|
|
21
|
+
- 自动重启不健康实例
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
健康检查结果汇总
|
|
25
|
+
"""
|
|
26
|
+
result = await _health_check_app.check_all_instances()
|
|
27
|
+
|
|
28
|
+
# 在 handler 层将 Pydantic model 序列化为 dict/JSON
|
|
29
|
+
return build_success_response(data=result.model_dump())
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""
|
|
2
|
+
钩子监控API接口
|
|
3
|
+
|
|
4
|
+
提供钩子执行指标、历史记录和状态的查询接口
|
|
5
|
+
"""
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from typing import Dict
|
|
8
|
+
|
|
9
|
+
from linglong_web import build_success_response
|
|
10
|
+
from cancan_microstack.public.schemas.common import APIResponse
|
|
11
|
+
from cancan_microstack.public.const.hook_enums import HookType
|
|
12
|
+
from linglong_web.utils import logger
|
|
13
|
+
from cancan_microstack.services.infrasrv.domain.hooks.hook_registry import get_hook_manager
|
|
14
|
+
from cancan_microstack.services.infrasrv.domain.hooks.metrics import get_metrics
|
|
15
|
+
from cancan_microstack.public.schemas.hook_metrics import (
|
|
16
|
+
MetricData,
|
|
17
|
+
MetricValue,
|
|
18
|
+
HookExecutionHistoryItem,
|
|
19
|
+
HookTypeStatus,
|
|
20
|
+
HooksByPriority,
|
|
21
|
+
HookInfo,
|
|
22
|
+
MetricSummary,
|
|
23
|
+
HookPerformance,
|
|
24
|
+
OverallPerformanceStats,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def get_hook_metrics_handler() -> APIResponse[Dict[str, dict]]:
|
|
29
|
+
"""
|
|
30
|
+
获取钩子指标 / Get hook metrics
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
钩子执行指标 / Hook execution metrics
|
|
34
|
+
"""
|
|
35
|
+
metrics = get_metrics()
|
|
36
|
+
all_metrics = metrics.get_all_metrics()
|
|
37
|
+
|
|
38
|
+
# 转换为 Pydantic 模型 / Convert to Pydantic models
|
|
39
|
+
metrics_data: Dict[str, MetricData] = {}
|
|
40
|
+
for metric in all_metrics:
|
|
41
|
+
if metric.name not in metrics_data:
|
|
42
|
+
metrics_data[metric.name] = MetricData(
|
|
43
|
+
name=metric.name,
|
|
44
|
+
type=metric.metric_type,
|
|
45
|
+
description=metric.description,
|
|
46
|
+
values=[]
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
metrics_data[metric.name].values.append(
|
|
50
|
+
MetricValue(
|
|
51
|
+
value=metric.value,
|
|
52
|
+
labels=metric.labels,
|
|
53
|
+
timestamp=metric.timestamp
|
|
54
|
+
)
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# 转换为字典用于响应 / Convert to dict for response
|
|
58
|
+
result = {name: data.model_dump() for name, data in metrics_data.items()}
|
|
59
|
+
|
|
60
|
+
return build_success_response(data=result)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def get_hook_history_handler(request) -> APIResponse[dict]:
|
|
64
|
+
"""
|
|
65
|
+
获取钩子执行历史 / Get hook execution history
|
|
66
|
+
|
|
67
|
+
Query Parameters:
|
|
68
|
+
hook_name: 钩子名称过滤(可选)/ Hook name filter (optional)
|
|
69
|
+
limit: 返回记录数限制(默认100)/ Limit of records to return (default 100)
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
钩子执行历史记录 / Hook execution history records
|
|
73
|
+
"""
|
|
74
|
+
query_params = request.query_params
|
|
75
|
+
hook_name = query_params.get("hook_name")
|
|
76
|
+
limit = int(query_params.get("limit", 100))
|
|
77
|
+
|
|
78
|
+
hook_manager = get_hook_manager()
|
|
79
|
+
history = hook_manager.get_execution_history(
|
|
80
|
+
service_name=None,
|
|
81
|
+
hook_name=hook_name,
|
|
82
|
+
limit=limit
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# 转换为 Pydantic 模型 / Convert to Pydantic models
|
|
86
|
+
history_items = [
|
|
87
|
+
HookExecutionHistoryItem(
|
|
88
|
+
hook_name=result.hook_name,
|
|
89
|
+
result=result.result,
|
|
90
|
+
message=result.message,
|
|
91
|
+
execution_time=result.execution_time,
|
|
92
|
+
has_modified_service_info=False # 这个字段需要从 result 中获取,如果有的话
|
|
93
|
+
)
|
|
94
|
+
for result in history
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
return build_success_response(
|
|
98
|
+
data={
|
|
99
|
+
"total": len(history_items),
|
|
100
|
+
"history": [item.model_dump() for item in history_items],
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
async def get_hook_status_handler() -> APIResponse[dict]:
|
|
106
|
+
"""
|
|
107
|
+
获取钩子状态 / Get hook status
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
钩子状态信息 / Hook status information
|
|
111
|
+
"""
|
|
112
|
+
hook_manager = get_hook_manager()
|
|
113
|
+
|
|
114
|
+
# 获取所有钩子类型 / Get all hook types
|
|
115
|
+
hook_types = [HookType.PRE_REGISTER, HookType.POST_REGISTER, HookType.PRE_DEREGISTER, HookType.POST_DEREGISTER]
|
|
116
|
+
|
|
117
|
+
status_data: Dict[str, HookTypeStatus] = {}
|
|
118
|
+
total_hooks = 0
|
|
119
|
+
|
|
120
|
+
for hook_type in hook_types:
|
|
121
|
+
hooks = hook_manager.get_hooks(hook_type)
|
|
122
|
+
total_hooks += len(hooks)
|
|
123
|
+
|
|
124
|
+
# 按优先级分组 / Group by priority
|
|
125
|
+
hooks_by_priority = HooksByPriority()
|
|
126
|
+
|
|
127
|
+
for hook in hooks:
|
|
128
|
+
hook_info = HookInfo(
|
|
129
|
+
name=hook.name,
|
|
130
|
+
priority=hook.priority.name,
|
|
131
|
+
type=hook.__class__.__name__
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# 根据优先级添加到对应列表 / Add to corresponding list by priority
|
|
135
|
+
priority_name = hook.priority.name
|
|
136
|
+
if priority_name == "HIGHEST":
|
|
137
|
+
hooks_by_priority.CRITICAL.append(hook_info)
|
|
138
|
+
elif priority_name == "HIGH":
|
|
139
|
+
hooks_by_priority.HIGH.append(hook_info)
|
|
140
|
+
elif priority_name in ("MEDIUM", "NORMAL"):
|
|
141
|
+
hooks_by_priority.MEDIUM.append(hook_info)
|
|
142
|
+
else: # LOW, LOWEST
|
|
143
|
+
hooks_by_priority.LOW.append(hook_info)
|
|
144
|
+
|
|
145
|
+
status_data[hook_type] = HookTypeStatus(
|
|
146
|
+
count=len(hooks),
|
|
147
|
+
hooks_by_priority=hooks_by_priority
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# 获取指标摘要 / Get metrics summary
|
|
151
|
+
metrics = get_metrics()
|
|
152
|
+
all_metrics = metrics.get_all_metrics()
|
|
153
|
+
|
|
154
|
+
metrics_summary: Dict[str, MetricSummary] = {}
|
|
155
|
+
for metric in all_metrics:
|
|
156
|
+
if metric.name not in metrics_summary:
|
|
157
|
+
metrics_summary[metric.name] = MetricSummary(
|
|
158
|
+
type=metric.metric_type,
|
|
159
|
+
description=metric.description,
|
|
160
|
+
latest_value=metric.value,
|
|
161
|
+
latest_timestamp=metric.timestamp
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
return build_success_response(
|
|
165
|
+
data={
|
|
166
|
+
"total_hooks": total_hooks,
|
|
167
|
+
"hook_types": {k: v.model_dump() for k, v in status_data.items()},
|
|
168
|
+
"metrics_summary": {k: v.model_dump() for k, v in metrics_summary.items()},
|
|
169
|
+
"timestamp": datetime.now().isoformat(),
|
|
170
|
+
}
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
async def reset_hook_metrics_handler() -> APIResponse[dict]:
|
|
175
|
+
"""
|
|
176
|
+
重置钩子指标 / Reset hook metrics
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
操作结果 / Operation result
|
|
180
|
+
"""
|
|
181
|
+
metrics = get_metrics()
|
|
182
|
+
all_metrics = metrics.get_all_metrics()
|
|
183
|
+
|
|
184
|
+
# 重置所有计数器指标 / Reset all counter metrics
|
|
185
|
+
reset_count = 0
|
|
186
|
+
for metric in all_metrics:
|
|
187
|
+
if metric.metric_type.value == "counter":
|
|
188
|
+
metrics.reset_metric(metric.name)
|
|
189
|
+
reset_count += 1
|
|
190
|
+
|
|
191
|
+
# 清空钩子执行历史 / Clear hook execution history
|
|
192
|
+
hook_manager = get_hook_manager()
|
|
193
|
+
hook_manager.clear_history()
|
|
194
|
+
|
|
195
|
+
logger.info(f"Reset {reset_count} metrics and cleared hook history")
|
|
196
|
+
|
|
197
|
+
return build_success_response(
|
|
198
|
+
data={
|
|
199
|
+
"reset_metrics_count": reset_count,
|
|
200
|
+
"history_cleared": True,
|
|
201
|
+
}
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
async def get_hook_performance_handler(request) -> APIResponse[dict]:
|
|
206
|
+
"""
|
|
207
|
+
获取钩子性能统计 / Get hook performance statistics
|
|
208
|
+
|
|
209
|
+
Query Parameters:
|
|
210
|
+
hook_name: 钩子名称过滤(可选)/ Hook name filter (optional)
|
|
211
|
+
time_range: 时间范围(小时,默认24)/ Time range (hours, default 24)
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
钩子性能统计 / Hook performance statistics
|
|
215
|
+
"""
|
|
216
|
+
query_params = request.query_params
|
|
217
|
+
hook_name = query_params.get("hook_name")
|
|
218
|
+
time_range = int(query_params.get("time_range", 24))
|
|
219
|
+
|
|
220
|
+
hook_manager = get_hook_manager()
|
|
221
|
+
history = hook_manager.get_execution_history(
|
|
222
|
+
service_name=None,
|
|
223
|
+
hook_name=hook_name,
|
|
224
|
+
limit=1000 # 获取更多历史记录 / Get more history records
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
# 由于 history 中的记录没有时间戳字段,我们直接使用所有记录 / Use all records since history doesn't have timestamp field
|
|
228
|
+
filtered_history = [
|
|
229
|
+
result for result in history
|
|
230
|
+
if result.execution_time > 0
|
|
231
|
+
]
|
|
232
|
+
|
|
233
|
+
if not filtered_history:
|
|
234
|
+
return build_success_response(
|
|
235
|
+
data={
|
|
236
|
+
"message": "No performance data available in the specified time range",
|
|
237
|
+
"time_range_hours": time_range,
|
|
238
|
+
}
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# 按钩子名称分组 / Group by hook name
|
|
242
|
+
performance_by_hook: Dict[str, HookPerformance] = {}
|
|
243
|
+
for result in filtered_history:
|
|
244
|
+
hook_name_key = result.hook_name
|
|
245
|
+
if hook_name_key not in performance_by_hook:
|
|
246
|
+
performance_by_hook[hook_name_key] = HookPerformance()
|
|
247
|
+
|
|
248
|
+
perf = performance_by_hook[hook_name_key]
|
|
249
|
+
perf.total_executions += 1
|
|
250
|
+
perf.total_execution_time += result.execution_time
|
|
251
|
+
|
|
252
|
+
if result.result.value == "success":
|
|
253
|
+
perf.successful_executions += 1
|
|
254
|
+
else:
|
|
255
|
+
perf.failed_executions += 1
|
|
256
|
+
|
|
257
|
+
if result.execution_time < perf.min_execution_time:
|
|
258
|
+
perf.min_execution_time = result.execution_time
|
|
259
|
+
|
|
260
|
+
if result.execution_time > perf.max_execution_time:
|
|
261
|
+
perf.max_execution_time = result.execution_time
|
|
262
|
+
|
|
263
|
+
# 计算平均执行时间 / Calculate average execution time
|
|
264
|
+
perf.avg_execution_time = perf.total_execution_time / perf.total_executions
|
|
265
|
+
|
|
266
|
+
# 计算总体统计 / Calculate overall statistics
|
|
267
|
+
total_executions = sum(perf.total_executions for perf in performance_by_hook.values())
|
|
268
|
+
total_successful = sum(perf.successful_executions for perf in performance_by_hook.values())
|
|
269
|
+
total_failed = sum(perf.failed_executions for perf in performance_by_hook.values())
|
|
270
|
+
|
|
271
|
+
overall_stats = OverallPerformanceStats(
|
|
272
|
+
total_executions=total_executions,
|
|
273
|
+
successful_executions=total_successful,
|
|
274
|
+
failed_executions=total_failed,
|
|
275
|
+
success_rate=(total_successful / total_executions * 100) if total_executions > 0 else 0
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
return build_success_response(
|
|
279
|
+
data={
|
|
280
|
+
"time_range_hours": time_range,
|
|
281
|
+
"overall_stats": overall_stats.model_dump(),
|
|
282
|
+
"performance_by_hook": {k: v.model_dump() for k, v in performance_by_hook.items()},
|
|
283
|
+
}
|
|
284
|
+
)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Internal API for infrasrv
|
|
3
|
+
These endpoints are called by other internal services (like opsbffsrv)
|
|
4
|
+
Not exposed to frontend
|
|
5
|
+
"""
|
|
6
|
+
import http
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from linglong_web import build_success_response
|
|
10
|
+
|
|
11
|
+
from cancan_microstack.public.const.error import ErrorCode
|
|
12
|
+
from cancan_microstack.public.error import HTTPException
|
|
13
|
+
from cancan_microstack.public.schemas.common import APIResponse
|
|
14
|
+
from cancan_microstack.services.infrasrv.application.service_registry import ServiceRegistryApp
|
|
15
|
+
|
|
16
|
+
_service_registry_app = ServiceRegistryApp()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _resolve_service_name(service_name: str | None, payload: dict[str, Any] | None) -> str:
|
|
20
|
+
"""
|
|
21
|
+
解析 service_name 参数,兼容 query 和 JSON body
|
|
22
|
+
Resolve service_name from either query param or JSON payload
|
|
23
|
+
"""
|
|
24
|
+
if service_name:
|
|
25
|
+
return service_name
|
|
26
|
+
|
|
27
|
+
if payload and isinstance(payload.get("service_name"), str):
|
|
28
|
+
service_name_from_payload = payload.get("service_name", "").strip()
|
|
29
|
+
if service_name_from_payload:
|
|
30
|
+
return service_name_from_payload
|
|
31
|
+
|
|
32
|
+
raise HTTPException(
|
|
33
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
34
|
+
error_code=ErrorCode.MISSING_REQUIRED_PARAM,
|
|
35
|
+
msg="service_name is required",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
async def internal_trigger_config_push_handler(
|
|
40
|
+
service_name: str | None = None,
|
|
41
|
+
payload: dict[str, Any] | None = None,
|
|
42
|
+
) -> APIResponse[dict | None]:
|
|
43
|
+
"""
|
|
44
|
+
内部接口:触发配置推送
|
|
45
|
+
由 opsbffsrv 调用,在配置更新后触发 infrasrv 向服务实例推送新配置
|
|
46
|
+
"""
|
|
47
|
+
resolved_service_name = _resolve_service_name(service_name=service_name, payload=payload)
|
|
48
|
+
result = await _service_registry_app.push_config_to_service(resolved_service_name)
|
|
49
|
+
return build_success_response(data=result)
|