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,308 @@
|
|
|
1
|
+
"""
|
|
2
|
+
预注册钩子
|
|
3
|
+
使用预注册钩子机制扩展服务注册功能
|
|
4
|
+
"""
|
|
5
|
+
from typing import (
|
|
6
|
+
Dict,
|
|
7
|
+
Any,
|
|
8
|
+
)
|
|
9
|
+
from datetime import (
|
|
10
|
+
datetime,
|
|
11
|
+
timezone,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from .pre_registration_hooks import (
|
|
15
|
+
BaseHook,
|
|
16
|
+
HookResult,
|
|
17
|
+
HookPriority,
|
|
18
|
+
HookContext,
|
|
19
|
+
HookExecutionResult,
|
|
20
|
+
)
|
|
21
|
+
from .hook_registry import get_hook_manager
|
|
22
|
+
from linglong_web.utils import logger
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ServiceNameValidationHook(BaseHook):
|
|
26
|
+
"""服务名称验证钩子
|
|
27
|
+
|
|
28
|
+
验证服务名称是否符合规范
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self):
|
|
32
|
+
super().__init__("service_name_validation", HookPriority.HIGH)
|
|
33
|
+
|
|
34
|
+
async def execute(self, context: HookContext) -> HookExecutionResult:
|
|
35
|
+
service_name = context.service_name
|
|
36
|
+
|
|
37
|
+
# 验证服务名称不为空
|
|
38
|
+
if not service_name or not service_name.strip():
|
|
39
|
+
return HookExecutionResult(
|
|
40
|
+
hook_name=self.name,
|
|
41
|
+
result=HookResult.FAILURE,
|
|
42
|
+
message="Service name cannot be empty"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# 验证服务名称格式(只允许字母、数字、下划线和连字符)
|
|
46
|
+
import re
|
|
47
|
+
if not re.match(r'^[a-zA-Z0-9_-]+$', service_name):
|
|
48
|
+
return HookExecutionResult(
|
|
49
|
+
hook_name=self.name,
|
|
50
|
+
result=HookResult.FAILURE,
|
|
51
|
+
message="Service name can only contain letters, numbers, underscores and hyphens"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# 验证服务名称长度
|
|
55
|
+
if len(service_name) > 50:
|
|
56
|
+
return HookExecutionResult(
|
|
57
|
+
hook_name=self.name,
|
|
58
|
+
result=HookResult.FAILURE,
|
|
59
|
+
message="Service name too long (max 50 characters)"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
return HookExecutionResult(
|
|
63
|
+
hook_name=self.name,
|
|
64
|
+
result=HookResult.SUCCESS,
|
|
65
|
+
message="Service name validation passed"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class HostValidationHook(BaseHook):
|
|
70
|
+
"""主机地址验证钩子
|
|
71
|
+
|
|
72
|
+
验证主机地址是否有效
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def __init__(self):
|
|
76
|
+
super().__init__("host_validation", HookPriority.HIGH)
|
|
77
|
+
|
|
78
|
+
async def execute(self, context: HookContext) -> HookExecutionResult:
|
|
79
|
+
host = context.host
|
|
80
|
+
|
|
81
|
+
# 验证主机地址不为空
|
|
82
|
+
if not host or not host.strip():
|
|
83
|
+
return HookExecutionResult(
|
|
84
|
+
hook_name=self.name,
|
|
85
|
+
result=HookResult.FAILURE,
|
|
86
|
+
message="Host cannot be empty"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# 拒绝无效的主机地址
|
|
90
|
+
invalid_hosts = ["unknown", "localhost", "127.0.0.1", "0.0.0.0"]
|
|
91
|
+
if host.lower() in invalid_hosts:
|
|
92
|
+
return HookExecutionResult(
|
|
93
|
+
hook_name=self.name,
|
|
94
|
+
result=HookResult.FAILURE,
|
|
95
|
+
message=f"Invalid host '{host}'. Please configure proper hostname in docker-compose.yml"
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return HookExecutionResult(
|
|
99
|
+
hook_name=self.name,
|
|
100
|
+
result=HookResult.SUCCESS,
|
|
101
|
+
message="Host validation passed"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class MetadataEnrichmentHook(BaseHook):
|
|
106
|
+
"""元数据增强钩子
|
|
107
|
+
|
|
108
|
+
为服务实例添加额外的元数据
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
def __init__(self):
|
|
112
|
+
super().__init__("metadata_enrichment", HookPriority.NORMAL)
|
|
113
|
+
|
|
114
|
+
async def execute(self, context: HookContext) -> HookExecutionResult:
|
|
115
|
+
# 获取现有元数据
|
|
116
|
+
metadata = context.metadata
|
|
117
|
+
if not isinstance(metadata, dict):
|
|
118
|
+
metadata = {}
|
|
119
|
+
|
|
120
|
+
# 添加注册时间戳
|
|
121
|
+
metadata["registered_at"] = datetime.now(timezone.utc).isoformat()
|
|
122
|
+
|
|
123
|
+
# 添加注册来源标识
|
|
124
|
+
metadata["registered_by"] = "infrasrv"
|
|
125
|
+
|
|
126
|
+
# 添加服务类型标识(根据服务名称推断)
|
|
127
|
+
service_name = context.service_name
|
|
128
|
+
if "bff" in service_name.lower():
|
|
129
|
+
metadata["service_type"] = "backend-for-frontend"
|
|
130
|
+
elif "srv" in service_name.lower():
|
|
131
|
+
metadata["service_type"] = "microservice"
|
|
132
|
+
else:
|
|
133
|
+
metadata["service_type"] = "unknown"
|
|
134
|
+
|
|
135
|
+
# Pydantic models are mutable by default, modifying directly
|
|
136
|
+
context.metadata = metadata
|
|
137
|
+
|
|
138
|
+
return HookExecutionResult(
|
|
139
|
+
hook_name=self.name,
|
|
140
|
+
result=HookResult.SUCCESS,
|
|
141
|
+
message="Metadata enriched successfully"
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class PortRangeValidationHook(BaseHook):
|
|
146
|
+
"""端口范围验证钩子
|
|
147
|
+
|
|
148
|
+
验证端口号是否在有效范围内
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
def __init__(self):
|
|
152
|
+
super().__init__("port_range_validation", HookPriority.NORMAL)
|
|
153
|
+
|
|
154
|
+
async def execute(self, context: HookContext) -> HookExecutionResult:
|
|
155
|
+
port = context.port
|
|
156
|
+
|
|
157
|
+
# 验证端口号是否为整数
|
|
158
|
+
if not isinstance(port, int):
|
|
159
|
+
try:
|
|
160
|
+
port = int(port)
|
|
161
|
+
except (ValueError, TypeError):
|
|
162
|
+
return HookExecutionResult(
|
|
163
|
+
hook_name=self.name,
|
|
164
|
+
result=HookResult.FAILURE,
|
|
165
|
+
message="Port must be a valid integer"
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# 验证端口范围
|
|
169
|
+
if port < 1024 or port > 65535:
|
|
170
|
+
return HookExecutionResult(
|
|
171
|
+
hook_name=self.name,
|
|
172
|
+
result=HookResult.FAILURE,
|
|
173
|
+
message="Port must be between 1024 and 65535"
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
return HookExecutionResult(
|
|
177
|
+
hook_name=self.name,
|
|
178
|
+
result=HookResult.SUCCESS,
|
|
179
|
+
message="Port validation passed"
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class ServiceQuotaHook(BaseHook):
|
|
184
|
+
"""服务配额检查钩子
|
|
185
|
+
|
|
186
|
+
检查服务实例数量是否超过配额限制
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
def __init__(self):
|
|
190
|
+
super().__init__("service_quota", HookPriority.LOW)
|
|
191
|
+
# 服务配额配置
|
|
192
|
+
self.service_quotas = {
|
|
193
|
+
"default": 10, # 默认每个服务最多 10 个实例
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async def execute(self, context: HookContext) -> HookExecutionResult:
|
|
197
|
+
service_name = context.service_name
|
|
198
|
+
|
|
199
|
+
# 获取服务配额
|
|
200
|
+
quota = self.service_quotas.get(service_name, self.service_quotas["default"])
|
|
201
|
+
|
|
202
|
+
# 查询 service registry 中该服务当前已注册的实例数量(真实计数)
|
|
203
|
+
from cancan_microstack.services.infrasrv.infrastructure.db.operate.service_instance_op import (
|
|
204
|
+
count_instances_by_service,
|
|
205
|
+
)
|
|
206
|
+
current_instances = await count_instances_by_service(service_name)
|
|
207
|
+
|
|
208
|
+
if current_instances >= quota:
|
|
209
|
+
return HookExecutionResult(
|
|
210
|
+
hook_name=self.name,
|
|
211
|
+
result=HookResult.FAILURE,
|
|
212
|
+
message=f"Service '{service_name}' has reached its quota of {quota} instances"
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
return HookExecutionResult(
|
|
216
|
+
hook_name=self.name,
|
|
217
|
+
result=HookResult.SUCCESS,
|
|
218
|
+
message=f"Service quota check passed ({current_instances}/{quota})"
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
# 函数钩子示例
|
|
223
|
+
def function_based_validation_hook(context: HookContext) -> tuple:
|
|
224
|
+
"""基于函数的验证钩子示例
|
|
225
|
+
|
|
226
|
+
验证实例ID格式
|
|
227
|
+
"""
|
|
228
|
+
instance_id = context.instance_id
|
|
229
|
+
|
|
230
|
+
# 验证实例ID格式
|
|
231
|
+
if "-" not in instance_id:
|
|
232
|
+
return HookResult.FAILURE, "Instance ID must contain a hyphen (-)"
|
|
233
|
+
|
|
234
|
+
return HookResult.SUCCESS, "Instance ID validation passed"
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
# 注册所有钩子
|
|
238
|
+
def register_all_hooks():
|
|
239
|
+
"""注册所有预注册钩子"""
|
|
240
|
+
hook_manager = get_hook_manager()
|
|
241
|
+
hook_manager.register_hook(ServiceNameValidationHook())
|
|
242
|
+
hook_manager.register_hook(HostValidationHook())
|
|
243
|
+
hook_manager.register_hook(MetadataEnrichmentHook())
|
|
244
|
+
hook_manager.register_hook(PortRangeValidationHook())
|
|
245
|
+
hook_manager.register_hook(ServiceQuotaHook())
|
|
246
|
+
|
|
247
|
+
logger.info("All pre-registration hooks registered successfully")
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def register_default_hooks(hook_manager):
|
|
251
|
+
"""
|
|
252
|
+
注册默认的预注册钩子
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
hook_manager: 钩子管理器实例
|
|
256
|
+
"""
|
|
257
|
+
# 注册服务名称验证钩子
|
|
258
|
+
hook_manager.register_hook(ServiceNameValidationHook())
|
|
259
|
+
|
|
260
|
+
# 注册主机地址验证钩子
|
|
261
|
+
hook_manager.register_hook(HostValidationHook())
|
|
262
|
+
|
|
263
|
+
# 注册元数据增强钩子
|
|
264
|
+
hook_manager.register_hook(MetadataEnrichmentHook())
|
|
265
|
+
|
|
266
|
+
# 注册端口范围验证钩子
|
|
267
|
+
hook_manager.register_hook(PortRangeValidationHook())
|
|
268
|
+
|
|
269
|
+
# 注册服务配额检查钩子
|
|
270
|
+
hook_manager.register_hook(ServiceQuotaHook())
|
|
271
|
+
|
|
272
|
+
logger.info("All default pre-registration hooks have been registered")
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
# 示例:动态添加钩子
|
|
276
|
+
def add_custom_validation_hook(hook_manager, validation_func):
|
|
277
|
+
"""
|
|
278
|
+
动态添加自定义验证钩子
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
hook_manager: 钩子管理器实例
|
|
282
|
+
validation_func: 验证函数,接收service_info参数,返回(bool, str)元组
|
|
283
|
+
"""
|
|
284
|
+
|
|
285
|
+
def custom_hook(context):
|
|
286
|
+
# 简单示例,实际需要根据validation_func的实现调整
|
|
287
|
+
return HookResult.SUCCESS, "Custom validation passed"
|
|
288
|
+
|
|
289
|
+
hook_manager.register_hook(custom_hook)
|
|
290
|
+
logger.info("Custom validation hook has been registered")
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
# 示例:动态移除钩子
|
|
294
|
+
def remove_hook_by_type(hook_manager, hook_type):
|
|
295
|
+
"""
|
|
296
|
+
根据钩子类型移除钩子
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
hook_manager: 钩子管理器实例
|
|
300
|
+
hook_type: 要移除的钩子类型
|
|
301
|
+
"""
|
|
302
|
+
hooks = hook_manager.get_hooks()
|
|
303
|
+
for hook in hooks:
|
|
304
|
+
if type(hook) == hook_type:
|
|
305
|
+
hook_manager.unregister_hook(hook.name)
|
|
306
|
+
logger.info(f"Removed hook of type {hook_type.__name__}")
|
|
307
|
+
return True
|
|
308
|
+
return False
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""
|
|
2
|
+
钩子注册表 (Hook Registry)
|
|
3
|
+
|
|
4
|
+
提供全局唯一的 HookManager 实例和钩子注册功能。
|
|
5
|
+
这是整个 Hook 机制的入口点和管理中心。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import (
|
|
9
|
+
Optional,
|
|
10
|
+
)
|
|
11
|
+
from .pre_registration_hooks import HookManager
|
|
12
|
+
|
|
13
|
+
# 全局唯一的 HookManager 实例变量。
|
|
14
|
+
# 使用 Optional 类型,并初始化为 None,以支持懒加载(lazy loading)。
|
|
15
|
+
_hook_manager: Optional[HookManager] = None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_hook_manager() -> HookManager:
|
|
19
|
+
"""
|
|
20
|
+
获取全局唯一的 HookManager 实例。
|
|
21
|
+
|
|
22
|
+
采用单例模式(Singleton Pattern),确保在整个应用生命周期中,
|
|
23
|
+
只有一个 HookManager 实例存在。
|
|
24
|
+
如果实例不存在,则会创建一个新的实例。
|
|
25
|
+
|
|
26
|
+
:return: 返回 HookManager 的全局实例。
|
|
27
|
+
"""
|
|
28
|
+
global _hook_manager
|
|
29
|
+
if _hook_manager is None:
|
|
30
|
+
_hook_manager = HookManager()
|
|
31
|
+
return _hook_manager
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def reset_hook_manager():
|
|
35
|
+
"""
|
|
36
|
+
重置全局的 HookManager 实例。
|
|
37
|
+
|
|
38
|
+
这个函数主要用于测试目的。在单元测试或集成测试中,
|
|
39
|
+
可能需要在不同的测试用例之间隔离状态,
|
|
40
|
+
通过重置 HookManager 可以确保每个测试用例都有一个干净的钩子环境。
|
|
41
|
+
"""
|
|
42
|
+
global _hook_manager
|
|
43
|
+
_hook_manager = None
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Hooks 日志工具函数
|
|
3
|
+
|
|
4
|
+
提供与钩子相关的日志格式化功能,用于在 hooks 领域层中处理日志输出。
|
|
5
|
+
"""
|
|
6
|
+
from typing import (
|
|
7
|
+
Optional,
|
|
8
|
+
Dict,
|
|
9
|
+
Any,
|
|
10
|
+
)
|
|
11
|
+
import logging
|
|
12
|
+
from datetime import (
|
|
13
|
+
datetime,
|
|
14
|
+
timezone,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
from cancan_microstack.public.schemas.infra.hook_log import (
|
|
18
|
+
HookLogData,
|
|
19
|
+
HookInfo,
|
|
20
|
+
)
|
|
21
|
+
from cancan_microstack.public.const.hook_enums import HookLogAction, SensitiveFieldKey
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _sanitize_context(context_data: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
|
|
25
|
+
"""
|
|
26
|
+
清洗上下文数据,移除敏感信息和限制字段长度
|
|
27
|
+
Sanitize context data, remove sensitive info and limit field length
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
context_data: 原始上下文数据 / Original context data
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
清洗后的上下文数据 / Sanitized context data
|
|
34
|
+
"""
|
|
35
|
+
if not context_data:
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
sanitized_context = {}
|
|
39
|
+
for key, value in context_data.items():
|
|
40
|
+
# 检查是否为敏感字段 / Check if sensitive field
|
|
41
|
+
if key.lower() in [field.value for field in SensitiveFieldKey]:
|
|
42
|
+
sanitized_context[key] = "***REDACTED***"
|
|
43
|
+
else:
|
|
44
|
+
# 限制值的长度,防止日志过大 / Limit value length to prevent large logs
|
|
45
|
+
if isinstance(value, str) and len(value) > 100:
|
|
46
|
+
sanitized_context[key] = value[:97] + "..."
|
|
47
|
+
else:
|
|
48
|
+
sanitized_context[key] = value
|
|
49
|
+
|
|
50
|
+
return sanitized_context
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def create_hook_log_data(
|
|
54
|
+
hook_name: str,
|
|
55
|
+
hook_type: str,
|
|
56
|
+
message: str,
|
|
57
|
+
priority: Optional[str] = None,
|
|
58
|
+
context_data: Optional[Dict[str, Any]] = None,
|
|
59
|
+
execution_time: Optional[float] = None,
|
|
60
|
+
error: Optional[str] = None,
|
|
61
|
+
rejection_reason: Optional[str] = None,
|
|
62
|
+
modifications: Optional[Dict[str, Any]] = None
|
|
63
|
+
) -> HookLogData:
|
|
64
|
+
"""
|
|
65
|
+
创建钩子日志数据模型
|
|
66
|
+
Create hook log data model
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
hook_name: 钩子名称 / Hook name
|
|
70
|
+
hook_type: 钩子类型 / Hook type
|
|
71
|
+
message: 日志消息 / Log message
|
|
72
|
+
priority: 钩子优先级(可选)/ Hook priority (optional)
|
|
73
|
+
context_data: 上下文数据(可选)/ Context data (optional)
|
|
74
|
+
execution_time: 执行时间(可选)/ Execution time (optional)
|
|
75
|
+
error: 错误信息(可选)/ Error message (optional)
|
|
76
|
+
rejection_reason: 拒绝原因(可选)/ Rejection reason (optional)
|
|
77
|
+
modifications: 修改内容(可选)/ Modifications (optional)
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
HookLogData: 钩子日志数据模型实例 / Hook log data model instance
|
|
81
|
+
"""
|
|
82
|
+
hook_info = HookInfo(name=hook_name, type=hook_type, priority=priority)
|
|
83
|
+
|
|
84
|
+
return HookLogData(
|
|
85
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
86
|
+
hook=hook_info,
|
|
87
|
+
message=message,
|
|
88
|
+
context=_sanitize_context(context_data),
|
|
89
|
+
execution_time=execution_time,
|
|
90
|
+
error=error,
|
|
91
|
+
rejection_reason=rejection_reason,
|
|
92
|
+
modifications=modifications
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def log_hook_registration(
|
|
97
|
+
logger: logging.Logger,
|
|
98
|
+
hook_name: str,
|
|
99
|
+
hook_type: str
|
|
100
|
+
) -> None:
|
|
101
|
+
"""
|
|
102
|
+
记录钩子注册日志 / Log hook registration
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
logger: 日志记录器实例 / Logger instance
|
|
106
|
+
hook_name: 钩子名称 / Hook name
|
|
107
|
+
hook_type: 钩子类型 / Hook type
|
|
108
|
+
"""
|
|
109
|
+
log_data = create_hook_log_data(
|
|
110
|
+
hook_name=hook_name,
|
|
111
|
+
hook_type=hook_type,
|
|
112
|
+
message=HookLogAction.REGISTERED
|
|
113
|
+
)
|
|
114
|
+
logger.info(log_data.model_dump_json(exclude_none=True))
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def log_hook_deregistration(
|
|
118
|
+
logger: logging.Logger,
|
|
119
|
+
hook_name: str,
|
|
120
|
+
hook_type: str
|
|
121
|
+
) -> None:
|
|
122
|
+
"""
|
|
123
|
+
记录钩子注销日志 / Log hook deregistration
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
logger: 日志记录器实例 / Logger instance
|
|
127
|
+
hook_name: 钩子名称 / Hook name
|
|
128
|
+
hook_type: 钩子类型 / Hook type
|
|
129
|
+
"""
|
|
130
|
+
log_data = create_hook_log_data(
|
|
131
|
+
hook_name=hook_name,
|
|
132
|
+
hook_type=hook_type,
|
|
133
|
+
message=HookLogAction.DEREGISTERED
|
|
134
|
+
)
|
|
135
|
+
logger.info(log_data.model_dump_json(exclude_none=True))
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def log_hook_execution_start(
|
|
139
|
+
logger: logging.Logger,
|
|
140
|
+
hook_name: str,
|
|
141
|
+
hook_type: str,
|
|
142
|
+
metadata: Dict[str, Any]
|
|
143
|
+
) -> None:
|
|
144
|
+
"""
|
|
145
|
+
记录钩子执行开始日志 / Log hook execution start
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
logger: 日志记录器实例 / Logger instance
|
|
149
|
+
hook_name: 钩子名称 / Hook name
|
|
150
|
+
hook_type: 钩子类型 / Hook type
|
|
151
|
+
metadata: 元数据 / Metadata
|
|
152
|
+
"""
|
|
153
|
+
log_data = create_hook_log_data(
|
|
154
|
+
hook_name=hook_name,
|
|
155
|
+
hook_type=hook_type,
|
|
156
|
+
message=HookLogAction.EXECUTION_STARTED,
|
|
157
|
+
context_data=metadata
|
|
158
|
+
)
|
|
159
|
+
logger.info(log_data.model_dump_json(exclude_none=True))
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def log_hook_execution_success(
|
|
163
|
+
logger: logging.Logger,
|
|
164
|
+
hook_name: str,
|
|
165
|
+
hook_type: str,
|
|
166
|
+
execution_time: float,
|
|
167
|
+
metadata: Dict[str, Any]
|
|
168
|
+
) -> None:
|
|
169
|
+
"""
|
|
170
|
+
记录钩子执行成功日志 / Log hook execution success
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
logger: 日志记录器实例 / Logger instance
|
|
174
|
+
hook_name: 钩子名称 / Hook name
|
|
175
|
+
hook_type: 钩子类型 / Hook type
|
|
176
|
+
execution_time: 执行时间(秒)/ Execution time (seconds)
|
|
177
|
+
metadata: 元数据 / Metadata
|
|
178
|
+
"""
|
|
179
|
+
log_data = create_hook_log_data(
|
|
180
|
+
hook_name=hook_name,
|
|
181
|
+
hook_type=hook_type,
|
|
182
|
+
message=HookLogAction.EXECUTION_SUCCESS,
|
|
183
|
+
context_data=metadata,
|
|
184
|
+
execution_time=execution_time
|
|
185
|
+
)
|
|
186
|
+
logger.info(log_data.model_dump_json(exclude_none=True))
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def log_hook_execution_failure(
|
|
190
|
+
logger: logging.Logger,
|
|
191
|
+
hook_name: str,
|
|
192
|
+
hook_type: str,
|
|
193
|
+
execution_time: float,
|
|
194
|
+
error_msg: str,
|
|
195
|
+
metadata: Dict[str, Any],
|
|
196
|
+
exception: Optional[Exception] = None
|
|
197
|
+
) -> None:
|
|
198
|
+
"""
|
|
199
|
+
记录钩子执行失败日志 / Log hook execution failure
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
logger: 日志记录器实例 / Logger instance
|
|
203
|
+
hook_name: 钩子名称 / Hook name
|
|
204
|
+
hook_type: 钩子类型 / Hook type
|
|
205
|
+
execution_time: 执行时间(秒)/ Execution time (seconds)
|
|
206
|
+
error_msg: 错误信息 / Error message
|
|
207
|
+
metadata: 元数据 / Metadata
|
|
208
|
+
exception: 异常对象(可选)/ Exception object (optional)
|
|
209
|
+
"""
|
|
210
|
+
log_data = create_hook_log_data(
|
|
211
|
+
hook_name=hook_name,
|
|
212
|
+
hook_type=hook_type,
|
|
213
|
+
message=HookLogAction.EXECUTION_FAILURE,
|
|
214
|
+
context_data=metadata,
|
|
215
|
+
execution_time=execution_time,
|
|
216
|
+
error=error_msg
|
|
217
|
+
)
|
|
218
|
+
if exception:
|
|
219
|
+
logger.error(log_data.model_dump_json(exclude_none=True), exc_info=exception)
|
|
220
|
+
else:
|
|
221
|
+
logger.error(log_data.model_dump_json(exclude_none=True))
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def log_hook_rejection(
|
|
225
|
+
logger: logging.Logger,
|
|
226
|
+
hook_name: str,
|
|
227
|
+
hook_type: str,
|
|
228
|
+
reason: str,
|
|
229
|
+
metadata: Dict[str, Any]
|
|
230
|
+
) -> None:
|
|
231
|
+
"""
|
|
232
|
+
记录钩子拒绝服务注册日志 / Log hook rejection
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
logger: 日志记录器实例 / Logger instance
|
|
236
|
+
hook_name: 钩子名称 / Hook name
|
|
237
|
+
hook_type: 钩子类型 / Hook type
|
|
238
|
+
reason: 拒绝原因 / Rejection reason
|
|
239
|
+
metadata: 元数据 / Metadata
|
|
240
|
+
"""
|
|
241
|
+
log_data = create_hook_log_data(
|
|
242
|
+
hook_name=hook_name,
|
|
243
|
+
hook_type=hook_type,
|
|
244
|
+
message=HookLogAction.REJECTION,
|
|
245
|
+
context_data=metadata,
|
|
246
|
+
rejection_reason=reason
|
|
247
|
+
)
|
|
248
|
+
logger.warning(log_data.model_dump_json(exclude_none=True))
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def log_hook_service_modification(
|
|
252
|
+
logger: logging.Logger,
|
|
253
|
+
hook_name: str,
|
|
254
|
+
hook_type: str,
|
|
255
|
+
modifications: Dict[str, Any],
|
|
256
|
+
metadata: Dict[str, Any]
|
|
257
|
+
) -> None:
|
|
258
|
+
"""
|
|
259
|
+
记录钩子修改服务信息日志 / Log hook service modification
|
|
260
|
+
|
|
261
|
+
Args:
|
|
262
|
+
logger: 日志记录器实例 / Logger instance
|
|
263
|
+
hook_name: 钩子名称 / Hook name
|
|
264
|
+
hook_type: 钩子类型 / Hook type
|
|
265
|
+
modifications: 修改的内容 / Modifications
|
|
266
|
+
metadata: 元数据 / Metadata
|
|
267
|
+
"""
|
|
268
|
+
log_data = create_hook_log_data(
|
|
269
|
+
hook_name=hook_name,
|
|
270
|
+
hook_type=hook_type,
|
|
271
|
+
message=HookLogAction.MODIFICATION,
|
|
272
|
+
context_data=metadata,
|
|
273
|
+
modifications=modifications
|
|
274
|
+
)
|
|
275
|
+
logger.info(log_data.model_dump_json(exclude_none=True))
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""
|
|
2
|
+
钩子初始化模块
|
|
3
|
+
负责在服务启动时注册所有预定义的钩子
|
|
4
|
+
"""
|
|
5
|
+
from .builtin_hooks import register_all_hooks
|
|
6
|
+
|
|
7
|
+
from linglong_web.utils import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def initialize_hooks():
|
|
11
|
+
"""初始化所有钩子"""
|
|
12
|
+
try:
|
|
13
|
+
register_all_hooks()
|
|
14
|
+
logger.info("Hooks initialization completed successfully")
|
|
15
|
+
except Exception as e:
|
|
16
|
+
logger.error(f"Failed to initialize hooks: {e}")
|
|
17
|
+
raise
|