scenario:
  id: 58f92273-a363-4662-8197-c1204810c569
  context:
    base_path: /v1beta2
    host: null
  description: Exercise the BYOC resource-pool lifecycle against the workflow-scoped shared pool.
  name: ng_byoc_resource_pool_journey
steps:
- operation_id: RegionService_ListNodeSpecs
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/regions/{regionId}/nodeSpecs",
      "path_params": {
        "regionId": "region_id"
      },
      "query_params": {
        "organizationId": "tenant_id",
        "componentType": "NODE_SPEC_COMPONENT_TYPE_TIKV",
        "pageSize": 20
      },
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.totalSize > 0 && size(body.nodeSpecs) > 0 && int(body.nodeSpecs[0].cpu) > 0 && int(body.nodeSpecs[0].memoryGi) > 0 && body.nodeSpecs[0].storages.exists(s, s.name == 'data' && int(s.defaultSizeGi) > 0) && int(body.nodeCountOptions.defaultNodeCount) >= int(body.nodeCountOptions.minNodeCount) && int(body.nodeCountOptions.defaultNodeCount) <= int(body.nodeCountOptions.maxNodeCount) && (body.nodeCountOptions.rule.type == 'NODE_COUNT_RULE_TYPE_NONE' || (body.nodeCountOptions.rule.type == 'NODE_COUNT_RULE_TYPE_MULTIPLE_OF' && int(body.nodeCountOptions.rule.value) > 0 && int(body.nodeCountOptions.defaultNodeCount) % int(body.nodeCountOptions.rule.value) == 0) || (body.nodeCountOptions.rule.type == 'NODE_COUNT_RULE_TYPE_FIXED' && int(body.nodeCountOptions.defaultNodeCount) == int(body.nodeCountOptions.rule.value)))"
    }
  save: |-
    {
      "placeholder": [
        {
          "key": "tikv_cpu",
          "eval": "body.nodeSpecs[0].cpu"
        },
        {
          "key": "tikv_memory_gi",
          "eval": "body.nodeSpecs[0].memoryGi"
        },
        {
          "key": "tikv_data_size_gi",
          "eval": "body.nodeSpecs[0].storages.filter(s, s.name == 'data')[0].defaultSizeGi"
        },
        {
          "key": "tikv_initial_node_count",
          "eval": "body.nodeCountOptions.defaultNodeCount"
        }
      ]
    }
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 1
  name: Discover a usable TiKV node specification
  description: Save the first normalized TiKV specification and its required storage defaults.
  stage: prepare
  meta: "{}"
- operation_id: RegionService_PlanResourcePoolCidr
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/regions/{regionId}:planResourcePoolCidr",
      "path_params": {
        "regionId": "region_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.regionId == '{region_id}' && body.cloudProvider == '{cloud_provider}' && body.recommendationStatus == 'AVAILABLE' && has(body.recommendation) && body.recommendation.cidr != '' && int(body.recommendation.supportedNodeCount) > 0"
    }
  save: |-
    {
      "placeholder": [
        {
          "key": "resource_pool_vpc_cidr",
          "eval": "body.recommendation.cidr"
        }
      ]
    }
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 2
  name: Get a recommended resource-pool CIDR
  description: Ask the regional planner for an available CIDR and save it for validation and creation.
  stage: prepare
  meta: "{}"
