# TPS 与 RMS 交互方式

对于给定 test plan ，会有 setup 和 teardown 两个阶段来创建和清理资源，由一个命令行工具负责处理请求。

## Setup

Setup 时 TPS 会注入两个环境变量作为工具输入：

**TESTBED_INPUT_SPEC**
```json
{
    "generateName": "testbed-",
    "items": [
        {
            "name": "tc-1",
            "type": "TIDB_CLUSTER",
            "spec": {
                "pd": { "replicas": 1, "image": "pingcap/pd:v5.0.0" },
                "tidb": { "replicas": 1, "image": "pingcap/tidb:v5.0.0" },
                "tikv": { "replicas": 1, "image": "pingcap/tikv:v5.0.0" }
            }
        },
        {
            "name": "tc-2",
            "type": "TIDB_CLUSTER",
            "spec": {
                "pd": { "replicas": 1, "image": "pingcap/pd:v5.0.1" },
                "tidb": { "replicas": 1, "image": "pingcap/tidb:v5.0.1" },
                "tikv": { "replicas": 1, "image": "pingcap/tikv:v5.0.1" }
            }
        }
    ]
}
```
TPS 会对 plan.testbed 做变量替换然后透传给工具，工具需要据此创建资源，并等待资源 ready 。

**TESTBED_OUTPUT_SPEC**
```json
{
    "output": "/tmp/testbed/output",
    "items": [
        {
            "name": "tc-1",
            "path": "/tmp/testbed/items/tc-1",
        },
        {
            "name": "tc-2",
            "path": "/tmp/testbed/items/tc-1",
        }
    ]
}
```

TPS 还会传入一个 OUTPUT_SPEC 来告诉工具各个 resources 的 handle 需要输出到哪？如上例中，tc-1 资源实例的 handle 需要输出到 `/tmp/testbed/items/tc-1` ，这样 TPS 才能将这些资源的 handle 传递给后续的 case 进程。此外工具还需要将 teardown 时需要用到的信息输出到 output 字段对应的文件 (`/tmp/testbed/output`) 里，比如直接将 POST /testbed 的 response 写到这里。

## Teardown

**TESTBED_SETUP_OUTPUT**
```json
{
    "name": "testbed-glc6r",
    "items": [
        {
            "name": "tc-1",
            "testbed": "testbed-glc6r",
            "type": "TIDB_CLUSTER",
            "ready": false
        },
        {
            "name": "tc-2",
            "testbed": "testbed-glc6r",
            "type": "TIDB_CLUSTER",
            "ready": false
        }
    ]
}
```

TPS 会将 setup 阶段 `TESTBED_OUTPUT_SPEC.output` 的内容作为 `TESTBED_SETUP_OUTPUT` 变量值，工具需要据此释放掉相应资源。
