mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-26 16:28:15 +00:00
feat(admin): add encrypted diagnostic archives (#5207)
This commit is contained in:
@@ -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
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
@@ -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"),
|
||||
|
||||
Reference in New Issue
Block a user