Update pageserver OpenAPI spec with missing attach/detach methods (#1463)

We have these methods for some time in the API, so mentioning them in the
spec could be useful for console (see zenithdb/console#867), as we generate
pageserver HTTP API golang client there.
This commit is contained in:
Alexey Kondratov
2022-04-05 20:01:57 +03:00
committed by GitHub
parent 2f784144fe
commit d0c246ac3c
3 changed files with 125 additions and 7 deletions

View File

@@ -18,7 +18,7 @@ paths:
schema:
type: object
required:
- id
- id
properties:
id:
type: integer
@@ -122,6 +122,110 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/tenant/{tenant_id}/timeline/{timeline_id}/attach:
parameters:
- name: tenant_id
in: path
required: true
schema:
type: string
format: hex
- name: timeline_id
in: path
required: true
schema:
type: string
format: hex
post:
description: Attach remote timeline
responses:
"200":
description: Timeline attaching scheduled
"400":
description: Error when no tenant id found in path or no timeline id
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: Unauthorized Error
content:
application/json:
schema:
$ref: "#/components/schemas/UnauthorizedError"
"403":
description: Forbidden Error
content:
application/json:
schema:
$ref: "#/components/schemas/ForbiddenError"
"404":
description: Timeline not found
content:
application/json:
schema:
$ref: "#/components/schemas/NotFoundError"
"409":
description: Timeline download is already in progress
content:
application/json:
schema:
$ref: "#/components/schemas/ConflictError"
"500":
description: Generic operation error
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/tenant/{tenant_id}/timeline/{timeline_id}/detach:
parameters:
- name: tenant_id
in: path
required: true
schema:
type: string
format: hex
- name: timeline_id
in: path
required: true
schema:
type: string
format: hex
post:
description: Detach local timeline
responses:
"200":
description: Timeline detached
"400":
description: Error when no tenant id found in path or no timeline id
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: Unauthorized Error
content:
application/json:
schema:
$ref: "#/components/schemas/UnauthorizedError"
"403":
description: Forbidden Error
content:
application/json:
schema:
$ref: "#/components/schemas/ForbiddenError"
"500":
description: Generic operation error
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/tenant/{tenant_id}/timeline/:
parameters:
- name: tenant_id
@@ -179,7 +283,7 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/AlreadyExistsError"
$ref: "#/components/schemas/ConflictError"
"500":
description: Generic operation error
content:
@@ -260,7 +364,7 @@ paths:
content:
application/json:
schema:
$ref: "#/components/schemas/AlreadyExistsError"
$ref: "#/components/schemas/ConflictError"
"500":
description: Generic operation error
content:
@@ -354,14 +458,21 @@ components:
properties:
msg:
type: string
AlreadyExistsError:
ForbiddenError:
type: object
required:
- msg
properties:
msg:
type: string
ForbiddenError:
NotFoundError:
type: object
required:
- msg
properties:
msg:
type: string
ConflictError:
type: object
required:
- msg

View File

@@ -220,6 +220,7 @@ async fn timeline_attach_handler(request: Request<Body>) -> Result<Response<Body
let span = tokio::task::spawn_blocking(move || {
let entered = span.entered();
if tenant_mgr::get_timeline_for_tenant_load(tenant_id, timeline_id).is_ok() {
// TODO: maybe answer with 309 Not Modified here?
anyhow::bail!("Timeline is already present locally")
};
Ok(entered.exit())
@@ -235,10 +236,10 @@ async fn timeline_attach_handler(request: Request<Body>) -> Result<Response<Body
tenant_id,
timeline_id,
})
.ok_or_else(|| ApiError::BadRequest("Unknown remote timeline".to_string()))?;
.ok_or_else(|| ApiError::NotFound("Unknown remote timeline".to_string()))?;
if index_entry.get_awaits_download() {
return Err(ApiError::NotFound(
return Err(ApiError::Conflict(
"Timeline download is already in progress".to_string(),
));
}

View File

@@ -17,6 +17,9 @@ pub enum ApiError {
#[error("NotFound: {0}")]
NotFound(String),
#[error("Conflict: {0}")]
Conflict(String),
#[error(transparent)]
InternalServerError(#[from] anyhow::Error),
}
@@ -42,6 +45,9 @@ impl ApiError {
ApiError::NotFound(_) => {
HttpErrorBody::response_from_msg_and_status(self.to_string(), StatusCode::NOT_FOUND)
}
ApiError::Conflict(_) => {
HttpErrorBody::response_from_msg_and_status(self.to_string(), StatusCode::CONFLICT)
}
ApiError::InternalServerError(err) => HttpErrorBody::response_from_msg_and_status(
err.to_string(),
StatusCode::INTERNAL_SERVER_ERROR,