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,146 @@
|
|
|
1
|
+
"""
|
|
2
|
+
服务配置管理 API 接口
|
|
3
|
+
API handlers for service configuration management within opsbffsrv
|
|
4
|
+
"""
|
|
5
|
+
import json
|
|
6
|
+
from typing import (
|
|
7
|
+
Any,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
from cancan_microstack.public.schemas.common import (
|
|
11
|
+
APIResponse,
|
|
12
|
+
)
|
|
13
|
+
from linglong_web import (
|
|
14
|
+
build_success_response,
|
|
15
|
+
)
|
|
16
|
+
from cancan_microstack.public.const.opsbffsrv_error import OpsbffsrvServiceConfigErrorCode
|
|
17
|
+
from cancan_microstack.public.schemas.opsbffsrv.service_config import (
|
|
18
|
+
ServiceConfigDetail,
|
|
19
|
+
ServiceConfigOperationSummary,
|
|
20
|
+
ServiceConfigOverview,
|
|
21
|
+
)
|
|
22
|
+
from cancan_microstack.public.error import HTTPException
|
|
23
|
+
import http
|
|
24
|
+
from cancan_microstack.services.opsbffsrv.application.service_config import ServiceConfigApp
|
|
25
|
+
|
|
26
|
+
_service_config_app = ServiceConfigApp()
|
|
27
|
+
_INVALID_INPUT_MESSAGE = "Invalid input"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _normalize_conf_dict(payload: dict[str, Any]) -> dict[str, str]:
|
|
31
|
+
"""标准化配置请求体(单一规范)。
|
|
32
|
+
Normalize config payload (single canonical shape).
|
|
33
|
+
|
|
34
|
+
规范请求体 / Canonical payload:
|
|
35
|
+
- {"conf_dict": {"KEY": "VALUE"}}
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
if "conf_dict" not in payload:
|
|
39
|
+
raise HTTPException(
|
|
40
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
41
|
+
error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
|
|
42
|
+
msg=_INVALID_INPUT_MESSAGE,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
raw_conf = payload.get("conf_dict")
|
|
46
|
+
|
|
47
|
+
if not isinstance(raw_conf, dict) or not raw_conf:
|
|
48
|
+
raise HTTPException(
|
|
49
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
50
|
+
error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
|
|
51
|
+
msg=_INVALID_INPUT_MESSAGE,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
normalized_conf: dict[str, str] = {}
|
|
55
|
+
for key, value in raw_conf.items():
|
|
56
|
+
if not isinstance(key, str) or not key:
|
|
57
|
+
raise HTTPException(
|
|
58
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
59
|
+
error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
|
|
60
|
+
msg=_INVALID_INPUT_MESSAGE,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
if isinstance(value, str):
|
|
64
|
+
normalized_conf[key] = value
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
normalized_conf[key] = json.dumps(value, ensure_ascii=False)
|
|
69
|
+
except TypeError:
|
|
70
|
+
normalized_conf[key] = str(value)
|
|
71
|
+
|
|
72
|
+
if not normalized_conf:
|
|
73
|
+
raise HTTPException(
|
|
74
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
75
|
+
error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
|
|
76
|
+
msg=_INVALID_INPUT_MESSAGE,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return normalized_conf
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
async def get_service_config_handler(service_name: str) -> APIResponse[ServiceConfigDetail]:
|
|
83
|
+
"""获取指定服务的配置 / Fetch configuration entries for a service"""
|
|
84
|
+
result = await _service_config_app.get_service_config(service_name)
|
|
85
|
+
return build_success_response(data=result)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
async def insert_service_config_handler(
|
|
89
|
+
service_name: str,
|
|
90
|
+
payload: dict[str, Any],
|
|
91
|
+
) -> APIResponse[ServiceConfigOperationSummary]:
|
|
92
|
+
"""插入服务配置 / Insert new configuration entries"""
|
|
93
|
+
|
|
94
|
+
if not service_name:
|
|
95
|
+
raise HTTPException(
|
|
96
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
97
|
+
error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
|
|
98
|
+
msg=_INVALID_INPUT_MESSAGE,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
conf_dict = _normalize_conf_dict(payload)
|
|
102
|
+
|
|
103
|
+
result = await _service_config_app.insert_service_config(service_name, conf_dict)
|
|
104
|
+
return build_success_response(data=result)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
async def update_service_config_handler(
|
|
108
|
+
service_name: str,
|
|
109
|
+
payload: dict[str, Any],
|
|
110
|
+
) -> APIResponse[ServiceConfigOperationSummary]:
|
|
111
|
+
"""更新服务配置 / Update configuration entries"""
|
|
112
|
+
|
|
113
|
+
if not service_name:
|
|
114
|
+
raise HTTPException(
|
|
115
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
116
|
+
error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
|
|
117
|
+
msg=_INVALID_INPUT_MESSAGE,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
conf_dict = _normalize_conf_dict(payload)
|
|
121
|
+
|
|
122
|
+
result = await _service_config_app.update_service_config(service_name, conf_dict)
|
|
123
|
+
return build_success_response(data=result)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
async def get_all_service_configs_handler() -> APIResponse[ServiceConfigOverview]:
|
|
127
|
+
"""获取所有服务的配置 / Fetch configuration overview for all services"""
|
|
128
|
+
result = await _service_config_app.get_all_service_configs()
|
|
129
|
+
return build_success_response(data=result)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
async def delete_service_config_handler(
|
|
133
|
+
service_name: str,
|
|
134
|
+
conf_key: str,
|
|
135
|
+
) -> APIResponse[ServiceConfigOperationSummary]:
|
|
136
|
+
"""删除服务配置项 / Delete configuration entry"""
|
|
137
|
+
|
|
138
|
+
if not service_name or not conf_key:
|
|
139
|
+
raise HTTPException(
|
|
140
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
141
|
+
error_code=OpsbffsrvServiceConfigErrorCode.INVALID_INPUT,
|
|
142
|
+
msg=_INVALID_INPUT_MESSAGE,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
result = await _service_config_app.delete_service_config(service_name, conf_key)
|
|
146
|
+
return build_success_response(data=result)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""服务行为日志查询 API / Service log query API for ops frontend."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
import http
|
|
5
|
+
|
|
6
|
+
from linglong_web.utils import logger
|
|
7
|
+
from cancan_microstack.public.schemas.common import APIResponse
|
|
8
|
+
from linglong_web import build_success_response
|
|
9
|
+
from cancan_microstack.public.const.opsbffsrv_error import OpsbffsrvServiceLogsErrorCode
|
|
10
|
+
from cancan_microstack.public.schemas.opsbffsrv.service_logs import ServiceLogsPayload
|
|
11
|
+
from cancan_microstack.public.error import HTTPException
|
|
12
|
+
from cancan_microstack.services.opsbffsrv.application.service_logs_app import (
|
|
13
|
+
ServiceLogsApp,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
_service_logs_app = ServiceLogsApp()
|
|
17
|
+
_INVALID_LIMIT_MESSAGE = "Invalid input: limit must be between 1 and 1000"
|
|
18
|
+
_MISSING_SERVICE_NAME_MESSAGE = "Invalid input: service_name is required"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async def get_service_logs_handler(
|
|
22
|
+
service_name: Optional[str] = None,
|
|
23
|
+
action_type: Optional[str] = None,
|
|
24
|
+
action_status: Optional[str] = None,
|
|
25
|
+
limit: int = 100,
|
|
26
|
+
) -> APIResponse[ServiceLogsPayload]:
|
|
27
|
+
"""查询服务行为日志 / Query service action logs."""
|
|
28
|
+
|
|
29
|
+
logger.info(
|
|
30
|
+
"Get service logs: service_name=%s, action_type=%s, action_status=%s, limit=%s",
|
|
31
|
+
service_name,
|
|
32
|
+
action_type,
|
|
33
|
+
action_status,
|
|
34
|
+
limit,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
if limit < 1 or limit > 1000:
|
|
38
|
+
raise HTTPException(
|
|
39
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
40
|
+
error_code=OpsbffsrvServiceLogsErrorCode.INVALID_INPUT,
|
|
41
|
+
msg=_INVALID_LIMIT_MESSAGE,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
payload = await _service_logs_app.get_service_logs(
|
|
45
|
+
service_name=service_name,
|
|
46
|
+
action_type=action_type,
|
|
47
|
+
action_status=action_status,
|
|
48
|
+
limit=limit,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
return build_success_response(data=payload)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
async def get_service_logs_by_service_handler(
|
|
55
|
+
service_name: str,
|
|
56
|
+
limit: int = 50,
|
|
57
|
+
) -> APIResponse[ServiceLogsPayload]:
|
|
58
|
+
"""查询指定服务的行为日志 / Query logs for a single service."""
|
|
59
|
+
|
|
60
|
+
logger.info("Get logs for service: %s, limit=%s", service_name, limit)
|
|
61
|
+
|
|
62
|
+
if not service_name:
|
|
63
|
+
raise HTTPException(
|
|
64
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
65
|
+
error_code=OpsbffsrvServiceLogsErrorCode.INVALID_INPUT,
|
|
66
|
+
msg=_MISSING_SERVICE_NAME_MESSAGE,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if limit < 1 or limit > 1000:
|
|
70
|
+
raise HTTPException(
|
|
71
|
+
status_code=http.HTTPStatus.BAD_REQUEST.value,
|
|
72
|
+
error_code=OpsbffsrvServiceLogsErrorCode.INVALID_INPUT,
|
|
73
|
+
msg=_INVALID_LIMIT_MESSAGE,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
payload = await _service_logs_app.get_service_logs(
|
|
77
|
+
service_name=service_name,
|
|
78
|
+
limit=limit,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
return build_success_response(data=payload)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""
|
|
2
|
+
服务注册查询API接口
|
|
3
|
+
为ops前端提供服务实例查询功能(只读)
|
|
4
|
+
"""
|
|
5
|
+
from typing import List
|
|
6
|
+
import http
|
|
7
|
+
|
|
8
|
+
from cancan_microstack.public.schemas.common import (
|
|
9
|
+
APIResponse,
|
|
10
|
+
)
|
|
11
|
+
from cancan_microstack.public.schemas.infra.service_registry import (
|
|
12
|
+
ServiceInstance,
|
|
13
|
+
ServiceInstanceList,
|
|
14
|
+
)
|
|
15
|
+
from linglong_web import build_success_response
|
|
16
|
+
from cancan_microstack.public.const.error import ErrorCode
|
|
17
|
+
from cancan_microstack.public.error import HTTPException
|
|
18
|
+
from cancan_microstack.services.opsbffsrv.application.service_registry import ServiceRegistryApp
|
|
19
|
+
|
|
20
|
+
_service_registry_app = ServiceRegistryApp()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
async def get_service_instances_handler(
|
|
24
|
+
service_name: str | None = None,
|
|
25
|
+
only_healthy: bool = True,
|
|
26
|
+
) -> APIResponse[ServiceInstanceList]:
|
|
27
|
+
"""获取服务实例列表"""
|
|
28
|
+
instances: List[ServiceInstance] = await _service_registry_app.get_service_instances(service_name, only_healthy)
|
|
29
|
+
return build_success_response(data=ServiceInstanceList(instances=instances))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
async def get_all_instances_handler() -> APIResponse[ServiceInstanceList]:
|
|
33
|
+
"""获取所有服务实例"""
|
|
34
|
+
instances: List[ServiceInstance] = await _service_registry_app.get_all_instances()
|
|
35
|
+
return build_success_response(data=ServiceInstanceList(instances=instances))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
async def get_instance_handler(
|
|
39
|
+
service_name: str,
|
|
40
|
+
instance_id: str,
|
|
41
|
+
) -> APIResponse[ServiceInstance]:
|
|
42
|
+
"""获取指定服务实例"""
|
|
43
|
+
instance = await _service_registry_app.get_instance(service_name, instance_id)
|
|
44
|
+
if instance:
|
|
45
|
+
return build_success_response(data=instance)
|
|
46
|
+
|
|
47
|
+
raise HTTPException(
|
|
48
|
+
status_code=http.HTTPStatus.NOT_FOUND.value,
|
|
49
|
+
error_code=ErrorCode.HANDLER_NOT_FOUND,
|
|
50
|
+
msg="Instance not found"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
async def get_all_service_names_handler() -> APIResponse[List[str]]:
|
|
55
|
+
"""获取所有服务名称"""
|
|
56
|
+
service_names = await _service_registry_app.get_all_service_names()
|
|
57
|
+
return build_success_response(data=service_names)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
async def get_services_overview_handler() -> APIResponse[List[dict]]:
|
|
61
|
+
"""
|
|
62
|
+
获取所有服务的概览信息(包含服务名和状态统计)
|
|
63
|
+
供前端展示服务列表使用
|
|
64
|
+
"""
|
|
65
|
+
overview = await _service_registry_app.get_services_overview()
|
|
66
|
+
return build_success_response(data=[o.model_dump() for o in overview])
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
"""
|
|
2
|
+
工作流运维 API 路由处理器(opsbffsrv 层)
|
|
3
|
+
Workflow Operations API Handlers (opsbffsrv layer)
|
|
4
|
+
|
|
5
|
+
职责 / Responsibilities:
|
|
6
|
+
1. 参数校验和格式化 / Parameter validation and formatting
|
|
7
|
+
2. 转发请求到 infrasrv / Forward requests to infrasrv
|
|
8
|
+
3. 统一响应包装 / Unified response wrapping
|
|
9
|
+
4. 不包含业务逻辑 / No business logic here
|
|
10
|
+
"""
|
|
11
|
+
from typing import Optional
|
|
12
|
+
from uuid import UUID
|
|
13
|
+
|
|
14
|
+
from fastapi import Depends, Query
|
|
15
|
+
|
|
16
|
+
from linglong_web import build_success_response
|
|
17
|
+
from cancan_microstack.public.schemas.infra import workflow as wt
|
|
18
|
+
from cancan_microstack.services.opsbffsrv.application.workflow_ops_app import WorkflowOpsApp
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# 本模块:Workflow 运维相关的 API 路由处理器(Handler)
|
|
22
|
+
# Module: API handlers for workflow operations in opsbffsrv
|
|
23
|
+
#
|
|
24
|
+
# 说明 / Description:
|
|
25
|
+
# 该文件定义了对外暴露的 workflow 运维相关的 HTTP handler(均为 async)。
|
|
26
|
+
# 1) 使用 FastAPI 的 Depends 注入 WorkflowOpsApp 的实例(get_workflow_app)。
|
|
27
|
+
# 2) 每个 handler 仅负责参数接收、调用应用层方法并通过统一响应构建器返回结果。
|
|
28
|
+
# 3) 不包含复杂业务逻辑,业务逻辑集中在 application 层(WorkflowOpsApp)。
|
|
29
|
+
# This module defines async HTTP handlers for workflow operations.
|
|
30
|
+
# 1) Handlers depend on WorkflowOpsApp via FastAPI Depends (get_workflow_app).
|
|
31
|
+
# 2) Each handler validates/receives params, calls application layer, and returns
|
|
32
|
+
# a unified response via build_success_response.
|
|
33
|
+
# 3) No business logic here — business is implemented in WorkflowOpsApp.
|
|
34
|
+
|
|
35
|
+
def get_workflow_app() -> WorkflowOpsApp:
|
|
36
|
+
"""工厂函数,提供 WorkflowOpsApp 实例 / Factory to provide WorkflowOpsApp instance"""
|
|
37
|
+
return WorkflowOpsApp()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ==================== 工作流定义管理 / Workflow Definition Management ====================
|
|
41
|
+
|
|
42
|
+
async def list_workflows_handler(
|
|
43
|
+
keyword: Optional[str] = Query(None, description="搜索关键词"),
|
|
44
|
+
status: Optional[str] = Query(None, description="状态过滤: ACTIVE, INACTIVE"),
|
|
45
|
+
page: int = Query(1, ge=1, description="页码"),
|
|
46
|
+
page_size: int = Query(20, ge=1, le=100, description="每页大小"),
|
|
47
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
48
|
+
):
|
|
49
|
+
"""
|
|
50
|
+
列出所有工作流定义(支持分页和过滤)
|
|
51
|
+
List all workflow definitions (with pagination and filtering)
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
keyword: 搜索关键词(匹配名称/标签)/ Search keyword (match name/tags)
|
|
55
|
+
status: 状态过滤 / Status filter
|
|
56
|
+
page: 页码 / Page number
|
|
57
|
+
page_size: 每页大小 / Page size
|
|
58
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
工作流列表(分页)/ Paginated workflow list
|
|
62
|
+
"""
|
|
63
|
+
query = wt.WorkflowListQuery(
|
|
64
|
+
keyword=keyword,
|
|
65
|
+
status=status,
|
|
66
|
+
page=page,
|
|
67
|
+
page_size=page_size
|
|
68
|
+
)
|
|
69
|
+
data = await app.list_workflows(query)
|
|
70
|
+
return build_success_response(data=data)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
async def get_workflow_handler(
|
|
74
|
+
id: UUID,
|
|
75
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
76
|
+
):
|
|
77
|
+
"""
|
|
78
|
+
获取指定工作流详情
|
|
79
|
+
Get workflow details by ID
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
id: 工作流唯一标识符 / Workflow unique identifier
|
|
83
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
工作流详情 / Workflow details
|
|
87
|
+
"""
|
|
88
|
+
data = await app.get_workflow(str(id))
|
|
89
|
+
return build_success_response(data=data)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
async def create_workflow_handler(
|
|
93
|
+
payload: wt.WorkflowDefinitionCreate,
|
|
94
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
95
|
+
):
|
|
96
|
+
"""
|
|
97
|
+
创建新工作流
|
|
98
|
+
Create a new workflow
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
payload: 工作流定义数据 / Workflow definition data
|
|
102
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
已创建的工作流 / Created workflow
|
|
106
|
+
"""
|
|
107
|
+
data = await app.create_workflow(payload)
|
|
108
|
+
return build_success_response(data=data)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
async def update_workflow_handler(
|
|
112
|
+
id: UUID,
|
|
113
|
+
payload: wt.WorkflowDefinitionUpdate,
|
|
114
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
115
|
+
):
|
|
116
|
+
"""
|
|
117
|
+
更新工作流定义
|
|
118
|
+
Update workflow definition
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
id: 工作流唯一标识符 / Workflow unique identifier
|
|
122
|
+
payload: 更新数据 / Update data
|
|
123
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
更新后的工作流 / Updated workflow
|
|
127
|
+
"""
|
|
128
|
+
data = await app.update_workflow(str(id), payload)
|
|
129
|
+
return build_success_response(data=data)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
async def delete_workflow_handler(
|
|
133
|
+
id: UUID,
|
|
134
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
135
|
+
):
|
|
136
|
+
"""
|
|
137
|
+
删除工作流
|
|
138
|
+
Delete workflow
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
id: 工作流唯一标识符 / Workflow unique identifier
|
|
142
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
删除确认 / Deletion confirmation
|
|
146
|
+
"""
|
|
147
|
+
await app.delete_workflow(str(id))
|
|
148
|
+
return build_success_response(data={"message": "Workflow deleted successfully"})
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
async def toggle_workflow_handler(
|
|
152
|
+
id: UUID,
|
|
153
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
154
|
+
):
|
|
155
|
+
"""
|
|
156
|
+
切换工作流启用状态
|
|
157
|
+
Toggle workflow active status
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
id: 工作流唯一标识符 / Workflow unique identifier
|
|
161
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
更新后的工作流 / Updated workflow
|
|
165
|
+
"""
|
|
166
|
+
data = await app.toggle_workflow(str(id))
|
|
167
|
+
return build_success_response(data=data)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
async def duplicate_workflow_handler(
|
|
171
|
+
id: UUID,
|
|
172
|
+
payload: wt.DuplicateWorkflowPayload,
|
|
173
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
174
|
+
):
|
|
175
|
+
"""
|
|
176
|
+
复制工作流
|
|
177
|
+
Duplicate workflow
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
id: 源工作流唯一标识符 / Source workflow unique identifier
|
|
181
|
+
payload: 复制配置(新名称等)/ Duplication config (new name, etc.)
|
|
182
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
复制后的工作流 / Duplicated workflow
|
|
186
|
+
"""
|
|
187
|
+
data = await app.duplicate_workflow(str(id), payload)
|
|
188
|
+
return build_success_response(data=data)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
async def list_workflow_versions_handler(
|
|
192
|
+
id: UUID,
|
|
193
|
+
limit: int = Query(50, ge=1, le=200, description="返回版本数量限制"),
|
|
194
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
195
|
+
):
|
|
196
|
+
"""列出工作流版本历史
|
|
197
|
+
List workflow definition versions"""
|
|
198
|
+
|
|
199
|
+
data = await app.list_workflow_versions(str(id), limit)
|
|
200
|
+
return build_success_response(data=data)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
async def rollback_workflow_handler(
|
|
204
|
+
id: UUID,
|
|
205
|
+
payload: wt.WorkflowRollbackRequest,
|
|
206
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
207
|
+
):
|
|
208
|
+
"""回滚工作流定义
|
|
209
|
+
Roll back workflow definition"""
|
|
210
|
+
|
|
211
|
+
data = await app.rollback_workflow(str(id), payload)
|
|
212
|
+
return build_success_response(data=data)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
async def publish_workflow_handler(
|
|
216
|
+
id: UUID,
|
|
217
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
218
|
+
):
|
|
219
|
+
"""
|
|
220
|
+
发布工作流(标记为生产就绪)
|
|
221
|
+
Publish workflow (mark as production-ready)
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
id: 工作流唯一标识符 / Workflow unique identifier
|
|
225
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
发布后的工作流 / Published workflow
|
|
229
|
+
"""
|
|
230
|
+
data = await app.publish_workflow(str(id))
|
|
231
|
+
return build_success_response(data=data)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
async def validate_workflow_handler(
|
|
235
|
+
id: UUID,
|
|
236
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
237
|
+
):
|
|
238
|
+
"""
|
|
239
|
+
验证工作流定义
|
|
240
|
+
Validate workflow definition
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
id: 工作流唯一标识符 / Workflow unique identifier
|
|
244
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
245
|
+
|
|
246
|
+
Returns:
|
|
247
|
+
验证结果 / Validation result
|
|
248
|
+
"""
|
|
249
|
+
data = await app.validate_workflow(str(id))
|
|
250
|
+
return build_success_response(data=data)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
# ==================== 工作流统计 / Workflow Statistics ====================
|
|
254
|
+
|
|
255
|
+
async def get_workflow_stats_handler(
|
|
256
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
257
|
+
):
|
|
258
|
+
"""
|
|
259
|
+
获取工作流统计概览
|
|
260
|
+
Get workflow statistics overview
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
统计信息 / Statistics
|
|
267
|
+
"""
|
|
268
|
+
data = await app.get_workflow_stats()
|
|
269
|
+
return build_success_response(data=data)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
# ==================== 工作流运行管理 / Workflow Run Management ====================
|
|
273
|
+
|
|
274
|
+
async def trigger_workflow_handler(
|
|
275
|
+
id: UUID,
|
|
276
|
+
payload: wt.WorkflowTriggerRequest,
|
|
277
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
278
|
+
):
|
|
279
|
+
"""
|
|
280
|
+
手动触发工作流运行
|
|
281
|
+
Manually trigger workflow run
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
id: 工作流唯一标识符 / Workflow unique identifier
|
|
285
|
+
payload: 触发上下文数据 / Trigger context data
|
|
286
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
运行实例信息 / Run instance info
|
|
290
|
+
"""
|
|
291
|
+
data = await app.trigger_workflow(str(id), payload)
|
|
292
|
+
return build_success_response(data=data)
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
async def list_runs_handler(
|
|
296
|
+
workflow_id: Optional[str] = Query(None, description="按工作流ID过滤"),
|
|
297
|
+
reqid: Optional[str] = Query(None, description="按请求追踪 ID 过滤"),
|
|
298
|
+
status: Optional[str] = Query(None, description="运行状态过滤"),
|
|
299
|
+
date_from: Optional[str] = Query(None, description="开始时间"),
|
|
300
|
+
date_to: Optional[str] = Query(None, description="结束时间"),
|
|
301
|
+
page: int = Query(1, ge=1, description="页码"),
|
|
302
|
+
page_size: int = Query(20, ge=1, le=100, description="每页大小"),
|
|
303
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
304
|
+
):
|
|
305
|
+
"""
|
|
306
|
+
列出工作流运行实例(支持过滤和分页)
|
|
307
|
+
List workflow runs (with filtering and pagination)
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
workflow_id: 按工作流ID过滤 / Filter by workflow ID
|
|
311
|
+
page: 页码 / Page number
|
|
312
|
+
page_size: 每页大小 / Page size
|
|
313
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
314
|
+
|
|
315
|
+
Returns:
|
|
316
|
+
运行实例列表 / Run instance list
|
|
317
|
+
"""
|
|
318
|
+
data = await app.list_runs(
|
|
319
|
+
workflow_id=workflow_id,
|
|
320
|
+
reqid=reqid,
|
|
321
|
+
page=page,
|
|
322
|
+
page_size=page_size,
|
|
323
|
+
status=status,
|
|
324
|
+
date_from=date_from,
|
|
325
|
+
date_to=date_to,
|
|
326
|
+
)
|
|
327
|
+
return build_success_response(data=data)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
async def get_run_graph_status_handler(
|
|
331
|
+
run_id: str,
|
|
332
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
333
|
+
):
|
|
334
|
+
"""
|
|
335
|
+
获取运行图状态(用于可视化展示)
|
|
336
|
+
Get run graph status (for visualization)
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
run_id: 运行实例唯一标识符 / Run instance unique identifier
|
|
340
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
341
|
+
|
|
342
|
+
Returns:
|
|
343
|
+
图状态数据(节点+边)/ Graph status data (nodes + edges)
|
|
344
|
+
"""
|
|
345
|
+
data = await app.get_run_graph_status(run_id)
|
|
346
|
+
return build_success_response(data=data)
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
async def get_node_history_handler(
|
|
350
|
+
run_id: str,
|
|
351
|
+
node_id: str,
|
|
352
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
353
|
+
):
|
|
354
|
+
"""
|
|
355
|
+
获取节点执行历史
|
|
356
|
+
Get node execution history
|
|
357
|
+
|
|
358
|
+
Args:
|
|
359
|
+
run_id: 运行实例唯一标识符 / Run instance unique identifier
|
|
360
|
+
node_id: 节点ID / Node ID
|
|
361
|
+
app: WorkflowOpsApp 实例 / WorkflowOpsApp instance
|
|
362
|
+
|
|
363
|
+
Returns:
|
|
364
|
+
节点执行历史(含日志)/ Node execution history (with logs)
|
|
365
|
+
"""
|
|
366
|
+
data = await app.get_node_history(run_id, node_id)
|
|
367
|
+
return build_success_response(data=data)
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
# ==================== Workflow Engine Alerts ====================
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
async def list_workflow_alerts_handler(
|
|
374
|
+
status: Optional[wt.WorkflowEngineAlertStatus] = Query(None, description="状态过滤"),
|
|
375
|
+
severity: Optional[wt.WorkflowEngineAlertSeverity] = Query(None, description="严重程度过滤"),
|
|
376
|
+
run_id: Optional[str] = Query(None, description="运行ID过滤"),
|
|
377
|
+
page: int = Query(1, ge=1, description="页码"),
|
|
378
|
+
page_size: int = Query(20, ge=1, le=200, description="每页大小"),
|
|
379
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
380
|
+
):
|
|
381
|
+
"""列出工作流引擎告警"""
|
|
382
|
+
|
|
383
|
+
query = wt.WorkflowEngineAlertQuery(
|
|
384
|
+
status=status,
|
|
385
|
+
severity=severity,
|
|
386
|
+
run_id=run_id,
|
|
387
|
+
page=page,
|
|
388
|
+
page_size=page_size,
|
|
389
|
+
)
|
|
390
|
+
data = await app.list_engine_alerts(query)
|
|
391
|
+
return build_success_response(data=data)
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
async def acknowledge_workflow_alert_handler(
|
|
395
|
+
alert_id: str,
|
|
396
|
+
payload: wt.WorkflowEngineAlertAckRequest,
|
|
397
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
398
|
+
):
|
|
399
|
+
"""标记告警为已知晓"""
|
|
400
|
+
|
|
401
|
+
data = await app.acknowledge_engine_alert(alert_id, payload)
|
|
402
|
+
return build_success_response(data=data)
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
async def resolve_workflow_alert_handler(
|
|
406
|
+
alert_id: str,
|
|
407
|
+
payload: wt.WorkflowEngineAlertAckRequest,
|
|
408
|
+
app: WorkflowOpsApp = Depends(get_workflow_app)
|
|
409
|
+
):
|
|
410
|
+
"""标记告警为已解决"""
|
|
411
|
+
|
|
412
|
+
data = await app.resolve_engine_alert(alert_id, payload)
|
|
413
|
+
return build_success_response(data=data)
|
|
File without changes
|