scenario:
  id: bff9fc9d-f313-40ca-a59c-6b3876037f9d
  context:
    auth:
      type: digest
    base_path: /v1beta2
    host: null
  description: ng_byoc_cluster_flexible_backup_setting
  name: ng_byoc_cluster_flexible_backup_setting
steps:
  - operation_id: TidbService_CreateTidb
    request_type: http
    request: |-
      {
        "method": "POST",
        "path": "/tidbs",
        "headers": {},
        "query_params": {},
        "body": {
          "displayName": "sce-ng-byoc-flexible-backup-setting",
          "regionId": "{regionId}",
          "minRcu": "5000",
          "maxRcu": "6000",
          "servicePlan": "BYOC",
          "cloudProvider": "{cloud_provider}",
          "resourcePoolId": "{resource_pool_id}"
        },
        "body_params": {
          "regionId": "region_id",
          "cloud_provider": "cloud_provider",
          "resource_pool_id": "resource_pool_id"
        },
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        }
      }
    expect: |-
      {
        "status_code": 200,
        "cel": ""
      }
    save: |-
      {
        "placeholder": [
          {
            "key": "cluster_1",
            "eval": "body.tidbId"
          }
        ]
      }
    description: "Create a BYOC TiDB cluster for flexible backup setting E2E."
    max_retries: 0
    delay_after: 0
    name: "create_byoc_cluster"
    continue_on_unexpected: false
    stage: prepare
    meta: "{}"
    generation_id: ""
    order: 0
    case_id: byoc_flexible_backup_setting_create_cluster
    case_type: user_defined
    step_type: defined

  - operation_id: PrivateEndpointConnectionService_GetPrivateLinkService
    request_type: http
    request: |-
      {
        "method": "GET",
        "path": "/tidbs/{tidbId}/privateLinkService",
        "headers": {},
        "query_params": {},
        "body": {},
        "path_params": {
          "tidbId": "cluster_1"
        },
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        }
      }
    expect: |-
      {
        "status_code": 200,
        "cel": "body.state == 'ACTIVE'"
      }
    save: |-
      {
        "placeholder": [
          {
            "key": "private_link_service_1",
            "eval": "body.serviceName"
          }
        ]
      }
    description: "Wait until the private link service is ACTIVE, matching the readiness gate used by other BYOC cluster E2E scenarios."
    max_retries: 120
    delay_after: 30
    name: "wait_private_link_service_active"
    continue_on_unexpected: false
    stage: prepare
    meta: "{}"
    generation_id: ""
    order: 0.5
    case_id: byoc_flexible_backup_setting_wait_private_link_service_active
    case_type: user_defined
    step_type: defined

  - operation_id: TidbService_GetTidb
    request_type: http
    request: |-
      {
        "method": "GET",
        "path": "/tidbs/{tidbId}",
        "headers": {},
        "query_params": {},
        "body": {},
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        },
        "path_params": {
          "tidbId": "cluster_1"
        }
      }
    expect: |-
      {
        "status_code": 200,
        "cel": "body.state == 'ACTIVE'"
      }
    save: |-
      {
        "placeholder": [
          {
            "key": "flex_daily_backup_time_utc",
            "eval": "saved_placeholder.curr_action_delay_10min_hhmm"
          }
        ]
      }
    description: "Wait until the source cluster is ACTIVE before updating backup settings."
    max_retries: 120
    delay_after: 30
    name: "wait_cluster_active"
    continue_on_unexpected: false
    stage: prepare
    meta: "{}"
    generation_id: ""
    order: 1
    case_id: byoc_flexible_backup_setting_wait_cluster_active
    case_type: user_defined
    step_type: defined

  - operation_id: TidbService_GetBackupSetting
    request_type: http
    request: |-
      {
        "method": "GET",
        "path": "/tidbs/{tidbId}/backupSetting",
        "headers": {},
        "query_params": {},
        "body": {},
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        },
        "path_params": {
          "tidbId": "cluster_1"
        }
      }
    expect: |-
      {
        "status_code": 200,
        "cel": "body.backupPolicy == 'TIER1' && body.mode == 'STANDARD_BUNDLE' && body.retentionDays == 7 && body.dailyBackupTimeUtc == '00:00'"
      }
    save: null
    description: "Verify the default standard bundle backup setting before switching to flexible retention."
    max_retries: 10
    delay_after: 30
    name: "get_default_backup_setting"
    continue_on_unexpected: false
    stage: execute
    meta: "{}"
    generation_id: ""
    order: 2
    case_id: byoc_flexible_backup_setting_get_default
    case_type: user_defined
    step_type: defined

  - operation_id: TidbService_UpdateBackupSetting
    request_type: http
    request: |-
      {
        "method": "PATCH",
        "path": "/tidbs/{tidbId}/backupSetting",
        "headers": {},
        "query_params": {},
        "body": {
          "mode": "FLEXIBLE_RETENTION",
          "retentionDays": 2,
          "dailyBackupTimeUtc": "{dailyBackupTimeUtc}"
        },
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        },
        "path_params": {
          "tidbId": "cluster_1"
        },
        "body_params": {
          "dailyBackupTimeUtc": "flex_daily_backup_time_utc"
        }
      }
    expect: |-
      {
        "status_code": 400,
        "cel": ""
      }
    save: null
    description: "Verify flexible retention rejects retention days below the public minimum."
    max_retries: 0
    delay_after: 0
    name: "reject_too_short_flexible_retention"
    continue_on_unexpected: false
    stage: execute
    meta: "{}"
    generation_id: ""
    order: 2.5
    case_id: byoc_flexible_backup_setting_reject_too_short_retention
    case_type: user_defined
    step_type: defined

  - operation_id: TidbService_UpdateBackupSetting
    request_type: http
    request: |-
      {
        "method": "PATCH",
        "path": "/tidbs/{tidbId}/backupSetting",
        "headers": {},
        "query_params": {},
        "body": {
          "mode": "FLEXIBLE_RETENTION",
          "retentionDays": 34,
          "dailyBackupTimeUtc": "{dailyBackupTimeUtc}"
        },
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        },
        "path_params": {
          "tidbId": "cluster_1"
        },
        "body_params": {
          "dailyBackupTimeUtc": "flex_daily_backup_time_utc"
        }
      }
    expect: |-
      {
        "status_code": 400,
        "cel": ""
      }
    save: null
    description: "Verify flexible retention rejects retention days above the public maximum."
    max_retries: 0
    delay_after: 0
    name: "reject_too_long_flexible_retention"
    continue_on_unexpected: false
    stage: execute
    meta: "{}"
    generation_id: ""
    order: 2.6
    case_id: byoc_flexible_backup_setting_reject_too_long_retention
    case_type: user_defined
    step_type: defined

  - operation_id: TidbService_UpdateBackupSetting
    request_type: http
    request: |-
      {
        "method": "PATCH",
        "path": "/tidbs/{tidbId}/backupSetting",
        "headers": {},
        "query_params": {},
        "body": {
          "mode": "FLEXIBLE_RETENTION",
          "retentionDays": 20,
          "dailyBackupTimeUtc": "{dailyBackupTimeUtc}"
        },
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        },
        "path_params": {
          "tidbId": "cluster_1"
        },
        "body_params": {
          "dailyBackupTimeUtc": "flex_daily_backup_time_utc"
        }
      }
    expect: |-
      {
        "status_code": 200,
        "cel": "body.backupPolicy == 'TIER1' && body.mode == 'FLEXIBLE_RETENTION' && body.retentionDays == 20 && body.dailyBackupTimeUtc == '{flex_daily_backup_time_utc}'"
      }
    save: null
    description: "Switch backup setting to flexible retention through public NextGen OpenAPI. This should persist in global and synchronously call regional backup GC and auto backup metering updates."
    max_retries: 0
    delay_after: 0
    name: "update_backup_setting_to_flexible_retention"
    continue_on_unexpected: false
    stage: execute
    meta: "{}"
    generation_id: ""
    order: 3
    case_id: byoc_flexible_backup_setting_update_to_flexible
    case_type: user_defined
    step_type: defined

  - operation_id: TidbService_GetBackupSetting
    request_type: http
    request: |-
      {
        "method": "GET",
        "path": "/tidbs/{tidbId}/backupSetting",
        "headers": {},
        "query_params": {},
        "body": {},
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        },
        "path_params": {
          "tidbId": "cluster_1"
        }
      }
    expect: |-
      {
        "status_code": 200,
        "cel": "body.backupPolicy == 'TIER1' && body.mode == 'FLEXIBLE_RETENTION' && body.retentionDays == 20 && body.dailyBackupTimeUtc == '{flex_daily_backup_time_utc}'"
      }
    save: null
    description: "Read back the flexible backup setting from global after the regional sync succeeds."
    max_retries: 5
    delay_after: 10
    name: "verify_flexible_backup_setting"
    continue_on_unexpected: false
    stage: execute
    meta: "{}"
    generation_id: ""
    order: 4
    case_id: byoc_flexible_backup_setting_verify_flexible
    case_type: user_defined
    step_type: defined

  - operation_id: TidbService_UpdateBackupSetting
    request_type: http
    request: |-
      {
        "method": "PATCH",
        "path": "/tidbs/{tidbId}/backupSetting",
        "headers": {},
        "query_params": {},
        "body": {
          "mode": "STANDARD_BUNDLE"
        },
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        },
        "path_params": {
          "tidbId": "cluster_1"
        }
      }
    expect: |-
      {
        "status_code": 200,
        "cel": "body.backupPolicy == 'TIER1' && body.mode == 'STANDARD_BUNDLE' && body.retentionDays == 7 && body.dailyBackupTimeUtc == '00:00'"
      }
    save: null
    description: "Switch back to standard bundle through the same public API path. This should also call regional to remove the flexible metering setting."
    max_retries: 0
    delay_after: 0
    name: "update_backup_setting_to_standard_bundle"
    continue_on_unexpected: false
    stage: execute
    meta: "{}"
    generation_id: ""
    order: 5
    case_id: byoc_flexible_backup_setting_update_to_standard
    case_type: user_defined
    step_type: defined

  - operation_id: TidbService_GetBackupSetting
    request_type: http
    request: |-
      {
        "method": "GET",
        "path": "/tidbs/{tidbId}/backupSetting",
        "headers": {},
        "query_params": {},
        "body": {},
        "auth": {
          "auth_type": "digest",
          "content": {
            "private_key": "placeholder",
            "public_key": "placeholder"
          }
        },
        "path_params": {
          "tidbId": "cluster_1"
        }
      }
    expect: |-
      {
        "status_code": 200,
        "cel": "body.backupPolicy == 'TIER1' && body.mode == 'STANDARD_BUNDLE' && body.retentionDays == 7 && body.dailyBackupTimeUtc == '00:00'"
      }
    save: null
    description: "Verify the backup setting is back to standard bundle after the full global-to-regional rollback path succeeds."
    max_retries: 5
    delay_after: 10
    name: "verify_standard_backup_setting"
    continue_on_unexpected: false
    stage: execute
    meta: "{}"
    generation_id: ""
    order: 6
    case_id: byoc_flexible_backup_setting_verify_standard
    case_type: user_defined
    step_type: defined