- operation_id: RegionService_ValidateResourcePoolCidr
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/regions/{regionId}:validateResourcePoolCidr",
      "path_params": {
        "regionId": "region_id"
      },
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "cidr": "{resource_pool_vpc_cidr}"
      },
      "body_params": {
        "resource_pool_vpc_cidr": "resource_pool_vpc_cidr"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.regionId == '{region_id}' && body.cloudProvider == '{cloud_provider}' && body.cidr == '{resource_pool_vpc_cidr}' && has(body.supportedNodeCount) && int(body.supportedNodeCount) > 0 && size(body.blockingFindings) == 0"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 2.5
  name: Validate the recommended resource-pool CIDR
  description: Confirm the dedicated validation API accepts the planner recommendation and reports usable node capacity.
  stage: prepare
  meta: "{}"
- operation_id: ResourcePoolService_CreateResourcePool
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools",
      "path_params": {},
      "query_params": {
        "validateOnly": true
      },
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "displayName": "sce-ng-byoc-resource-pool",
        "regionId": "{region_id}",
        "vpcCidr": "{resource_pool_vpc_cidr}",
        "vcpuLimit": {
          "limitedVcpus": 120
        },
        "capacity": {
          "tikv": {
            "nodeSpec": {
              "cpu": "{tikv_cpu:integer}",
              "memoryGi": "{tikv_memory_gi:integer}"
            },
            "nodeCount": "{tikv_initial_node_count:integer}",
            "storages": [
              {
                "name": "data",
                "sizeGi": "{tikv_data_size_gi:integer}"
              }
            ]
          }
        }
      },
      "body_params": {
        "region_id": "region_id",
        "resource_pool_vpc_cidr": "resource_pool_vpc_cidr",
        "tikv_cpu": "tikv_cpu",
        "tikv_memory_gi": "tikv_memory_gi",
        "tikv_initial_node_count": "tikv_initial_node_count",
        "tikv_data_size_gi": "tikv_data_size_gi"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "(!has(body.resourcePoolId) || body.resourcePoolId == '') && (!has(body.name) || body.name == '') && body.displayName.startsWith('sce-ng-byoc-resource-pool-') && body.regionId == '{region_id}' && body.vpcCidr == '{resource_pool_vpc_cidr}' && body.vcpuLimit.limitedVcpus == '120' && int(body.capacity.tikv.nodeSpec.cpu) == int('{tikv_cpu}') && int(body.capacity.tikv.nodeSpec.memoryGi) == int('{tikv_memory_gi}') && int(body.capacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && !has(body.capacity.tiflash)"
    }
  save: |-
    {
      "placeholder": [
        {
          "key": "resource_pool_display_name",
          "eval": "body.displayName"
        },
        {
          "key": "resource_pool_vpc_cidr",
          "eval": "body.vpcCidr"
        }
      ]
    }
  max_retries: 0
  delay_after: 1
  continue_on_unexpected: false
  order: 3
  name: Validate resource-pool creation
  description: Validate the recommended CIDR and bootstrap capacity without creating a durable pool.
  stage: prepare
  meta: "{}"
