diff options
author | Alex Auvolat <lx@deuxfleurs.fr> | 2025-01-30 10:44:08 +0100 |
---|---|---|
committer | Alex Auvolat <lx@deuxfleurs.fr> | 2025-01-30 10:44:08 +0100 |
commit | 145130481eac30793c6c08caa4d208ddddfc30e8 (patch) | |
tree | 7f29aaa6f8016f8cd1ea5220e51ece43bebf6d15 /src/garage/admin | |
parent | 6ed78abb5cd09f4e5ca5effe5d6137faf33133f8 (diff) | |
download | garage-145130481eac30793c6c08caa4d208ddddfc30e8.tar.gz garage-145130481eac30793c6c08caa4d208ddddfc30e8.zip |
wip: proxy admin api requests through admin rpc, prepare new cli
Diffstat (limited to 'src/garage/admin')
-rw-r--r-- | src/garage/admin/mod.rs | 32 |
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()), } } |