Wonder
2ca08f9360
Merge pull request #126 from 2311719626/fix/logs
...
fix(server): 修复 task log 模块多个问题及数据竞争
2026-07-29 14:48:35 +08:00
wonder
0027704169
fix(server): 修复 TestSubscribeTask_ConcurrentSafety 数据竞争问题
...
- 修复多个 goroutine 并发 append 同一 slice 导致的 DATA RACE
- 使用预分配 slice + 索引赋值替代并发 append
- 通过 go test -race 验证
2026-07-29 14:47:31 +08:00
Wonder
179d80604c
Merge pull request #125 from 2311719626/fix/logs
...
fix(server): 修复 task log 模块多个问题并添加单元测试
2026-07-29 14:38:55 +08:00
wonder
11a92c429f
test(server): 添加 task log 模块单元测试
...
- 添加 handler 层 16 个纯函数单元测试(状态映射、ID 解析、排序、格式化等)
- 添加 service 层 11 个 pub/sub 与缓存单元测试(订阅、取消、并发安全、TTL 过期等)
- 共 27 个测试用例,覆盖 task log 核心逻辑
背景:task log 模块经历了大量修改但缺乏测试覆盖,需要确保日志模块可用
关联 commit:61eeb0c, dbb930d
2026-07-29 14:13:53 +08:00
wonder
61eeb0c8ac
fix(server): 修复 task log 接口多个问题
...
- 修复 Wayne 任务状态映射,将数字状态统一为字符串状态
- 添加分页支持,支持 page/page_size 参数
- 添加 AWXJobStdout 内存缓存,减少重复 API 调用
- 修复 SubscribeTask 内存泄漏,自动清理 closed channel
- 统一 Stream 端点,AWX 使用 pub/sub,Wayne 使用轮询
背景:task log 接口存在多个潜在问题,包括状态判断错误导致无限轮询、
缺少分页、重复 API 调用性能问题、内存泄漏风险等
关联 commit:fix/logs 分支
2026-07-29 14:00:40 +08:00
Hungerdream
ecad474785
feat(delivery): enforce instance name uniqueness at task creation
...
Wrap task creation in a transaction that locks the business line row (SELECT ... FOR UPDATE) so concurrent requests cannot both pass the availability check. A name is considered occupied by in-flight or retained tasks (pending through registering, finished, register_failed, canceling, rollback_pending/rolling_back/rollback_failed) and by active deployment results; it becomes reusable only after rollback or explicit cleanup releases it.
2026-07-29 13:50:03 +08:00
ztkkOip
f28bc99401
Merge branch 'main' into feat/base-service-delivery
2026-07-28 18:03:04 +08:00
mac
f7be87c7d9
feat: wire delivery result and infra data backends
2026-07-28 17:56:00 +08:00
Wonder
c0ec5758c6
Merge branch 'main' into feat/task-logs-virtual-scroll
2026-07-28 17:47:26 +08:00
wonder
2fb9c3ccfd
fix(auth): remove access_token query parameter from AuthMiddleware
...
移除认证中间件中 access_token 查询参数的回退逻辑,防止令牌通过 URL 暴露
- 仅支持 Authorization: Bearer 请求头认证
- 防止令牌被反向代理日志、浏览器历史、监控系统等捕获
- 前端已使用安全的头部认证方式
2026-07-28 17:30:46 +08:00
wonder
8904330632
feat(task-logs): 实现任务日志 SSE 实时推送
...
实现任务日志 SSE 实时推送功能,解决前端无法流式输出日志的问题
变更内容:
- 后端:新增 /task-logs/stream SSE 端点,支持实时日志推送
- 后端:实现 2 秒轮询间隔检测新日志,支持心跳机制
- 后端:支持通过 query 参数 access_token 传递 JWT 认证
- 前端:新增 createTaskLogStream 函数封装 EventSource
- 前端:修改 TaskCenter.vue 集成 SSE,支持实时更新和自动滚动
- 前端:添加流式连接状态指示器
关联 commit:
- 实现后端 SSE Stream 方法
- 注册 SSE 路由
- 实现前端 SSE 客户端
- 集成 SSE 到任务中心页面
2026-07-28 17:06:44 +08:00
mac
897670b721
Merge remote-tracking branch 'upstream/main' into feat/base-service-delivery
...
# Conflicts:
# ansible/mysql-deploy.yml
# frontend/src/api/delivery.ts
# frontend/src/views/service/Catalog.vue
# server/.env.example
# server/internal/config/config.go
# server/internal/handler/task_log.go
# server/internal/service/delivery.go
2026-07-28 15:08:37 +08:00
mac
8e09c30d21
feat: wire mysql delivery to awx callbacks
2026-07-28 14:45:17 +08:00
Hungerdream
be39f2a03c
feat(delivery): expose rollback retry, release ack and CloudDM retry APIs
...
- POST /delivery/tasks/:id/rollback/retry (platform admin) re-launches
the rollback job after a previous cleanup failure
- POST /delivery/tasks/:id/rollback/release (platform admin) releases
bookkeeping after the operator verified the target host manually
- POST /delivery/tasks/:id/clouddm/retry retries only the CloudDM
registration step for an already healthy instance
- task logs now include rollback AWX job stdout and localized
text/classes for the new rollback states
2026-07-28 14:29:26 +08:00
Hungerdream
f0c1b38c5b
feat(delivery): add automatic rollback state machine for failed deployments
...
Introduce a compensating workflow that launches the dedicated AWX
rollback template when a deployment cannot be started or fails midway.
- add task states: rollback_pending, rolling_back, rolled_back,
rollback_failed, rollback_acknowledged
- add RollbackJob model to track the compensating AWX run separately
from the deploy run, preserving both job IDs for audit
- hold resource reservations in 'rollback' status until cleanup
succeeds so a failed cleanup cannot be masked by a later delivery
- poll rollback jobs with a 2-minute launch timeout; an unknown launch
result surfaces as a recoverable failure instead of re-launching
- protect finished/register_failed/rolled-back tasks from rollback;
register_failed keeps the healthy instance and its resource usage
- add DELIVERY_ROLLBACK_TEMPLATE_ID config; without it, failures are
marked rollback_failed and require manual cleanup
- use unique pending-<task_id> placeholder for executor job IDs
2026-07-28 14:29:09 +08:00
mac
5a260c443f
feat(delivery): stream task updates with SSE
2026-07-28 09:55:04 +08:00
mac
7b4b9d2ee7
Merge remote-tracking branch 'upstream/main' into feat/base-service-delivery
...
# Conflicts:
# server/.env.example
# server/internal/config/config.go
# server/internal/service/delivery.go
# server/internal/service/delivery_test.go
2026-07-28 09:34:37 +08:00
mac
8378427d3d
fix(delivery): use unique pending AWX job placeholders
2026-07-27 18:33:33 +08:00
Hungerdream
41b2f45420
feat(delivery): support multi-instance scheduling on a single host
...
- Per-host instance limit (DELIVERY_HOST_INSTANCE_LIMIT, default 4)
- Optional target_host to pin a host from the candidate pool
- Regenerate swagger docs
2026-07-27 15:19:44 +08:00
mac
e0ee36cadb
feat(delivery): switch AWX delivery to callbacks
2026-07-27 15:19:18 +08:00
Hungerdream
bfb4f0df4d
feat(delivery): complete MySQL version-to-package mapping
...
- 8.0 from Ubuntu archive, 8.4 from MySQL official APT repo
- 5.6/5.7 not supported for now; enforce one MySQL series per host
- Sync Go version whitelist with the playbook package map
2026-07-27 15:18:54 +08:00
Hungerdream
3c3645f8d5
feat(delivery): extend MySQL delivery parameters and tighten resource bounds
...
- Add topology/port/data_disk, DB options and 8 advanced parameters
with whitelist validation, rendered via extra_vars into the playbook
- Hybrid port allocation over pool 13306-13999
- Tighten bounds: memory 2048-65536 MiB, storage 20-2000 GiB
2026-07-27 15:16:57 +08:00
mac
a934380c9c
feat: switch base delivery to awx task logs
2026-07-23 18:36:24 +08:00
mac
f91df3be3d
fix(delivery): address review feedback on idempotency, crash recovery, and security
...
- Idempotency: verify RequestedBy matches caller to prevent cross-user key reuse
- Crash recovery: persist ExecutionJob (launching) before AWX Launch, update to running after
- Terminal state: finish ExecutionJob on success/cancel/failure; failTask accepts canceling
- Reservation TTL: filter expired reservations in quota aggregation
- Ansible heredoc: use <<'EOF' to prevent shell expansion of secrets; escape single quotes
- Validation: align Go resource ranges with playbook (mem 1024-4096, storage 10-100)
- Version whitelist: only allow 8.0, pass mysql_version to AWX extra_vars; playbook selects package via map
Relates-to: #97
2026-07-23 14:39:09 +08:00
ztkkOip
96aa493034
Merge branch 'main' into feat/mysql-service-delivery
2026-07-23 14:21:06 +08:00
mac
c421be3ae9
docs(delivery): add Swagger annotations and regenerate API docs
...
Add Swagger annotations to all 7 delivery handlers. Fix existing
test.go type references (Response -> response.Response). Add swaggo
dependencies to go.mod. Regenerate swagger.json/yaml/docs.go with
delivery endpoints visible in /swagger/index.html.
Relates-to: #97
2026-07-23 13:50:21 +08:00
mac
699eaa5225
feat(delivery): add HTTP handlers and route registration
...
Add DeliveryHandler (7 endpoints under /auth/api/v1/delivery/*):
CreateMySQL, List, Get, Cancel, Targets, CreateTarget, UpsertQuota.
Add ExecutionHandler for internal service callback. Register routes
with JWT auth middleware and start scheduler goroutine when enabled.
Relates-to: #97
2026-07-23 12:04:51 +08:00
mac
e11bc6f3d6
feat(delivery): implement delivery scheduler and state machine
...
Core delivery service with: task creation (idempotent, validated),
background scheduler (claimAndReserve with SELECT FOR UPDATE SKIP
LOCKED), 4-level concurrency control, resource quota enforcement,
host allocation from candidate pool, AWX job dispatch, polling,
TCP health check, instance registration, CloudDM integration
(optional), and cancel support. 11-state machine with optimistic
locking and full event audit trail.
Relates-to: #97
2026-07-23 12:04:37 +08:00
mac
81a94322f7
feat(delivery): add AWX API client
...
Implement AWXClient with Launch, GetJob, and Cancel methods for
orchestrating Ansible job templates via AWX REST API. Uses Bearer
token auth with 30s timeout. Includes unit tests with mock transport.
Relates-to: #97
2026-07-23 12:04:15 +08:00
mac
76583c6766
feat(delivery): add delivery configuration and environment variables
...
Add 10 config fields: AWX connection (AWX_BASE_URL, AWX_TOKEN),
scheduler controls (DELIVERY_SCHEDULER_ENABLED, DELIVERY_POLL_SECONDS,
DELIVERY_RESERVATION_TTL_MINUTES), concurrency limits (GLOBAL/TARGET/
BUSINESS), service token, and CloudDM registration (CLOUDDM_REGISTER_URL,
CLOUDDM_API_TOKEN). Update .env.example with new variables.
Relates-to: #97
2026-07-23 12:04:02 +08:00
mac
8676963bac
feat(delivery): add delivery data models and auto-migration
...
Add 8 GORM models for MySQL one-click delivery: DeploymentTarget,
ResourceQuota, DeliveryTask, ResourceReservation, ResourceUsage,
MySQLInstance, ExecutionJob, TaskEvent. Register them in AutoMigrate.
Relates-to: #97
2026-07-23 12:03:47 +08:00
mac
64f6bf6cea
fix(container): avoid duplicate Wayne workload rows
2026-07-22 15:20:33 +08:00
mac
d150d0f0dd
feat(business-line): auto bind Wayne namespace on create
2026-07-22 15:05:41 +08:00
mac
7f6f6fa41e
feat(container): show business line workloads from Wayne
2026-07-22 15:05:41 +08:00
mac
2db8264c8e
feat(service): add deployment task integration
2026-07-21 18:26:50 +08:00
mac
c324e2ec59
feat(auth): use Wayne native role APIs
2026-07-21 17:05:48 +08:00
mac
8d49230247
feat(server): add Wayne subsystem authorization APIs
2026-07-17 19:26:40 +08:00
mac
a10d4a5921
fix: require Wayne user ID for role binding
2026-07-17 15:47:32 +08:00
mac
d264924d1e
feat: add business line permissions and Wayne namespace mapping
2026-07-17 15:02:18 +08:00
mac
b151356045
fix(auth): handle saml logout and xml encryption padding
2026-07-17 09:43:42 +08:00
mac
487de70250
fix(auth): populate email for local login users
2026-07-16 17:08:23 +08:00
mac
2835cf2576
fix(auth): keep subsystem oauth working without sso
2026-07-16 16:43:01 +08:00
mac
cafa8bc840
feat(auth): support local username login mode
2026-07-16 16:19:25 +08:00
mac
eb2621d914
feat(auth): complete sso subsystem integration
2026-07-16 15:52:56 +08:00
mac
da38acfcb5
merge: sync origin main into auth-login
2026-07-15 15:12:54 +08:00
mac
6af511ed0b
refactor(server): merge authserver implementation
2026-07-15 14:05:22 +08:00
wonder
509503a9a0
feat(server): 重构路由模块,优化开发体验
...
- 提取路由配置到独立的 router 包
- 优化 Makefile 并行启动前后端开发服务器
- 修复 Swagger 文档生成命令
2026-07-15 13:43:21 +08:00
wonder
8898437e9e
feat(server): 集成 Swagger API 文档
...
- 引入 swaggo/gin-swagger 和 swaggo/files 依赖
- 配置 Swagger UI 路由 /swagger/*
- 为测试 handler 函数添加 Swagger 注解
- 将 main.go 中的内联 handler 重构到 handler/test.go 以支持注解
- 生成 Swagger 文档 (docs.go, swagger.json, swagger.yaml)
- Makefile 新增 make swagger 命令
- .gitignore 添加 server/docs/ 以跟踪生成的文档
- 添加 API 元信息(标题、版本、联系方式、许可证、安全定义)
2026-07-15 11:33:00 +08:00
wonder
3cbb1683a6
feat(server): 添加后端入口和统一响应格式测试路由
...
- 新增 server/cmd/server/main.go 作为服务入口
- 注册 /api/v1/test/* 测试端点,覆盖成功、业务错误、HTTP 错误、超时等场景
- 加载 Logger 和 Recovery 中间件
- 修复 recovery.go 未使用的 net/http 导入
- 更新 go.mod/go.sum 依赖
2026-07-15 11:03:28 +08:00
wonder
4f1df02f53
feat(server): 实现统一响应格式和错误码
...
- 添加 server/go.mod,模块路径为 github.com/1024XEngineer/xinfra/server
- 实现 response.go 统一 JSON 响应结构:
- 响应信封:{ code, message, data, details }
- 业务错误码 (10001-20002) 与 MVP 规范一致
- 便捷函数:Success, Error, BadRequest, Unauthorized 等
- 分页响应支持,包含 total 和 items
- 添加 recovery 中间件捕获 panic 并返回 500 错误
- 添加 logger 中间件记录请求日志
为所有后端处理器建立统一的 API 响应基础,与前端期望的格式保持一致。
2026-07-15 10:44:32 +08:00