- operation_id: ResourcePoolService_ListResourcePools
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools",
      "path_params": {},
      "query_params": {
        "displayName": "resource_pool_display_name",
        "pageSize": 10
      },
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "!has(body.resourcePools) || !body.resourcePools.exists(p, p.displayName == '{resource_pool_display_name}')"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 4
  name: Verify validate-only did not persist a pool
  description: Confirm that the normalized validate-only display name is absent from List.
  stage: prepare
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePool
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.state == 'ACTIVE' && body.regionId == '{region_id}' && has(body.capacity.tikv) && int(body.capacity.tikv.nodeCount) > 0 && body.capacity.tikv.storages.exists(s, s.name == 'data' && int(s.sizeGi) > 0) && !has(body.capacity.tiflash)"
    }
  save: |-
    {
      "placeholder": [
        {
          "key": "resource_pool_display_name",
          "eval": "body.displayName"
        },
        {
          "key": "resource_pool_vpc_cidr",
          "eval": "body.vpcCidr"
        },
        {
          "key": "tikv_cpu",
          "eval": "body.capacity.tikv.nodeSpec.cpu"
        },
        {
          "key": "tikv_memory_gi",
          "eval": "body.capacity.tikv.nodeSpec.memoryGi"
        },
        {
          "key": "tikv_initial_node_count",
          "eval": "body.capacity.tikv.nodeCount"
        },
        {
          "key": "tikv_data_size_gi",
          "eval": "body.capacity.tikv.storages.filter(s, s.name == 'data')[0].sizeGi"
        },
        {
          "key": "resource_pool_conflict_display_name",
          "eval": "body.displayName + '-cidr-conflict'"
        }
      ]
    }
  max_retries: 120
  delay_after: 30
  continue_on_unexpected: false
  order: 5
  name: Load the shared resource pool
  description: Read the workflow-scoped pool and save its actual identity-independent fields for the remaining lifecycle checks.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_CreateResourcePool
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools",
      "path_params": {},
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "displayName": "{resource_pool_conflict_display_name}",
        "regionId": "{region_id}",
        "vpcCidr": "{resource_pool_vpc_cidr}",
        "vcpuLimit": {
          "limitedVcpus": 120
        },
        "capacity": {
          "tikv": {
            "nodeSpec": {
              "cpu": "{tikv_cpu:integer}",
              "memoryGi": "{tikv_memory_gi:integer}"
            },
            "nodeCount": "{tikv_initial_node_count:integer}",
            "storages": [
              {
                "name": "data",
                "sizeGi": "{tikv_data_size_gi:integer}"
              }
            ]
          }
        }
      },
      "body_params": {
        "resource_pool_conflict_display_name": "resource_pool_conflict_display_name",
        "region_id": "region_id",
        "resource_pool_vpc_cidr": "resource_pool_vpc_cidr",
        "tikv_cpu": "tikv_cpu",
        "tikv_memory_gi": "tikv_memory_gi",
        "tikv_initial_node_count": "tikv_initial_node_count",
        "tikv_data_size_gi": "tikv_data_size_gi"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 400,
      "cel": "int(body.code) == 400 && body.message == 'Resource pool VPC CIDR is invalid.'"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 7
  name: Reject a resource pool with the same CIDR
  description: Prove the active pool excludes its CIDR by asserting the public invalid-CIDR response.
  stage: verify
  meta: "{}"
- operation_id: ResourcePoolService_ListResourcePools
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools",
      "path_params": {},
      "query_params": {
        "displayName": "resource_pool_conflict_display_name",
        "pageSize": 10
      },
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "!has(body.resourcePools) || !body.resourcePools.exists(p, p.displayName == '{resource_pool_conflict_display_name}')"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 8
  name: Verify the conflicting resource pool was not persisted
  description: Confirm the rejected duplicate-CIDR request created no resource pool.
  stage: verify
  meta: "{}"
- operation_id: ResourcePoolService_ListResourcePools
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools",
      "path_params": {},
      "query_params": {
        "displayName": "resource_pool_display_name",
        "pageSize": 10
      },
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePools.exists(p, p.resourcePoolId == '{resource_pool_id}' && p.displayName == '{resource_pool_display_name}' && p.state == 'ACTIVE')"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 9
  name: Find the active resource pool
  description: Verify the created pool appears in the filtered List projection.
  stage: verify
  meta: "{}"
- operation_id: ResourcePoolService_UpdateResourcePool
  request_type: http
  request: |-
    {
      "method": "PATCH",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "displayName": "sce-ng-byoc-resource-pool-renamed"
      },
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.displayName.startsWith('sce-ng-byoc-resource-pool-renamed-') && body.regionId == '{region_id}' && body.vpcCidr == '{resource_pool_vpc_cidr}' && body.state == 'ACTIVE'"
    }
  save: |-
    {
      "placeholder": [
        {
          "key": "resource_pool_display_name",
          "eval": "body.displayName"
        }
      ]
    }
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 9.5
  name: Rename the active resource pool
  description: Update only the display name and replace the saved name used by later association checks.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePool
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.displayName == '{resource_pool_display_name}' && body.regionId == '{region_id}' && body.vpcCidr == '{resource_pool_vpc_cidr}' && body.state == 'ACTIVE'"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 9.6
  name: Verify the resource-pool rename
  description: Read the pool back and confirm the renamed display name is durable without changing identity or CIDR.
  stage: verify
  meta: "{}"
- operation_id: ResourcePoolService_UpsertResourcePoolCloudResourceTags
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools/{resourcePoolId}:upsertCloudResourceTags",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "cloudResourceTags": {
          "apitestgen_retain": "resource-pool-e2e",
          "apitestgen_delete": "remove-me"
        }
      },
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "size(body.cloudResourceTags) == 2 && body.cloudResourceTags.apitestgen_retain == 'resource-pool-e2e' && body.cloudResourceTags.apitestgen_delete == 'remove-me'"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 10
  name: Add resource-pool cloud tags
  description: Add two scenario-owned tags so selective tag deletion can be verified.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePool
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.state == 'ACTIVE' && size(body.cloudResourceTags) == 2 && body.cloudResourceTags.apitestgen_retain == 'resource-pool-e2e' && body.cloudResourceTags.apitestgen_delete == 'remove-me'"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 11
  name: Verify added resource-pool cloud tags
  description: Confirm both scenario-owned tags are visible on the resource pool.
  stage: verify
  meta: "{}"
