# DM test-infra case 编写指南

## 学习 tcctl 工具

> https://github.com/pingcap/test-infra/tree/main/tools/tcctl

1. `make install-tcctl`：安装 tcctl
2. 在 https://tcms.pingcap.net/dashboard/settings/tokens 生成自己的 token
3. `tcctl config --token=<your-token> -r http://rms-staging.pingcap.net:30007`：保存自己的 token
4. 理解 `tcctl testbed create/delete/list` 命令
    - testbed 是为了本地调试创建的 staging 环境，每次创建只有一天的时间，最多只能同时创建两个，建议创建新 testbed 的时候删除掉旧 testbed
    - 相关文件在 caselib/dm/testbed 路径下

## 如何编写 case

1. 在 caselib/dm/testcases/ 文件夹下，创建一个 CASE_NAME.go 文件，参考 `dm_migrate_basic_001.go`
    - **`dm_tolerance_002` 对常见步骤做了封装，可参考**
    - 添加自己需要的 step，如果没有相应的 step，则在 caselib/pkg/steps/dm.go 中添加相应的 step（即 dm 的各种命令）
    - step 只是写 case 的一层封装，具体的实现在 caselib/pkg/host/dm.go 中
2. 在 caselib/dm/testcases/ 文件夹下，创建一个 CASE_NAME 文件夹，并创建相应的文件
    ```tree
    CASE_NAME
    ├── case.yaml
    ├── config
    │   ├── diff.toml
    │   ├── source.yaml
    │   └── task.yaml
    └── path.yaml
    └── workload.yaml
    ```
    - 在 config 文件夹下，创建所有自己需要的配置文件（相应 host 可任意填写，会动态变化）
    - 在 path.yaml 中，记录配置文件的路径
    - 注意：source-id 需要以 source-0, source-1, ..., source-n 递增

## 如何本地调试

1. `make create-testbed`：创建 testbed
2. `make debug-run CASE=$(CASE_NAME)`：开始本地测试
    - `make kube-dm`：进入 dm 环境
    - `make kube-up`：进入 upstream 环境
    - `make kube-dmctl`：进入 dm 环境，并进入 dmctl 交互模式
    - `make kube-sync-diff`：进入 sync-diff 环境
3. 如果重复 run，则可以
   1. 使用 `CommonEnv.cleanUpEnv` 清理环境，或
   2. 从失败的点开始，把失败前的 step 注释掉，例如：如果我们 `CheckSyncDiff` 失败了
    ```go
	return steps.
		NewBuilder().
		LoadEnv().
		LoadResourceFromEnv(utils.ResourcePrefix+"upstream", upStream1).
		LoadResourceFromEnv(utils.ResourcePrefix+"downstream", downStream).
		LoadResourceFromEnv(utils.ResourcePrefix+"dm", dm).
		LoadResourceFromEnv(utils.ResourcePrefix+"workload", workload).
		LoadResourceFromEnv(utils.ResourcePrefix+"sync-diff", syncDiff).
		InitDMHost(dm, downStream, []*resource.ResourceHandle{upStream1}, dmHost).
		AdjustConfig(dm, syncDiff, dmHost, Path).
		// CreateSource(dm, dmHost, Path.SourcePaths[0]).
		// CreateDatabase(upStream1, dbName).
		// RunDMWorkload(upStream1, dm, workload, Spec.GetWorkloadOption(wl.CommandTypePrepare)).
		// StartTask(dm, dmHost, Path.TaskPaths[0]).
		CheckSyncDiff(dm, syncDiff, dmHost, Path.DiffPaths[0]).
		RunDMWorkload(upStream1, dm, workload, Spec.GetWorkloadOption(wl.CommandTypeRun)).
		CheckSyncDiff(dm, syncDiff, dmHost, Path.DiffPaths[0]).
		Build()
    ```

## 如何上传到 test-infra

1. 创建 caselib/dm/testcases/CASE_NAME 下的 `case.yaml` 文件
2. `docker login -u xxx hub.pingcap.net` 需要向 郭渝 注册账号，并申请 hub.pingcap.net/dm 写权限
3. `make case-image CASE=$(CASE_NAME)`：把 test_infra image 上传到 https://hub-new.pingcap.net/harbor/projects/39/repositories/test-infra
4. `make case CASE=$(CASE_NAME)`：把 case 上传到 [tcmc](https://tcms.pingcap.net/dashboard/)
5. 到 https://github.com/pingcap/test-plan/tree/main/data-platform/dm 创建自己的 plan，或者在现存的 plan 中添加 case
6. 执行 `tcctl run -f data-platform/dm/PLAN_FILE -m meta.yaml`，即可以触发 one-shot，在 https://tcms.pingcap.net/dashboard/executions/plan 查看是否运行成功。

## 如何登陆测试的环境

`tcctl testbed auth $(NAMESPACE) -r http://rms.pingcap.net:30007` 在当前路径，生成 kubeconfig 文件，$(NAMESPACE) 长这样 dm-tolerance-002-testbed-tps-540571-1-288；
    - `make kube-dm`：进入 dm 环境
    - `make kube-up`：进入 upstream 环境
    - `make kube-dmctl`：进入 dm 环境，并进入 dmctl 交互模式
    - `make kube-sync-diff`：进入 sync-diff 环境
    - `make worker0-log`：查看 worker0 log