- 后端:强化平台/审批/资源/系统接口权限校验与操作日志,更新权限设计文档与测试用例 - 存储:新增 MinIO 独立部署适配(端口 19000/19001),外部端点与 host-gateway 互通 - 离线:打包 tiktoken cl100k_base 词表进镜像,避免无网环境联网下载 - 其他:算力节点接口微调,前端微调创建页小修,忽略 MinIO 运行时数据 Co-Authored-By: Claude <noreply@anthropic.com>
424 lines
10 KiB
Markdown
424 lines
10 KiB
Markdown
# 权限与日志改造功能测试用例
|
|
|
|
## 1. 测试范围
|
|
|
|
本文档用于验证本次权限和日志相关开发内容:
|
|
|
|
- 训练、评测、推理资源权限校验。
|
|
- 模型合并和训练模型导出权限。
|
|
- 算力节点及 GPU 分配权限。
|
|
- 资源所有者、ACL、租户/项目归属字段。
|
|
- 资源软删除和审计记录。
|
|
- 登录失败限流与 Token 会话有效期。
|
|
- 后端轮询日志降噪。
|
|
- 数据库初始化和运行时字段迁移。
|
|
|
|
## 2. 测试环境
|
|
|
|
| 项目 | 配置 |
|
|
|---|---|
|
|
| 前端地址 | `http://172.25.179.69:16801` |
|
|
| Backend 地址 | `http://172.25.179.69:17861/modelTF` |
|
|
| MinIO 地址 | `http://172.25.179.69:19000` |
|
|
| WSL IP | `172.25.179.69` |
|
|
| 运行方式 | Docker Compose |
|
|
| 数据库 | 远程 PostgreSQL |
|
|
|
|
## 3. 前置数据
|
|
|
|
准备以下账号和资源:
|
|
|
|
| 数据 | 要求 |
|
|
|---|---|
|
|
| 管理员账号 | 具有 `admin` 角色 |
|
|
| 普通操作员 | 具有训练、评测或推理页面权限 |
|
|
| 只读用户 | 具有 `dashboard` 或 `logs` 权限,不具有业务写权限 |
|
|
| 测试模型 | 一个基座模型和一个训练模型 |
|
|
| 测试数据集 | 一个训练数据集和一个评测数据集 |
|
|
| 算力节点 | 至少一个在线节点,最好有 2 张及以上 GPU |
|
|
| ACL 资源 | 将测试数据集授权给普通用户进行验证 |
|
|
|
|
## 4. 鉴权与会话测试
|
|
|
|
### AUTH-001 登录成功生成会话 Token
|
|
|
|
**步骤**
|
|
|
|
1. 使用有效账号调用登录接口或登录页面。
|
|
2. 查看响应中的 `token` 和 `session_id`。
|
|
3. 使用 Token 调用 `/modelTF/me`。
|
|
|
|
**预期**
|
|
|
|
- 登录返回 HTTP 200。
|
|
- Token 格式包含用户 ID 和 session ID。
|
|
- `/me` 能返回当前用户信息。
|
|
- `sessions` 表生成一条未注销记录。
|
|
|
|
### AUTH-002 无 Token 访问受保护接口
|
|
|
|
**步骤**
|
|
|
|
1. 不携带 `Authorization` 调用数据集、模型或训练列表接口。
|
|
|
|
**预期**
|
|
|
|
- 返回 HTTP 401。
|
|
- 不返回资源数据。
|
|
|
|
### AUTH-003 注销后 Token 失效
|
|
|
|
**步骤**
|
|
|
|
1. 登录并记录 Token、`session_id`。
|
|
2. 调用注销接口。
|
|
3. 使用原 Token 调用 `/me` 或资源接口。
|
|
|
|
**预期**
|
|
|
|
- 注销成功。
|
|
- `sessions.logout_at` 已写入。
|
|
- 原 Token 返回 HTTP 401。
|
|
|
|
### AUTH-004 登录失败限流
|
|
|
|
**步骤**
|
|
|
|
1. 同一客户端 IP 连续输入错误密码 5 次。
|
|
2. 第 6 次继续登录。
|
|
|
|
**预期**
|
|
|
|
- 前 5 次返回登录失败。
|
|
- 第 6 次返回 HTTP 429。
|
|
- 使用正确密码也应在冷却窗口内被限制。
|
|
- 登录成功后失败计数清除。
|
|
|
|
## 5. 资源所有权与 ACL
|
|
|
|
### ACL-001 资源所有者访问自己的资源
|
|
|
|
**步骤**
|
|
|
|
1. 普通用户创建数据集或模型。
|
|
2. 使用该用户查看列表和详情。
|
|
3. 修改资源元数据。
|
|
|
|
**预期**
|
|
|
|
- 资源出现在自己的列表中。
|
|
- 详情访问返回 HTTP 200。
|
|
- 资源所有者可以执行允许的写操作。
|
|
|
|
### ACL-002 未授权用户访问资源
|
|
|
|
**步骤**
|
|
|
|
1. 用户 A 创建数据集。
|
|
2. 用户 B 未获得 ACL 授权时查看该数据集详情。
|
|
|
|
**预期**
|
|
|
|
- 用户 B 不应在列表中看到该资源。
|
|
- 直接访问详情返回 HTTP 403。
|
|
|
|
### ACL-003 ACL 授权后访问资源
|
|
|
|
**步骤**
|
|
|
|
1. 用户 A 或管理员给用户 B 授予 `read` 权限。
|
|
2. 用户 B 刷新资源列表并访问详情。
|
|
|
|
**预期**
|
|
|
|
- 用户 B 可以看到并读取资源。
|
|
- 用户 B 不能执行 `write`、`delete` 或 `execute` 操作。
|
|
|
|
### ACL-004 非所有者修改 ACL
|
|
|
|
**步骤**
|
|
|
|
1. 用户 B 仅拥有资源 `read` 权限。
|
|
2. 用户 B 调用 ACL 修改接口。
|
|
|
|
**预期**
|
|
|
|
- 返回 HTTP 403。
|
|
- ACL 内容不发生变化。
|
|
|
|
### ACL-005 ACL 修改审计
|
|
|
|
**步骤**
|
|
|
|
1. 管理员或资源所有者修改 ACL。
|
|
2. 查询审计日志。
|
|
|
|
**预期**
|
|
|
|
- 出现 `resource.acl.set` 操作记录。
|
|
- 记录操作者、资源类型、资源 ID 和变更详情。
|
|
|
|
## 6. 训练权限测试
|
|
|
|
### TRAIN-001 训练创建校验模型和数据集权限
|
|
|
|
**步骤**
|
|
|
|
1. 普通用户选择无权限的基座模型或数据集创建训练任务。
|
|
2. 再使用已授权模型和数据集创建训练任务。
|
|
|
|
**预期**
|
|
|
|
- 无权限资源返回 HTTP 403。
|
|
- 已授权资源允许创建任务。
|
|
- 任务记录包含 `created_by`。
|
|
|
|
### TRAIN-002 GPU 授权校验
|
|
|
|
**步骤**
|
|
|
|
1. 管理员将 GPU 0 分配给用户 A。
|
|
2. 用户 A 选择 GPU 0 创建训练任务。
|
|
3. 用户 A 选择未分配的 GPU 1 创建训练任务。
|
|
|
|
**预期**
|
|
|
|
- GPU 0 可以提交。
|
|
- GPU 1 返回 HTTP 403。
|
|
- 未指定 GPU 时,仅从用户已授权的空闲 GPU 中自动分配。
|
|
|
|
### TRAIN-003 训练任务停止、重试和删除权限
|
|
|
|
**步骤**
|
|
|
|
1. 用户 A 创建训练任务。
|
|
2. 用户 B 尝试停止、重试或删除该任务。
|
|
3. 管理员执行相同操作。
|
|
|
|
**预期**
|
|
|
|
- 用户 B 无资源权限时返回 HTTP 403。
|
|
- 删除和停止等高风险操作按配置进入审批流程。
|
|
- 管理员可以旁路审批执行。
|
|
- GPU 占用在停止、失败和删除后释放。
|
|
|
|
## 7. 评测权限测试
|
|
|
|
### EVAL-001 评测创建联合权限
|
|
|
|
**步骤**
|
|
|
|
1. 普通用户选择无权使用的模型创建评测。
|
|
2. 普通用户选择无权使用的数据集创建评测。
|
|
3. 使用同时拥有权限的模型和数据集创建评测。
|
|
|
|
**预期**
|
|
|
|
- 模型无权限返回 HTTP 403。
|
|
- 数据集无权限返回 HTTP 403。
|
|
- 两个资源均有 `execute` 权限时允许创建。
|
|
- 评测任务包含 `created_by`、模型、数据集和算力节点信息。
|
|
|
|
### EVAL-002 评测详情和删除权限
|
|
|
|
**预期**
|
|
|
|
- 无权限用户不能查看评测详情。
|
|
- 评测删除需要 `delete` 权限。
|
|
- 非管理员删除高风险评测任务时触发审批。
|
|
|
|
## 8. 推理权限测试
|
|
|
|
### INFER-001 推理创建模型权限
|
|
|
|
**步骤**
|
|
|
|
1. 普通用户选择无权模型创建推理任务。
|
|
2. 选择已授权模型创建推理任务。
|
|
|
|
**预期**
|
|
|
|
- 无权模型返回 HTTP 403。
|
|
- 有权模型允许创建。
|
|
- 推理任务包含 `created_by`。
|
|
|
|
### INFER-002 推理加载和卸载权限
|
|
|
|
**步骤**
|
|
|
|
1. 用户 A 创建推理任务。
|
|
2. 用户 B 调用加载、卸载接口。
|
|
3. 用户 A 执行加载和卸载。
|
|
|
|
**预期**
|
|
|
|
- 用户 B 返回 HTTP 403。
|
|
- 用户 A 可以执行授权范围内的加载和卸载。
|
|
- 卸载后 GPU 和节点状态恢复为空闲。
|
|
|
|
### INFER-003 推理任务删除审批
|
|
|
|
**预期**
|
|
|
|
- 非管理员删除他人推理任务被拒绝或进入审批。
|
|
- 管理员可以直接删除。
|
|
- 删除操作有审计日志。
|
|
|
|
## 9. 模型合并与导出测试
|
|
|
|
### MODEL-001 权重合并权限
|
|
|
|
**步骤**
|
|
|
|
1. 普通用户选择无权限训练模型进行合并。
|
|
2. 选择已授权训练模型进行合并。
|
|
|
|
**预期**
|
|
|
|
- 无权限返回 HTTP 403。
|
|
- 已授权训练模型允许合并。
|
|
- 如指定基座模型,还必须拥有基座模型 `execute` 权限。
|
|
|
|
### MODEL-002 训练模型删除权限
|
|
|
|
**预期**
|
|
|
|
- 只有资源所有者、ACL 授权用户或管理员可操作。
|
|
- 删除采用软删除。
|
|
- `deleted_at`、`deleted_by` 被写入。
|
|
|
|
### MODEL-003 导出任务访问权限
|
|
|
|
**预期**
|
|
|
|
- 无权用户不能查看训练模型导出任务。
|
|
- 有权用户可以查看导出状态。
|
|
- 导出动作应记录 `trained_model.export` 审计日志。
|
|
|
|
## 10. 算力节点与 GPU 管理测试
|
|
|
|
### GPU-001 普通用户节点可见范围
|
|
|
|
**预期**
|
|
|
|
- 普通用户只能看到被分配 GPU 所在节点。
|
|
- 普通用户只能看到已授权 GPU。
|
|
- 管理员可看到所有节点和 GPU。
|
|
|
|
### GPU-002 节点管理接口权限
|
|
|
|
验证节点创建、修改、删除、启用、禁用、排空、连接测试和健康检查。
|
|
|
|
**预期**
|
|
|
|
- 普通用户全部返回 HTTP 403。
|
|
- 管理员操作成功。
|
|
|
|
### GPU-003 多卡自动分配
|
|
|
|
**步骤**
|
|
|
|
1. 节点配置多张 GPU。
|
|
2. 启动一个任务占用其中一张卡。
|
|
3. 再启动任务并选择剩余卡。
|
|
|
|
**预期**
|
|
|
|
- 已占用 GPU 不再出现在可选列表。
|
|
- 剩余 GPU 可以被其他任务使用。
|
|
- 任务失败、停止或完成后 GPU 释放。
|
|
|
|
## 11. 软删除与数据库测试
|
|
|
|
### DB-001 初始化字段检查
|
|
|
|
执行:
|
|
|
|
```sql
|
|
SELECT table_name, column_name
|
|
FROM information_schema.columns
|
|
WHERE table_name IN ('models', 'datasets', 'trained_models', 'eval_tasks', 'sessions')
|
|
ORDER BY table_name, ordinal_position;
|
|
```
|
|
|
|
**预期字段**
|
|
|
|
- 资源表存在 `created_by`、`tenant_id`、`project_id`、`deleted_at`、`deleted_by`。
|
|
- `sessions` 存在 `issued_at`、`expires_at`、`logout_at`。
|
|
|
|
### DB-002 软删除列表过滤
|
|
|
|
**步骤**
|
|
|
|
1. 删除模型、数据集或评测任务。
|
|
2. 查询列表。
|
|
3. 直接查询数据库记录。
|
|
|
|
**预期**
|
|
|
|
- 前端列表不再显示已删除资源。
|
|
- 数据库记录仍存在。
|
|
- `deleted_at` 和 `deleted_by` 有值。
|
|
|
|
## 12. 日志降噪测试
|
|
|
|
### LOG-001 正常轮询日志
|
|
|
|
**步骤**
|
|
|
|
1. 重启 Backend 容器。
|
|
2. 连续观察 1 分钟日志。
|
|
|
|
```bash
|
|
docker logs -f --tail=200 yg-ft-backend-api
|
|
```
|
|
|
|
**预期**
|
|
|
|
- 不再每次以 `INFO` 输出 `compute jobs polled`。
|
|
- 健康检查成功请求不再以 `INFO` 输出应用日志。
|
|
- 正常任务同步日志仅在 `DEBUG` 级别出现。
|
|
|
|
### LOG-002 异常轮询日志
|
|
|
|
**步骤**
|
|
|
|
1. 临时停止算力节点或断开节点网络。
|
|
2. 观察 Backend 日志。
|
|
|
|
**预期**
|
|
|
|
- 轮询失败以 `WARNING` 或 `ERROR` 输出。
|
|
- 异常包含节点、任务或错误原因。
|
|
- 恢复节点后轮询继续工作。
|
|
|
|
## 13. 容器验证命令
|
|
|
|
```bash
|
|
docker compose ps
|
|
docker logs --tail=200 yg-ft-backend-api
|
|
curl -i http://172.25.179.69:17861/modelTF/health
|
|
curl -i http://172.25.179.69:16801/
|
|
```
|
|
|
|
预期 Backend 和 Frontend 均为 `healthy`,健康接口返回 HTTP 200。
|
|
|
|
## 14. 测试结果记录
|
|
|
|
| 用例编号 | 测试结果 | 实际结果 | 缺陷编号 | 测试人 | 日期 |
|
|
|---|---|---|---|---|---|
|
|
| AUTH-001 | □通过 □失败 | | | | |
|
|
| AUTH-002 | □通过 □失败 | | | | |
|
|
| AUTH-003 | □通过 □失败 | | | | |
|
|
| AUTH-004 | □通过 □失败 | | | | |
|
|
| ACL-001 | □通过 □失败 | | | | |
|
|
| TRAIN-001 | □通过 □失败 | | | | |
|
|
| TRAIN-002 | □通过 □失败 | | | | |
|
|
| EVAL-001 | □通过 □失败 | | | | |
|
|
| INFER-001 | □通过 □失败 | | | | |
|
|
| MODEL-001 | □通过 □失败 | | | | |
|
|
| GPU-001 | □通过 □失败 | | | | |
|
|
| DB-001 | □通过 □失败 | | | | |
|
|
| LOG-001 | □通过 □失败 | | | | |
|
|
| LOG-002 | □通过 □失败 | | | | |
|