- operation_id: ResourcePoolService_UpsertResourcePoolCloudResourceTags
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools/{resourcePoolId}:upsertCloudResourceTags",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "removeCloudResourceTagKeys": [
          "apitestgen_delete"
        ]
      },
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "size(body.cloudResourceTags) == 1 && body.cloudResourceTags.apitestgen_retain == 'resource-pool-e2e'"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 12
  name: Delete one resource-pool cloud tag
  description: Submit a removal-only tag patch and preserve the unrelated scenario-owned tag.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePool
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.state == 'ACTIVE' && size(body.cloudResourceTags) == 1 && body.cloudResourceTags.apitestgen_retain == 'resource-pool-e2e'"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 13
  name: Verify resource-pool cloud tag deletion
  description: Confirm the deleted tag is absent while the retained tag remains visible.
  stage: verify
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePoolCapacityConstraints
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}/capacityConstraints",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && has(body.currentCapacity.tikv) && int(body.currentCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && (!has(body.tikv.blockingReasons) || size(body.tikv.blockingReasons) == 0) && int(body.tikv.nodeCount.current) < int(body.tikv.nodeCount.max) && (body.tikv.nodeCount.rule.type == 'NODE_COUNT_RULE_TYPE_NONE' || (body.tikv.nodeCount.rule.type == 'NODE_COUNT_RULE_TYPE_MULTIPLE_OF' && int(body.tikv.nodeCount.rule.value) > 0 && int(body.tikv.nodeCount.current) + int(body.tikv.nodeCount.rule.value) <= int(body.tikv.nodeCount.max))) && has(body.tiflash) && (!has(body.tiflash.blockingReasons) || size(body.tiflash.blockingReasons) == 0) && int(body.tiflash.nodeCount.current) == 0 && body.tiflash.nodeCount.allowCrossZero && int(body.tiflash.nodeCount.max) >= (int(body.tiflash.nodeCount.min) == 0 ? 1 : int(body.tiflash.nodeCount.min)) && (body.tiflash.nodeCount.rule.type == 'NODE_COUNT_RULE_TYPE_NONE' || (body.tiflash.nodeCount.rule.type == 'NODE_COUNT_RULE_TYPE_FIXED' && (int(body.tiflash.nodeCount.min) == 0 ? 1 : int(body.tiflash.nodeCount.min)) == int(body.tiflash.nodeCount.rule.value)) || (body.tiflash.nodeCount.rule.type == 'NODE_COUNT_RULE_TYPE_MULTIPLE_OF' && int(body.tiflash.nodeCount.rule.value) > 0 && (int(body.tiflash.nodeCount.min) == 0 ? 1 : int(body.tiflash.nodeCount.min)) % int(body.tiflash.nodeCount.rule.value) == 0)) && body.tiflash.nodeSpec.candidates.exists(c, c.available && c.nodeSpec.componentType == 'NODE_SPEC_COMPONENT_TYPE_TIFLASH' && int(c.nodeSpec.cpu) > 0 && int(c.nodeSpec.memoryGi) > 0 && c.nodeSpec.storages.exists(s, s.name == 'data' && has(s.currentSizeGi) && int(s.currentSizeGi) > 0))"
    }
  save: |-
    {
      "placeholder": [
        {
          "key": "resize_tikv_cpu",
          "eval": "body.currentCapacity.tikv.nodeSpec.cpu"
        },
        {
          "key": "resize_tikv_memory_gi",
          "eval": "body.currentCapacity.tikv.nodeSpec.memoryGi"
        },
        {
          "key": "tikv_target_node_count",
          "eval": "body.tikv.nodeCount.rule.type == 'NODE_COUNT_RULE_TYPE_MULTIPLE_OF' ? int(body.tikv.nodeCount.current) + int(body.tikv.nodeCount.rule.value) : int(body.tikv.nodeCount.current) + 1"
        },
        {
          "key": "tiflash_cpu",
          "eval": "body.tiflash.nodeSpec.candidates.filter(c, c.available && c.nodeSpec.storages.exists(s, s.name == 'data' && has(s.currentSizeGi) && int(s.currentSizeGi) > 0))[0].nodeSpec.cpu"
        },
        {
          "key": "tiflash_memory_gi",
          "eval": "body.tiflash.nodeSpec.candidates.filter(c, c.available && c.nodeSpec.storages.exists(s, s.name == 'data' && has(s.currentSizeGi) && int(s.currentSizeGi) > 0))[0].nodeSpec.memoryGi"
        },
        {
          "key": "tiflash_data_size_gi",
          "eval": "body.tiflash.nodeSpec.candidates.filter(c, c.available && c.nodeSpec.storages.exists(s, s.name == 'data' && has(s.currentSizeGi) && int(s.currentSizeGi) > 0))[0].nodeSpec.storages.filter(s, s.name == 'data')[0].currentSizeGi"
        },
        {
          "key": "tiflash_target_node_count",
          "eval": "int(body.tiflash.nodeCount.min) == 0 ? 1 : int(body.tiflash.nodeCount.min)"
        }
      ]
    }
  max_retries: 120
  delay_after: 30
  continue_on_unexpected: false
  order: 14
  name: Get supported capacity targets
  description: Wait for parallel TiDB provisioning to release the shared pool, then save supported TiKV growth and TiFlash enablement targets.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_ResizeResourcePoolCapacity
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools/{resourcePoolId}:resizeCapacity",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {
        "validateOnly": true
      },
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "tikv": {
          "nodeSpec": {
            "cpu": "{resize_tikv_cpu:integer}",
            "memoryGi": "{resize_tikv_memory_gi:integer}"
          },
          "nodeCount": "{tikv_initial_node_count:integer}"
        },
        "tiflash": {
          "nodeSpec": {
            "cpu": "{tiflash_cpu:integer}",
            "memoryGi": "{tiflash_memory_gi:integer}"
          },
          "nodeCount": "{tiflash_target_node_count:integer}",
          "storages": [
            {
              "name": "data",
              "sizeGi": "{tiflash_data_size_gi:integer}"
            }
          ]
        }
      },
      "body_params": {
        "resize_tikv_cpu": "resize_tikv_cpu",
        "resize_tikv_memory_gi": "resize_tikv_memory_gi",
        "tikv_initial_node_count": "tikv_initial_node_count",
        "tiflash_cpu": "tiflash_cpu",
        "tiflash_memory_gi": "tiflash_memory_gi",
        "tiflash_target_node_count": "tiflash_target_node_count",
        "tiflash_data_size_gi": "tiflash_data_size_gi"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "int(body.currentCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && !has(body.currentCapacity.tiflash) && int(body.targetCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && int(body.targetCapacity.tiflash.nodeCount) == int('{tiflash_target_node_count}') && int(body.targetCapacity.tiflash.nodeSpec.cpu) == int('{tiflash_cpu}') && int(body.targetCapacity.tiflash.nodeSpec.memoryGi) == int('{tiflash_memory_gi}') && body.targetCapacity.tiflash.storages.exists(s, s.name == 'data' && int(s.sizeGi) == int('{tiflash_data_size_gi}'))"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 15
  name: Validate TiFlash enablement
  description: Preview the complete positive TiFlash target without mutating the resource pool.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_ResizeResourcePoolCapacity
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools/{resourcePoolId}:resizeCapacity",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "tikv": {
          "nodeSpec": {
            "cpu": "{resize_tikv_cpu:integer}",
            "memoryGi": "{resize_tikv_memory_gi:integer}"
          },
          "nodeCount": "{tikv_initial_node_count:integer}"
        },
        "tiflash": {
          "nodeSpec": {
            "cpu": "{tiflash_cpu:integer}",
            "memoryGi": "{tiflash_memory_gi:integer}"
          },
          "nodeCount": "{tiflash_target_node_count:integer}",
          "storages": [
            {
              "name": "data",
              "sizeGi": "{tiflash_data_size_gi:integer}"
            }
          ]
        }
      },
      "body_params": {
        "resize_tikv_cpu": "resize_tikv_cpu",
        "resize_tikv_memory_gi": "resize_tikv_memory_gi",
        "tikv_initial_node_count": "tikv_initial_node_count",
        "tiflash_cpu": "tiflash_cpu",
        "tiflash_memory_gi": "tiflash_memory_gi",
        "tiflash_target_node_count": "tiflash_target_node_count",
        "tiflash_data_size_gi": "tiflash_data_size_gi"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "int(body.currentCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && !has(body.currentCapacity.tiflash) && int(body.targetCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && int(body.targetCapacity.tiflash.nodeCount) == int('{tiflash_target_node_count}') && int(body.targetCapacity.tiflash.nodeSpec.cpu) == int('{tiflash_cpu}') && int(body.targetCapacity.tiflash.nodeSpec.memoryGi) == int('{tiflash_memory_gi}') && body.targetCapacity.tiflash.storages.exists(s, s.name == 'data' && int(s.sizeGi) == int('{tiflash_data_size_gi}'))"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 16
  name: Enable TiFlash capacity
  description: Submit the same complete positive TiFlash target that passed validation.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePool
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.state == 'ACTIVE' && int(body.capacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && int(body.capacity.tiflash.nodeCount) == int('{tiflash_target_node_count}') && int(body.capacity.tiflash.nodeSpec.cpu) == int('{tiflash_cpu}') && int(body.capacity.tiflash.nodeSpec.memoryGi) == int('{tiflash_memory_gi}') && body.capacity.tiflash.storages.exists(s, s.name == 'data' && int(s.sizeGi) == int('{tiflash_data_size_gi}'))"
    }
  save: null
  max_retries: 60
  delay_after: 30
  continue_on_unexpected: false
  order: 17
  name: Wait for TiFlash enablement
  description: Poll until the pool is active with the requested positive TiFlash capacity.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_ResizeResourcePoolCapacity
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools/{resourcePoolId}:resizeCapacity",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {
        "validateOnly": true
      },
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "tikv": {
          "nodeSpec": {
            "cpu": "{resize_tikv_cpu:integer}",
            "memoryGi": "{resize_tikv_memory_gi:integer}"
          },
          "nodeCount": "{tikv_initial_node_count:integer}"
        },
        "tiflash": {
          "nodeCount": 0
        }
      },
      "body_params": {
        "resize_tikv_cpu": "resize_tikv_cpu",
        "resize_tikv_memory_gi": "resize_tikv_memory_gi",
        "tikv_initial_node_count": "tikv_initial_node_count"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "int(body.currentCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && int(body.currentCapacity.tiflash.nodeCount) == int('{tiflash_target_node_count}') && int(body.targetCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && has(body.targetCapacity.tiflash) && int(body.targetCapacity.tiflash.nodeCount) == 0 && int(body.targetCapacity.tiflash.nodeSpec.cpu) == int('{tiflash_cpu}') && int(body.targetCapacity.tiflash.nodeSpec.memoryGi) == int('{tiflash_memory_gi}') && body.targetCapacity.tiflash.storages.exists(s, s.name == 'data' && int(s.sizeGi) == int('{tiflash_data_size_gi}'))"
    }
  save: null
  max_retries: 60
  delay_after: 30
  continue_on_unexpected: false
  order: 18
  name: Validate TiFlash disabling
  description: Wait for TiFlash enablement reconciliation, then preview the explicit zero-count target without mutating the resource pool.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_ResizeResourcePoolCapacity
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools/{resourcePoolId}:resizeCapacity",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "tikv": {
          "nodeSpec": {
            "cpu": "{resize_tikv_cpu:integer}",
            "memoryGi": "{resize_tikv_memory_gi:integer}"
          },
          "nodeCount": "{tikv_initial_node_count:integer}"
        },
        "tiflash": {
          "nodeCount": 0
        }
      },
      "body_params": {
        "resize_tikv_cpu": "resize_tikv_cpu",
        "resize_tikv_memory_gi": "resize_tikv_memory_gi",
        "tikv_initial_node_count": "tikv_initial_node_count"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "int(body.currentCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && int(body.currentCapacity.tiflash.nodeCount) == int('{tiflash_target_node_count}') && int(body.targetCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && has(body.targetCapacity.tiflash) && int(body.targetCapacity.tiflash.nodeCount) == 0 && int(body.targetCapacity.tiflash.nodeSpec.cpu) == int('{tiflash_cpu}') && int(body.targetCapacity.tiflash.nodeSpec.memoryGi) == int('{tiflash_memory_gi}') && body.targetCapacity.tiflash.storages.exists(s, s.name == 'data' && int(s.sizeGi) == int('{tiflash_data_size_gi}'))"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 19
  name: Disable TiFlash capacity
  description: Submit the same explicit zero-count TiFlash target that passed validation.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePool
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.state == 'ACTIVE' && int(body.capacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && !has(body.capacity.tiflash)"
    }
  save: null
  max_retries: 60
  delay_after: 30
  continue_on_unexpected: false
  order: 20
  name: Wait for TiFlash disabling
  description: Poll until the pool is active and TiFlash is absent from the current capacity.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_ResizeResourcePoolCapacity
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools/{resourcePoolId}:resizeCapacity",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {
        "validateOnly": true
      },
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "tikv": {
          "nodeSpec": {
            "cpu": "{resize_tikv_cpu:integer}",
            "memoryGi": "{resize_tikv_memory_gi:integer}"
          },
          "nodeCount": "{tikv_target_node_count:integer}"
        }
      },
      "body_params": {
        "resize_tikv_cpu": "resize_tikv_cpu",
        "resize_tikv_memory_gi": "resize_tikv_memory_gi",
        "tikv_target_node_count": "tikv_target_node_count"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "int(body.currentCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && !has(body.currentCapacity.tiflash) && int(body.targetCapacity.tikv.nodeCount) == int('{tikv_target_node_count}') && int(body.targetCapacity.tikv.nodeSpec.cpu) == int('{resize_tikv_cpu}') && int(body.targetCapacity.tikv.nodeSpec.memoryGi) == int('{resize_tikv_memory_gi}') && !has(body.targetCapacity.tiflash)"
    }
  save: null
  max_retries: 60
  delay_after: 30
  continue_on_unexpected: false
  order: 21
  name: Validate TiKV capacity growth
  description: Wait for TiFlash disablement reconciliation, then preview the absolute TiKV target without mutating the resource pool.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_ResizeResourcePoolCapacity
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/resourcePools/{resourcePoolId}:resizeCapacity",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "tikv": {
          "nodeSpec": {
            "cpu": "{resize_tikv_cpu:integer}",
            "memoryGi": "{resize_tikv_memory_gi:integer}"
          },
          "nodeCount": "{tikv_target_node_count:integer}"
        }
      },
      "body_params": {
        "resize_tikv_cpu": "resize_tikv_cpu",
        "resize_tikv_memory_gi": "resize_tikv_memory_gi",
        "tikv_target_node_count": "tikv_target_node_count"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "int(body.currentCapacity.tikv.nodeCount) == int('{tikv_initial_node_count}') && int(body.targetCapacity.tikv.nodeCount) == int('{tikv_target_node_count}')"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 22
  name: Resize TiKV capacity
  description: Submit the same absolute TiKV target that passed validation.
  stage: execute
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePool
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.state == 'ACTIVE' && int(body.capacity.tikv.nodeCount) == int('{tikv_target_node_count}') && int(body.capacity.tikv.nodeSpec.cpu) == int('{resize_tikv_cpu}') && int(body.capacity.tikv.nodeSpec.memoryGi) == int('{resize_tikv_memory_gi}') && !has(body.capacity.tiflash)"
    }
  save: null
  max_retries: 60
  delay_after: 30
  continue_on_unexpected: false
  order: 23
  name: Wait for resized capacity
  description: Poll until the pool is active with the requested TiKV target.
  stage: execute
  meta: "{}"
