mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-24 13:16:28 +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 }
|
base64 = { workspace = true }
|
||||||
hmac = { workspace = true }
|
hmac = { workspace = true }
|
||||||
sha2 = { workspace = true }
|
sha2 = { workspace = true }
|
||||||
|
rsa = { workspace = true, features = ["sha2"] }
|
||||||
base64-simd.workspace = true
|
base64-simd.workspace = true
|
||||||
clap = { workspace = true, features = ["derive", "env"] }
|
clap = { workspace = true, features = ["derive", "env"] }
|
||||||
const-str = { workspace = true, features = ["std", "proc"] }
|
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(crate) mod iam_error;
|
||||||
pub mod idp_compat;
|
pub mod idp_compat;
|
||||||
pub mod ilm_transition;
|
pub mod ilm_transition;
|
||||||
|
pub mod inspect_archive;
|
||||||
pub mod is_admin;
|
pub mod is_admin;
|
||||||
pub mod kms;
|
pub mod kms;
|
||||||
pub mod kms_dynamic;
|
pub mod kms_dynamic;
|
||||||
|
|||||||
@@ -637,6 +637,7 @@ pub struct RuntimeCapabilitiesSummary {
|
|||||||
pub struct RuntimeCapabilitiesResponse {
|
pub struct RuntimeCapabilitiesResponse {
|
||||||
pub summary: RuntimeCapabilitiesSummary,
|
pub summary: RuntimeCapabilitiesSummary,
|
||||||
pub diagnostic_probes: DiagnosticProbeCapabilities,
|
pub diagnostic_probes: DiagnosticProbeCapabilities,
|
||||||
|
pub inspect_archive: super::inspect_archive::InspectArchiveCapability,
|
||||||
pub storage_classes: StorageClassCapabilities,
|
pub storage_classes: StorageClassCapabilities,
|
||||||
pub cluster_snapshot_path: String,
|
pub cluster_snapshot_path: String,
|
||||||
pub cluster_snapshot_summary: Option<CapabilityStatus>,
|
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 observability = observability_provider.observability_snapshot().await?;
|
||||||
let workload_admission = workload_admission_registry_snapshot();
|
let workload_admission = workload_admission_registry_snapshot();
|
||||||
let cluster_snapshot_discovery = cluster_snapshot::build_cluster_snapshot_discovery_response().await;
|
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, topology_status) = if let Some(endpoint_pools) = current_endpoints_handle() {
|
||||||
let topology_provider = EndpointTopologySnapshotProvider::new(endpoint_pools);
|
let topology_provider = EndpointTopologySnapshotProvider::new(endpoint_pools);
|
||||||
@@ -785,6 +787,7 @@ pub(crate) async fn build_runtime_capabilities_response()
|
|||||||
Ok(RuntimeCapabilitiesResponse {
|
Ok(RuntimeCapabilitiesResponse {
|
||||||
summary,
|
summary,
|
||||||
diagnostic_probes: DiagnosticProbeCapabilities::current(),
|
diagnostic_probes: DiagnosticProbeCapabilities::current(),
|
||||||
|
inspect_archive: super::inspect_archive::InspectArchiveCapability::current(local_drive_count),
|
||||||
storage_classes: StorageClassCapabilities::current(),
|
storage_classes: StorageClassCapabilities::current(),
|
||||||
cluster_snapshot_path: usecase.cluster_snapshot_route().to_string(),
|
cluster_snapshot_path: usecase.cluster_snapshot_route().to_string(),
|
||||||
cluster_snapshot_summary: cluster_snapshot_discovery.summary,
|
cluster_snapshot_summary: cluster_snapshot_discovery.summary,
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ mod route_registration_test;
|
|||||||
|
|
||||||
use handlers::{
|
use handlers::{
|
||||||
audit, batch_job, bucket_meta, cluster_snapshot, config_admin, diagnostics, durability as durability_handler, extensions,
|
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,
|
heal, health, idp_compat, ilm_transition, inspect_archive, kms, module_switch, object_data_cache, object_zip_download, oidc,
|
||||||
plugins_instances, pools, profile_admin, quota as quota_handler, rebalance, replication as replication_handler, scanner,
|
plugins_catalog, plugins_instances, pools, profile_admin, quota as quota_handler, rebalance,
|
||||||
site_replication, sts, system, table_catalog, tier, tls_debug, user,
|
replication as replication_handler, scanner, site_replication, sts, system, table_catalog, tier, tls_debug, user,
|
||||||
};
|
};
|
||||||
use router::{AdminOperation, S3Router};
|
use router::{AdminOperation, S3Router};
|
||||||
use s3s::route::S3Route;
|
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)?;
|
site_replication::register_site_replication_route(r)?;
|
||||||
profile_admin::register_profiling_route(r)?;
|
profile_admin::register_profiling_route(r)?;
|
||||||
diagnostics::register_diagnostics_route(r)?;
|
diagnostics::register_diagnostics_route(r)?;
|
||||||
|
inspect_archive::register_inspect_archive_route(r)?;
|
||||||
tls_debug::register_tls_debug_route(r)?;
|
tls_debug::register_tls_debug_route(r)?;
|
||||||
kms::register_kms_route(r)?;
|
kms::register_kms_route(r)?;
|
||||||
oidc::register_oidc_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 HEALTH_INFO: AdminActionRef = AdminActionRef::new("HealthInfoAdminAction");
|
||||||
const IMPORT_BUCKET_METADATA: AdminActionRef = AdminActionRef::new("ImportBucketMetadataAction");
|
const IMPORT_BUCKET_METADATA: AdminActionRef = AdminActionRef::new("ImportBucketMetadataAction");
|
||||||
const IMPORT_IAM: AdminActionRef = AdminActionRef::new("ImportIAMAction");
|
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_CLEAR_CACHE: AdminActionRef = AdminActionRef::new("kms:ClearCache");
|
||||||
const KMS_CONFIGURE: AdminActionRef = AdminActionRef::new("kms:Configure");
|
const KMS_CONFIGURE: AdminActionRef = AdminActionRef::new("kms:Configure");
|
||||||
const KMS_DELETE_KEY: AdminActionRef = AdminActionRef::new("kms:DeleteKey");
|
const KMS_DELETE_KEY: AdminActionRef = AdminActionRef::new("kms:DeleteKey");
|
||||||
@@ -657,6 +658,7 @@ pub const ADMIN_ROUTE_POLICY_SPECS: &[AdminRouteSpec] = &[
|
|||||||
HEALTH_INFO,
|
HEALTH_INFO,
|
||||||
RouteRiskLevel::High,
|
RouteRiskLevel::High,
|
||||||
),
|
),
|
||||||
|
admin(HttpMethod::Post, "/rustfs/admin/v4/inspect/archive", INSPECT_DATA, RouteRiskLevel::High),
|
||||||
// MinIO-compatible profiling / trace endpoints.
|
// MinIO-compatible profiling / trace endpoints.
|
||||||
admin(HttpMethod::Post, "/rustfs/admin/v3/profiling/start", PROFILING, RouteRiskLevel::High),
|
admin(HttpMethod::Post, "/rustfs/admin/v3/profiling/start", PROFILING, RouteRiskLevel::High),
|
||||||
admin(
|
admin(
|
||||||
@@ -1828,6 +1830,11 @@ mod tests {
|
|||||||
assert_action(HttpMethod::Get, "/rustfs/admin/v3/metrics", GET_METRICS);
|
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]
|
#[test]
|
||||||
fn route_policy_requires_operation_for_site_replication_diagnostics() {
|
fn route_policy_requires_operation_for_site_replication_diagnostics() {
|
||||||
for path in [
|
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/info"),
|
||||||
admin_route(Method::GET, "/v3/inspect-data"),
|
admin_route(Method::GET, "/v3/inspect-data"),
|
||||||
admin_route(Method::POST, "/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/storageinfo"),
|
||||||
admin_route(Method::GET, "/v3/datausageinfo"),
|
admin_route(Method::GET, "/v3/datausageinfo"),
|
||||||
admin_route(Method::GET, "/v3/metrics"),
|
admin_route(Method::GET, "/v3/metrics"),
|
||||||
|
|||||||
Reference in New Issue
Block a user