feat(admin): add encrypted diagnostic archives (#5207)

This commit is contained in:
cxymds
2026-07-25 01:19:47 +08:00
committed by GitHub
parent 2b6cc0ee08
commit eaa17e0441
7 changed files with 1024 additions and 3 deletions
+1
View File
@@ -156,6 +156,7 @@ async_zip = { workspace = true, default-features = false, features = ["tokio", "
base64 = { workspace = true }
hmac = { workspace = true }
sha2 = { workspace = true }
rsa = { workspace = true, features = ["sha2"] }
base64-simd.workspace = true
clap = { workspace = true, features = ["derive", "env"] }
const-str = { workspace = true, features = ["std", "proc"] }
File diff suppressed because it is too large Load Diff
+1
View File
@@ -29,6 +29,7 @@ pub mod health;
pub(crate) mod iam_error;
pub mod idp_compat;
pub mod ilm_transition;
pub mod inspect_archive;
pub mod is_admin;
pub mod kms;
pub mod kms_dynamic;
+3
View File
@@ -637,6 +637,7 @@ pub struct RuntimeCapabilitiesSummary {
pub struct RuntimeCapabilitiesResponse {
pub summary: RuntimeCapabilitiesSummary,
pub diagnostic_probes: DiagnosticProbeCapabilities,
pub inspect_archive: super::inspect_archive::InspectArchiveCapability,
pub storage_classes: StorageClassCapabilities,
pub cluster_snapshot_path: String,
pub cluster_snapshot_summary: Option<CapabilityStatus>,
@@ -767,6 +768,7 @@ pub(crate) async fn build_runtime_capabilities_response()
let observability = observability_provider.observability_snapshot().await?;
let workload_admission = workload_admission_registry_snapshot();
let cluster_snapshot_discovery = cluster_snapshot::build_cluster_snapshot_discovery_response().await;
let local_drive_count = crate::storage::all_local_disk().await.len();
let (topology, topology_status) = if let Some(endpoint_pools) = current_endpoints_handle() {
let topology_provider = EndpointTopologySnapshotProvider::new(endpoint_pools);
@@ -785,6 +787,7 @@ pub(crate) async fn build_runtime_capabilities_response()
Ok(RuntimeCapabilitiesResponse {
summary,
diagnostic_probes: DiagnosticProbeCapabilities::current(),
inspect_archive: super::inspect_archive::InspectArchiveCapability::current(local_drive_count),
storage_classes: StorageClassCapabilities::current(),
cluster_snapshot_path: usecase.cluster_snapshot_route().to_string(),
cluster_snapshot_summary: cluster_snapshot_discovery.summary,
+4 -3
View File
@@ -34,9 +34,9 @@ mod route_registration_test;
use handlers::{
audit, batch_job, bucket_meta, cluster_snapshot, config_admin, diagnostics, durability as durability_handler, extensions,
heal, health, idp_compat, ilm_transition, kms, module_switch, object_data_cache, object_zip_download, oidc, plugins_catalog,
plugins_instances, pools, profile_admin, quota as quota_handler, rebalance, replication as replication_handler, scanner,
site_replication, sts, system, table_catalog, tier, tls_debug, user,
heal, health, idp_compat, ilm_transition, inspect_archive, kms, module_switch, object_data_cache, object_zip_download, oidc,
plugins_catalog, plugins_instances, pools, profile_admin, quota as quota_handler, rebalance,
replication as replication_handler, scanner, site_replication, sts, system, table_catalog, tier, tls_debug, user,
};
use router::{AdminOperation, S3Router};
use s3s::route::S3Route;
@@ -91,6 +91,7 @@ fn register_admin_routes(r: &mut S3Router<AdminOperation>) -> std::io::Result<()
site_replication::register_site_replication_route(r)?;
profile_admin::register_profiling_route(r)?;
diagnostics::register_diagnostics_route(r)?;
inspect_archive::register_inspect_archive_route(r)?;
tls_debug::register_tls_debug_route(r)?;
kms::register_kms_route(r)?;
oidc::register_oidc_route(r)?;
+7
View File
@@ -53,6 +53,7 @@ const HEAL: AdminActionRef = AdminActionRef::new("HealAdminAction");
const HEALTH_INFO: AdminActionRef = AdminActionRef::new("HealthInfoAdminAction");
const IMPORT_BUCKET_METADATA: AdminActionRef = AdminActionRef::new("ImportBucketMetadataAction");
const IMPORT_IAM: AdminActionRef = AdminActionRef::new("ImportIAMAction");
const INSPECT_DATA: AdminActionRef = AdminActionRef::new("InspectDataAction");
const KMS_CLEAR_CACHE: AdminActionRef = AdminActionRef::new("kms:ClearCache");
const KMS_CONFIGURE: AdminActionRef = AdminActionRef::new("kms:Configure");
const KMS_DELETE_KEY: AdminActionRef = AdminActionRef::new("kms:DeleteKey");
@@ -657,6 +658,7 @@ pub const ADMIN_ROUTE_POLICY_SPECS: &[AdminRouteSpec] = &[
HEALTH_INFO,
RouteRiskLevel::High,
),
admin(HttpMethod::Post, "/rustfs/admin/v4/inspect/archive", INSPECT_DATA, RouteRiskLevel::High),
// MinIO-compatible profiling / trace endpoints.
admin(HttpMethod::Post, "/rustfs/admin/v3/profiling/start", PROFILING, RouteRiskLevel::High),
admin(
@@ -1828,6 +1830,11 @@ mod tests {
assert_action(HttpMethod::Get, "/rustfs/admin/v3/metrics", GET_METRICS);
}
#[test]
fn route_policy_requires_dedicated_inspect_action_for_encrypted_archive() {
assert_action(HttpMethod::Post, "/rustfs/admin/v4/inspect/archive", INSPECT_DATA);
}
#[test]
fn route_policy_requires_operation_for_site_replication_diagnostics() {
for path in [
@@ -169,6 +169,7 @@ fn expected_admin_route_matrix() -> Vec<RouteMatrixEntry> {
admin_route(Method::GET, "/v3/info"),
admin_route(Method::GET, "/v3/inspect-data"),
admin_route(Method::POST, "/v3/inspect-data"),
admin_route(Method::POST, "/v4/inspect/archive"),
admin_route(Method::GET, "/v3/storageinfo"),
admin_route(Method::GET, "/v3/datausageinfo"),
admin_route(Method::GET, "/v3/metrics"),