- operation_id: TidbService_CreateTidb
  request_type: http
  request: |-
    {
      "method": "POST",
      "path": "/tidbs",
      "path_params": {},
      "query_params": {},
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json"
      },
      "body": {
        "displayName": "sce-ng-byoc-resource-pool-tidb",
        "regionId": "{region_id}",
        "maxRcu": 6000,
        "servicePlan": "BYOC",
        "resourcePoolId": "{resource_pool_id}"
      },
      "body_params": {
        "region_id": "region_id",
        "resource_pool_id": "resource_pool_id"
      },
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.tidbId != '' && body.resourcePoolId == '{resource_pool_id}' && body.servicePlan == 'BYOC' && (body.state == 'CREATING' || body.state == 'ACTIVE')"
    }
  save: |-
    {
      "placeholder": [
        {
          "key": "cluster_1",
          "eval": "body.tidbId"
        },
        {
          "key": "tidb_display_name",
          "eval": "body.displayName"
        }
      ]
    }
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 24
  name: Create a BYOC TiDB in the resource pool
  description: Create a minimal TiDB instance explicitly associated with the active pool.
  stage: execute
  meta: "{}"
- operation_id: TidbService_ListTidbs
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/tidbs",
      "path_params": {},
      "query_params": {
        "resourcePoolIds": "resource_pool_id",
        "pageSize": 100
      },
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.tidbs.exists(t, t.tidbId == '{cluster_1}' && t.state == 'ACTIVE' && t.resourcePoolId == '{resource_pool_id}' && t.resourcePoolDisplayName == '{resource_pool_display_name}')"
    }
  save: null
  max_retries: 60
  delay_after: 30
  continue_on_unexpected: false
  order: 25
  name: Wait for the BYOC TiDB to become active
  description: Poll the TiDB public projection and verify its pool association.
  stage: execute
  meta: "{}"
