{
  "swagger": "2.0",
  "info": {
    "title": "dm/dm.proto",
    "version": "0.1"
  },
  "tags": [
    {
      "name": "Service"
    }
  ],
  "schemes": [
    "https"
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "/api/v1/dataflow/dm/job-specs": {
      "get": {
        "operationId": "ListDMJobSpecs",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmListJobSpecsResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/dataflow/dm/supported-sources": {
      "get": {
        "summary": "supported upstream/downstream db types",
        "operationId": "GetDMSupportedSources",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmGetSupportedSourcesResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "vendor",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/cost": {
      "get": {
        "operationId": "GetDMCost",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmGetCostResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "conn_method",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "spec_id",
            "in": "query",
            "required": true,
            "type": "string",
            "format": "uint64"
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/jobs": {
      "get": {
        "operationId": "ListDMJobs",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmListJobsResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "page",
            "description": "start from 1",
            "in": "query",
            "required": false,
            "type": "integer",
            "format": "int32"
          },
          {
            "name": "page_size",
            "in": "query",
            "required": false,
            "type": "integer",
            "format": "int32"
          }
        ],
        "tags": [
          "Service"
        ]
      },
      "post": {
        "operationId": "CreateDMJob",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmCreateJobResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "sources": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "$ref": "#/definitions/dmSource"
                  }
                },
                "cluster_user": {
                  "type": "string"
                },
                "cluster_password": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "spec_id": {
                  "type": "string",
                  "format": "uint64"
                },
                "full_instance_migrate": {
                  "type": "boolean"
                },
                "precheck_id": {
                  "type": "string",
                  "format": "uint64"
                },
                "import_mode": {
                  "type": "string"
                }
              },
              "required": [
                "name",
                "sources",
                "cluster_user",
                "cluster_password",
                "mode",
                "full_instance_migrate",
                "import_mode"
              ]
            }
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/jobs/{id}": {
      "get": {
        "operationId": "GetDMJob",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmGetJobResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          }
        ],
        "tags": [
          "Service"
        ]
      },
      "delete": {
        "operationId": "DeleteDMJob",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "type": "object",
              "properties": {}
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          }
        ],
        "tags": [
          "Service"
        ]
      },
      "post": {
        "operationId": "UpdateDMJob",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "type": "object",
              "properties": {}
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                }
              }
            }
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/jobs/{id}/scale-up-down": {
      "post": {
        "operationId": "ScaleUpDownJob",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "type": "object",
              "properties": {}
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "properties": {
                "to_spec_id": {
                  "type": "string",
                  "format": "uint64"
                }
              },
              "required": [
                "to_spec_id"
              ]
            }
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/jobs/{id}/status": {
      "put": {
        "summary": "used to operate job status, i.e. pause/resume job",
        "operationId": "OperateDMJob",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "type": "object",
              "properties": {}
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "properties": {
                "op": {
                  "$ref": "#/definitions/dmOperateJobReqOperation",
                  "description": "todo: the output is like 'value must be in list [1 2]' on err, hard for user to understand, maybe change to string."
                }
              },
              "required": [
                "op"
              ]
            }
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/pre-check": {
      "post": {
        "summary": "re-use the param of CreateJob",
        "operationId": "PrecheckJob",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmCreateJobResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "sources": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "$ref": "#/definitions/dmSource"
                  }
                },
                "cluster_user": {
                  "type": "string"
                },
                "cluster_password": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "spec_id": {
                  "type": "string",
                  "format": "uint64"
                },
                "full_instance_migrate": {
                  "type": "boolean"
                },
                "precheck_id": {
                  "type": "string",
                  "format": "uint64"
                },
                "import_mode": {
                  "type": "string"
                }
              },
              "required": [
                "name",
                "sources",
                "cluster_user",
                "cluster_password",
                "mode",
                "full_instance_migrate",
                "import_mode"
              ]
            }
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/pre-check/{id}": {
      "get": {
        "operationId": "GetPrecheck",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmGetPrecheckJobResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          }
        ],
        "tags": [
          "Service"
        ]
      },
      "delete": {
        "operationId": "CancelDMPrecheck",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "type": "object",
              "properties": {}
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/quota": {
      "get": {
        "operationId": "GetDMQuota",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/dmGetQuotaResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          }
        ],
        "tags": [
          "Service"
        ]
      }
    },
    "/api/v1/orgs/{org_id}/projects/{project_id}/clusters/{cluster_id}/dataflow/dm/source-tables": {
      "post": {
        "operationId": "GetSourceTables",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/agentGetSourceTablesResp"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/googlerpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "org_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "project_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "cluster_id",
            "in": "path",
            "required": true,
            "type": "string",
            "format": "uint64"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "type": "object",
              "properties": {
                "conn_method": {
                  "type": "string"
                },
                "endpoint_service_name": {
                  "type": "string"
                },
                "host": {
                  "type": "string"
                },
                "port": {
                  "type": "integer",
                  "format": "int64"
                },
                "user": {
                  "type": "string"
                },
                "password": {
                  "type": "string"
                },
                "ssl_ca": {
                  "type": "string"
                },
                "ssl_cert": {
                  "type": "string"
                },
                "ssl_key": {
                  "type": "string"
                },
                "type": {
                  "type": "string",
                  "description": "right now we don't use this parameter, will use it when we support pg.\nwe put here to check in backend that user has set this parameter."
                }
              },
              "required": [
                "conn_method",
                "port",
                "user",
                "password",
                "type"
              ]
            }
          }
        ],
        "tags": [
          "Service"
        ]
      }
    }
  },
  "definitions": {
    "SubTaskStage": {
      "type": "string",
      "enum": [
        "Creating",
        "Running",
        "Pausing",
        "Paused",
        "Failed",
        "Finished",
        "Deleting",
        "Scaling",
        "Unknown"
      ],
      "default": "Creating",
      "title": "Stage, combined by df status and dm job status, display for users\n* Creating: df is creating\n* Running: df is created and dm is init/running\n* Pausing: df is created and dm is pausing\n* Paused: df is created and dm is paused\n* Failed:\n  * df is created but dm is Error\n  * df is unrecoverable\n* Finished: df is finished\n* Deleting: df is deleting"
    },
    "SubTaskStep": {
      "type": "string",
      "enum": [
        "Unsupported",
        "Schema",
        "Dump",
        "Load",
        "Sync"
      ],
      "default": "Unsupported",
      "title": "- Schema: schema is unsupported separately now\n - Dump: Dump and Load belong to full mode\n - Sync: Sync belongs to incremental mode"
    },
    "agentColumnValue": {
      "type": "object",
      "properties": {
        "string_value": {
          "type": "string"
        },
        "int64_value": {
          "type": "string",
          "format": "int64"
        },
        "double_value": {
          "type": "number",
          "format": "double"
        },
        "bool_value": {
          "type": "boolean"
        },
        "timestamp_value": {
          "type": "string",
          "format": "date-time",
          "title": "for datetime, timestamp, date"
        }
      }
    },
    "agentGetSourceTablesResp": {
      "type": "object",
      "properties": {
        "schemas": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/agentSchema"
          }
        }
      }
    },
    "agentRow": {
      "type": "object",
      "properties": {
        "column_values": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "typed_column_values": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/agentColumnValue"
          }
        }
      }
    },
    "agentSchema": {
      "type": "object",
      "properties": {
        "schema_name": {
          "type": "string"
        },
        "tables": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/agentTable"
          }
        }
      }
    },
    "agentTable": {
      "type": "object",
      "properties": {
        "schema_name": {
          "type": "string"
        },
        "table_name": {
          "type": "string"
        },
        "row_headers": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "row_values": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/agentRow"
          }
        },
        "row_data_types": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "column_is_pk": {
          "type": "array",
          "items": {
            "type": "boolean"
          }
        },
        "column_auto_gen": {
          "type": "array",
          "items": {
            "type": "boolean"
          },
          "title": "column_auto_gen represents column is auto_increment or auto_random"
        }
      }
    },
    "commonRegion": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "title": "e.g. us-west-2"
        },
        "display_name": {
          "type": "string",
          "title": "e.g. Oregon (us-west-2)"
        }
      }
    },
    "commonTable": {
      "type": "object",
      "properties": {
        "schema": {
          "type": "string",
          "example": "database_name",
          "description": "The name of the database containing the target table."
        },
        "table": {
          "type": "string",
          "example": "table_name",
          "description": "The name of the table within the database."
        }
      }
    },
    "dataflowConnProfile": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uint64"
        },
        "name": {
          "type": "string"
        },
        "type": {
          "type": "string"
        },
        "version": {
          "type": "string"
        },
        "region": {
          "type": "string"
        },
        "host": {
          "type": "string"
        },
        "port": {
          "type": "integer",
          "format": "int64"
        },
        "user": {
          "type": "string"
        },
        "conn_method": {
          "type": "string"
        },
        "endpoint_service_name": {
          "type": "string"
        },
        "password": {
          "type": "string"
        },
        "ssl_ca": {
          "type": "string"
        },
        "ssl_cert": {
          "type": "string"
        },
        "ssl_key": {
          "type": "string"
        }
      }
    },
    "dmBlockAllowRules": {
      "type": "object",
      "properties": {
        "do_dbs": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "ignore_dbs": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "do_tables": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/commonTable"
          }
        },
        "ignore_tables": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/commonTable"
          }
        }
      }
    },
    "dmConnMethod": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "title": "e.g. direct"
        },
        "display_name": {
          "type": "string",
          "title": "e.g. Public IP"
        }
      }
    },
    "dmCreateJobResp": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uint64"
        }
      }
    },
    "dmDumpDetail": {
      "type": "object",
      "properties": {
        "bps": {
          "type": "string",
          "format": "int64"
        },
        "duration": {
          "type": "string",
          "format": "int64",
          "title": "unit is second"
        },
        "progress": {
          "type": "number",
          "format": "double",
          "title": "0 ~ 100"
        },
        "total_tables": {
          "type": "string",
          "format": "int64"
        },
        "completed_tables": {
          "type": "string",
          "format": "int64"
        },
        "finished_bytes": {
          "type": "string",
          "format": "int64"
        },
        "finished_rows": {
          "type": "string",
          "format": "int64"
        }
      }
    },
    "dmGetCostResp": {
      "type": "object",
      "properties": {
        "node_cost": {
          "type": "number",
          "format": "double"
        },
        "private_link_cost": {
          "type": "number",
          "format": "double"
        }
      }
    },
    "dmGetJobResp": {
      "type": "object",
      "properties": {
        "job": {
          "$ref": "#/definitions/dmJob"
        }
      }
    },
    "dmGetPrecheckJobResp": {
      "type": "object",
      "properties": {
        "total": {
          "type": "integer",
          "format": "int32"
        },
        "failed_cnt": {
          "type": "integer",
          "format": "int32"
        },
        "warn_cnt": {
          "type": "integer",
          "format": "int32"
        },
        "success_cnt": {
          "type": "integer",
          "format": "int32"
        },
        "status": {
          "type": "string"
        },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/dmPrecheckItem"
          }
        }
      }
    },
    "dmGetQuotaResp": {
      "type": "object",
      "properties": {
        "quota": {
          "type": "integer",
          "format": "int32"
        },
        "usage": {
          "type": "integer",
          "format": "int32"
        }
      }
    },
    "dmGetSupportedSourcesResp": {
      "type": "object",
      "properties": {
        "sources": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/dmSupportedSource"
          }
        }
      }
    },
    "dmJob": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uint64"
        },
        "name": {
          "type": "string"
        },
        "region": {
          "type": "string",
          "title": "dm's region is same as cluster's now"
        },
        "sub_tasks": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/dmSubTask"
          }
        },
        "spec": {
          "$ref": "#/definitions/dmJobSpec"
        },
        "cluster_user": {
          "type": "string"
        },
        "create_time": {
          "type": "string"
        },
        "mode": {
          "type": "string"
        },
        "modification": {
          "$ref": "#/definitions/dmJobModification"
        },
        "import_mode": {
          "type": "string"
        }
      }
    },
    "dmJobModification": {
      "type": "object",
      "properties": {
        "from_rcu": {
          "type": "string",
          "format": "uint64"
        },
        "to_rcu": {
          "type": "string",
          "format": "uint64"
        }
      }
    },
    "dmJobSpec": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uint64"
        },
        "display_name": {
          "type": "string"
        },
        "capacity_unit": {
          "type": "number",
          "format": "double"
        },
        "max_full_phase_speed": {
          "type": "string",
          "format": "int64",
          "title": "in unit MB/s"
        },
        "max_incr_phase_speed": {
          "type": "string",
          "format": "int64",
          "title": "in unit rows/s"
        }
      }
    },
    "dmListJobSpecsResp": {
      "type": "object",
      "properties": {
        "specs": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/dmJobSpec"
          }
        }
      }
    },
    "dmListJobsResp": {
      "type": "object",
      "properties": {
        "jobs": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/dmJob"
          }
        },
        "total": {
          "type": "string",
          "format": "uint64"
        }
      }
    },
    "dmListPrechecksResp": {
      "type": "object",
      "properties": {
        "prechecks": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/dmPrecheckSummary"
          }
        },
        "total": {
          "type": "string",
          "format": "uint64"
        }
      }
    },
    "dmLoadDetail": {
      "type": "object",
      "properties": {
        "bps": {
          "type": "string",
          "format": "int64"
        },
        "duration": {
          "type": "string",
          "format": "int64",
          "title": "unit is second"
        },
        "progress": {
          "type": "number",
          "format": "double",
          "title": "0 ~ 100"
        },
        "finished_bytes": {
          "type": "string",
          "format": "int64"
        },
        "total_bytes": {
          "type": "string",
          "format": "int64"
        }
      }
    },
    "dmOperateJobReqOperation": {
      "type": "string",
      "enum": [
        "Unknown",
        "Pause",
        "Resume"
      ],
      "default": "Unknown"
    },
    "dmPrecheckItem": {
      "type": "object",
      "properties": {
        "desc": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "solution": {
          "type": "string"
        },
        "reason": {
          "type": "string"
        },
        "solution_doc_url": {
          "type": "string"
        },
        "type": {
          "$ref": "#/definitions/dmPrecheckItemType"
        }
      }
    },
    "dmPrecheckItemType": {
      "type": "string",
      "enum": [
        "DumpPrivilegeChecking",
        "ReplicationPrivilegeChecking",
        "VersionChecking",
        "ServerIDChecking",
        "BinlogEnableChecking",
        "BinlogFormatChecking",
        "BinlogRowImageChecking",
        "TableSchemaChecking",
        "BinlogDBChecking",
        "ConnNumberChecking",
        "TargetDBPrivilegeChecking",
        "MetaPositionChecking",
        "LightningTableEmptyChecking"
      ],
      "default": "DumpPrivilegeChecking"
    },
    "dmPrecheckSummary": {
      "type": "object",
      "properties": {
        "precheck_id": {
          "type": "string",
          "format": "uint64"
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        },
        "status": {
          "type": "string",
          "title": "running|finished|failed|canceled|pending"
        },
        "total": {
          "type": "integer",
          "format": "int32"
        },
        "failed_cnt": {
          "type": "integer",
          "format": "int32"
        },
        "warn_cnt": {
          "type": "integer",
          "format": "int32"
        },
        "success_cnt": {
          "type": "integer",
          "format": "int32"
        },
        "full_instance_migrate": {
          "type": "boolean"
        }
      }
    },
    "dmProcessError": {
      "type": "object",
      "properties": {
        "err_code": {
          "type": "integer",
          "format": "int32"
        },
        "message": {
          "type": "string"
        },
        "workaround": {
          "type": "string"
        }
      }
    },
    "dmRouteRule": {
      "type": "object",
      "properties": {
        "schema_pattern": {
          "type": "string"
        },
        "table_pattern": {
          "type": "string"
        },
        "target_schema": {
          "type": "string"
        },
        "target_table": {
          "type": "string"
        }
      }
    },
    "dmSource": {
      "type": "object",
      "properties": {
        "conn_profile_id": {
          "type": "string",
          "format": "uint64"
        },
        "conn_profile": {
          "$ref": "#/definitions/dataflowConnProfile"
        },
        "route_rules": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/dmRouteRule"
          }
        },
        "ba_rules": {
          "$ref": "#/definitions/dmBlockAllowRules"
        },
        "binlog_name": {
          "type": "string"
        },
        "binlog_pos": {
          "type": "integer",
          "format": "int64"
        },
        "binlog_gtid": {
          "type": "string"
        }
      }
    },
    "dmSubTask": {
      "type": "object",
      "properties": {
        "source": {
          "$ref": "#/definitions/dmSource"
        },
        "current_step": {
          "$ref": "#/definitions/SubTaskStep"
        },
        "stage": {
          "$ref": "#/definitions/SubTaskStage"
        },
        "dump_detail": {
          "$ref": "#/definitions/dmDumpDetail",
          "title": "optional SchemaDetail schema_detail = 10;"
        },
        "load_detail": {
          "$ref": "#/definitions/dmLoadDetail"
        },
        "sync_detail": {
          "$ref": "#/definitions/dmSyncDetail"
        },
        "process_error": {
          "$ref": "#/definitions/dmProcessError"
        }
      }
    },
    "dmSupportedSource": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "title": "e.g. aws-rds-mysql"
        },
        "display_name": {
          "type": "string",
          "title": "e.g. AWS RDS MySQL"
        },
        "regions": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/commonRegion"
          }
        },
        "conn_methods": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/dmConnMethod"
          }
        }
      }
    },
    "dmSyncDetail": {
      "type": "object",
      "properties": {
        "rps": {
          "type": "string",
          "format": "int64",
          "title": "xx row/s"
        },
        "duration": {
          "type": "string",
          "format": "int64",
          "title": "unit is second"
        },
        "latency": {
          "type": "string",
          "format": "int64"
        },
        "checkpoint": {
          "type": "string"
        }
      }
    },
    "googlerpcStatus": {
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "format": "int32"
        },
        "message": {
          "type": "string"
        },
        "details": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/protobufAny"
          }
        }
      }
    },
    "protobufAny": {
      "type": "object",
      "properties": {
        "@type": {
          "type": "string",
          "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n  URL, or have them precompiled into a binary to avoid any\n  lookup. Therefore, binary compatibility needs to be preserved\n  on changes to types. (Use versioned type names to manage\n  breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics."
        }
      },
      "additionalProperties": {},
      "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n    Foo foo = ...;\n    Any any;\n    any.PackFrom(foo);\n    ...\n    if (any.UnpackTo(\u0026foo)) {\n      ...\n    }\n\nExample 2: Pack and unpack a message in Java.\n\n    Foo foo = ...;\n    Any any = Any.pack(foo);\n    ...\n    if (any.is(Foo.class)) {\n      foo = any.unpack(Foo.class);\n    }\n\nExample 3: Pack and unpack a message in Python.\n\n    foo = Foo(...)\n    any = Any()\n    any.Pack(foo)\n    ...\n    if any.Is(Foo.DESCRIPTOR):\n      any.Unpack(foo)\n      ...\n\nExample 4: Pack and unpack a message in Go\n\n     foo := \u0026pb.Foo{...}\n     any, err := anypb.New(foo)\n     if err != nil {\n       ...\n     }\n     ...\n     foo := \u0026pb.Foo{}\n     if err := any.UnmarshalTo(foo); err != nil {\n       ...\n     }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n    package google.profile;\n    message Person {\n      string first_name = 1;\n      string last_name = 2;\n    }\n\n    {\n      \"@type\": \"type.googleapis.com/google.profile.Person\",\n      \"firstName\": \u003cstring\u003e,\n      \"lastName\": \u003cstring\u003e\n    }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n    {\n      \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n      \"value\": \"1.212s\"\n    }"
    }
  },
  "securityDefinitions": {
    "bearer": {
      "type": "apiKey",
      "description": "Authentication token, prefixed by Bearer: Bearer \u003ctoken\u003e",
      "name": "Authorization",
      "in": "header"
    }
  },
  "security": [
    {
      "bearer": []
    }
  ],
  "externalDocs": {
    "description": "DBaaS Dataflow Service",
    "url": "https://github.com/tidbcloud/dataflow-service"
  }
}
