diff --git a/control_plane/src/bin/attachment_service.rs b/control_plane/src/bin/attachment_service.rs
index c40f59c43b..a98b3be99b 100644
--- a/control_plane/src/bin/attachment_service.rs
+++ b/control_plane/src/bin/attachment_service.rs
@@ -8,6 +8,7 @@ use anyhow::anyhow;
use clap::Parser;
use hyper::StatusCode;
use hyper::{Body, Request, Response};
+use pageserver_api::control_api::*;
use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
use std::{collections::HashMap, sync::Arc};
@@ -108,22 +109,6 @@ fn get_state(request: &Request
) -> &State {
.as_ref()
}
-#[derive(Serialize, Deserialize)]
-struct ReAttachRequest {
- node_id: NodeId,
-}
-
-#[derive(Serialize, Deserialize)]
-struct ReAttachResponseTenant {
- id: TenantId,
- generation: u32,
-}
-
-#[derive(Serialize, Deserialize)]
-struct ReAttachResponse {
- tenants: Vec,
-}
-
/// Pageserver calls into this on startup, to learn which tenants it should attach
async fn handle_re_attach(mut req: Request) -> Result, ApiError> {
let reattach_req = json_request::(&mut req).await?;
@@ -152,28 +137,6 @@ async fn handle_re_attach(mut req: Request) -> Result, ApiE
json_response(StatusCode::OK, response)
}
-#[derive(Serialize, Deserialize)]
-struct ValidateRequestTenant {
- id: TenantId,
- gen: u32,
-}
-
-#[derive(Serialize, Deserialize)]
-struct ValidateRequest {
- tenants: Vec,
-}
-
-#[derive(Serialize, Deserialize)]
-struct ValidateResponse {
- tenants: Vec,
-}
-
-#[derive(Serialize, Deserialize)]
-struct ValidateResponseTenant {
- id: TenantId,
- valid: bool,
-}
-
/// Pageserver calls into this before doing deletions, to confirm that it still
/// holds the latest generation for the tenants with deletions enqueued
async fn handle_validate(mut req: Request) -> Result, ApiError> {
diff --git a/libs/pageserver_api/src/control_api.rs b/libs/pageserver_api/src/control_api.rs
new file mode 100644
index 0000000000..976ca0ee4a
--- /dev/null
+++ b/libs/pageserver_api/src/control_api.rs
@@ -0,0 +1,41 @@
+/// Types in this file are for pageserver's upward-facing API calls to the control plane
+use serde::{Deserialize, Serialize};
+use utils::id::{NodeId, TenantId};
+
+#[derive(Serialize, Deserialize)]
+struct ReAttachRequest {
+ node_id: NodeId,
+}
+
+#[derive(Serialize, Deserialize)]
+struct ReAttachResponseTenant {
+ id: TenantId,
+ generation: u32,
+}
+
+#[derive(Serialize, Deserialize)]
+struct ReAttachResponse {
+ tenants: Vec,
+}
+
+#[derive(Serialize, Deserialize)]
+struct ValidateRequestTenant {
+ id: TenantId,
+ gen: u32,
+}
+
+#[derive(Serialize, Deserialize)]
+struct ValidateRequest {
+ tenants: Vec,
+}
+
+#[derive(Serialize, Deserialize)]
+struct ValidateResponse {
+ tenants: Vec,
+}
+
+#[derive(Serialize, Deserialize)]
+struct ValidateResponseTenant {
+ id: TenantId,
+ valid: bool,
+}
diff --git a/libs/pageserver_api/src/lib.rs b/libs/pageserver_api/src/lib.rs
index 4890d54f36..d844021785 100644
--- a/libs/pageserver_api/src/lib.rs
+++ b/libs/pageserver_api/src/lib.rs
@@ -1,6 +1,7 @@
use const_format::formatcp;
/// Public API types
+pub mod control_api;
pub mod models;
pub mod reltag;