- operation_id: TidbService_ListTidbs
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/tidbs",
      "path_params": {},
      "query_params": {
        "resourcePoolIds": "resource_pool_id",
        "pageSize": 100
      },
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.tidbs.exists(t, t.tidbId == '{cluster_1}' && t.displayName == '{tidb_display_name}' && t.resourcePoolId == '{resource_pool_id}' && t.resourcePoolDisplayName == '{resource_pool_display_name}')"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 26
  name: Filter TiDB instances by resource pool
  description: Verify List filtering and the resource-pool projection on the created TiDB.
  stage: verify
  meta: "{}"
- operation_id: ResourcePoolService_DeleteResourcePool
  request_type: http
  request: |-
    {
      "method": "DELETE",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 400,
      "cel": "int(body.code) == 400"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 26.5
  name: Reject resource-pool deletion while a TiDB is attached
  description: Exercise delete protection while the pool reports a nonzero TiDB instance count.
  stage: verify
  meta: "{}"
- operation_id: ResourcePoolService_GetResourcePool
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/resourcePools/{resourcePoolId}",
      "path_params": {
        "resourcePoolId": "resource_pool_id"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "body.resourcePoolId == '{resource_pool_id}' && body.displayName == '{resource_pool_display_name}' && body.state == 'ACTIVE' && int(body.tidbInstanceCount) >= 1"
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 26.6
  name: Verify delete protection preserved the resource pool
  description: Confirm the rejected delete left the active pool and its TiDB attachment unchanged.
  stage: verify
  meta: "{}"
- operation_id: TidbService_DeleteTidb
  request_type: http
  request: |-
    {
      "method": "DELETE",
      "path": "/tidbs/{tidbId}",
      "path_params": {
        "tidbId": "cluster_1"
      },
      "query_params": {},
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": ""
    }
  save: null
  max_retries: 0
  delay_after: 0
  continue_on_unexpected: false
  order: 27
  name: Delete the BYOC TiDB
  description: Delete only the TiDB created by this scenario; workflow cleanup owns the shared resource pool.
  stage: teardown
  meta: "{}"
- operation_id: TidbService_ListTidbs
  request_type: http
  request: |-
    {
      "method": "GET",
      "path": "/tidbs",
      "path_params": {},
      "query_params": {
        "resourcePoolIds": "resource_pool_id",
        "pageSize": 100
      },
      "headers": {
        "Accept": "application/json"
      },
      "body": {},
      "body_params": {},
      "auth": {
        "auth_type": "digest",
        "content": {
          "public_key": "placeholder",
          "private_key": "placeholder"
        }
      }
    }
  expect: |-
    {
      "status_code": 200,
      "cel": "!body.tidbs.exists(t, t.tidbId == '{cluster_1}')"
    }
  save: null
  max_retries: 60
  delay_after: 10
  continue_on_unexpected: false
  order: 28
  name: Wait for TiDB absence
  description: Confirm this scenario's TiDB is absent without making assumptions about parallel TiDBs in the shared pool.
  stage: teardown
  meta: "{}"
