aboutsummaryrefslogtreecommitdiff
path: root/src/garage/admin/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/garage/admin/mod.rs')
-rw-r--r--src/garage/admin/mod.rs47
1 files changed, 33 insertions, 14 deletions
diff --git a/src/garage/admin/mod.rs b/src/garage/admin/mod.rs
index e2468143..1888a208 100644
--- a/src/garage/admin/mod.rs
+++ b/src/garage/admin/mod.rs
@@ -1,6 +1,5 @@
mod block;
mod bucket;
-mod key;
use std::collections::HashMap;
use std::fmt::Write;
@@ -23,13 +22,15 @@ use garage_rpc::*;
use garage_block::manager::BlockResyncErrorInfo;
-use garage_model::bucket_table::*;
use garage_model::garage::Garage;
use garage_model::helper::error::{Error, OkOrBadRequest};
-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;
@@ -39,7 +40,6 @@ pub const ADMIN_RPC_PATH: &str = "garage/admin_rpc.rs/Rpc";
#[allow(clippy::large_enum_variant)]
pub enum AdminRpc {
BucketOperation(BucketOperation),
- KeyOperation(KeyOperation),
LaunchRepair(RepairOpt),
Stats(StatsOpt),
Worker(WorkerOperation),
@@ -48,15 +48,6 @@ pub enum AdminRpc {
// Replies
Ok(String),
- BucketList(Vec<Bucket>),
- BucketInfo {
- bucket: Bucket,
- relevant_keys: HashMap<String, Key>,
- counters: HashMap<String, i64>,
- mpu_counters: HashMap<String, i64>,
- },
- KeyList(Vec<(String, String)>),
- KeyInfo(Key, HashMap<Uuid, Bucket>),
WorkerList(
HashMap<usize, garage_util::background::WorkerInfo>,
WorkerListOpt,
@@ -70,6 +61,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 +503,25 @@ impl AdminRpcHandler {
}
}
}
+
+ // ================== PROXYING ADMIN API REQUESTS ===================
+
+ async fn handle_api_request(
+ self: &Arc<Self>,
+ req: &AdminApiRequest,
+ ) -> Result<AdminRpc, Error> {
+ let req = req.clone();
+ info!("Proxied admin API request: {}", req.name());
+ 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]
@@ -514,12 +533,12 @@ impl EndpointHandler<AdminRpc> for AdminRpcHandler {
) -> Result<AdminRpc, Error> {
match message {
AdminRpc::BucketOperation(bo) => self.handle_bucket_cmd(bo).await,
- AdminRpc::KeyOperation(ko) => self.handle_key_cmd(ko).await,
AdminRpc::LaunchRepair(opt) => self.handle_launch_repair(opt.clone()).await,
AdminRpc::Stats(opt) => self.handle_stats(opt.clone()).await,
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()),
}
}