aboutsummaryrefslogtreecommitdiff
path: root/src/garage/admin
diff options
context:
space:
mode:
Diffstat (limited to 'src/garage/admin')
-rw-r--r--src/garage/admin/mod.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/garage/admin/mod.rs b/src/garage/admin/mod.rs
index e2468143..4c460b8d 100644
--- a/src/garage/admin/mod.rs
+++ b/src/garage/admin/mod.rs
@@ -30,6 +30,10 @@ use garage_model::key_table::*;
use garage_model::s3::mpu_table::MultipartUpload;
use garage_model::s3::version_table::Version;
+use garage_api::admin::api::{AdminApiRequest, TaggedAdminApiResponse};
+use garage_api::admin::EndpointHandler as AdminApiEndpoint;
+use garage_api::generic_server::ApiError;
+
use crate::cli::*;
use crate::repair::online::launch_online_repair;
@@ -70,6 +74,15 @@ pub enum AdminRpc {
versions: Vec<Result<Version, Uuid>>,
uploads: Vec<MultipartUpload>,
},
+
+ // Proxying HTTP Admin API endpoints
+ ApiRequest(AdminApiRequest),
+ ApiOkResponse(TaggedAdminApiResponse),
+ ApiErrorResponse {
+ http_code: u16,
+ error_code: String,
+ message: String,
+ },
}
impl Rpc for AdminRpc {
@@ -503,6 +516,24 @@ impl AdminRpcHandler {
}
}
}
+
+ // ================== PROXYING ADMIN API REQUESTS ===================
+
+ async fn handle_api_request(
+ self: &Arc<Self>,
+ req: &AdminApiRequest,
+ ) -> Result<AdminRpc, Error> {
+ let req = req.clone();
+ let res = req.handle(&self.garage).await;
+ match res {
+ Ok(res) => Ok(AdminRpc::ApiOkResponse(res.tagged())),
+ Err(e) => Ok(AdminRpc::ApiErrorResponse {
+ http_code: e.http_status_code().as_u16(),
+ error_code: e.code().to_string(),
+ message: e.to_string(),
+ }),
+ }
+ }
}
#[async_trait]
@@ -520,6 +551,7 @@ impl EndpointHandler<AdminRpc> for AdminRpcHandler {
AdminRpc::Worker(wo) => self.handle_worker_cmd(wo).await,
AdminRpc::BlockOperation(bo) => self.handle_block_cmd(bo).await,
AdminRpc::MetaOperation(mo) => self.handle_meta_cmd(mo).await,
+ AdminRpc::ApiRequest(r) => self.handle_api_request(r).await,
m => Err(GarageError::unexpected_rpc_message(m).into()),
}
}