mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-17 18:27:49 +00:00
23b17c2d5a
feat(madmin): add a SigV4-signed admin client for heal and scanner APIs The madmin crate held only wire types; automation and mc-style tooling had no way to drive the heal/scanner admin surface without hand-rolled HTTP. Add `AdminClient`, which signs with the same rustfs-signer path the server authenticates (UNSIGNED-PAYLOAD marker, matching RustFS peer admin calls) and wraps: - heal_start / heal_status / heal_stop over POST /rustfs/admin/v3/heal/ (bucket/prefix path params percent-encoded per segment; stop models the server's two cancel branches: token-scoped task status vs path-scoped start-success receipt); - background_heal_status, scanner_status (freshness typed), plus ilm_expiry_status / replacement_recovery_status passthroughs; - a public get_json escape hatch for endpoints not wrapped yet. Wire types follow the madmin-go model (SDK-owned mirrors pinned by round-trip tests): HealOpts with serde defaults so partial settings objects decode, HealScanMode accepting both the numeric and name encodings, and status structs that type the fields operators branch on while flattening unknown nested payloads verbatim so server additions cannot break the client. Errors map to a closed AdminClientError enum (InvalidEndpoint / Transport / HttpStatus with body / Decode). Tests cover wire round-trips, path building, both stop branches, error mapping, and — via a dependency-free raw-TCP test server — that signed requests carry a SigV4 Authorization header, the right method/path/ query, and the expected JSON body. Closes rustfs/backlog#1869 (first increment; single-sourcing the wire structs server-side and an embedded-server e2e roundtrip are noted as follow-ups there). Co-authored-by: heihutu <heihutu@gmail.com>
57 lines
1.9 KiB
TOML
57 lines
1.9 KiB
TOML
# Copyright 2024 RustFS Team
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
[package]
|
|
name = "rustfs-madmin"
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
rust-version.workspace = true
|
|
version.workspace = true
|
|
homepage.workspace = true
|
|
description = "Management and administration tools for RustFS, providing a web interface and API for system management."
|
|
keywords = ["management", "administration", "web-interface", "rustfs", "Minio"]
|
|
categories = ["web-programming", "development-tools", "config"]
|
|
documentation = "https://docs.rs/rustfs-madmin/latest/rustfs_madmin/"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[features]
|
|
default = []
|
|
hotpath = ["hotpath/hotpath"]
|
|
hotpath-alloc = ["hotpath", "hotpath/hotpath-alloc"]
|
|
hotpath-cpu = ["hotpath", "hotpath/hotpath-cpu"]
|
|
|
|
[dependencies]
|
|
hotpath.workspace = true
|
|
humantime.workspace = true
|
|
http.workspace = true
|
|
hyper = { workspace = true, features = ["http2", "http1", "server"] }
|
|
reqwest = { workspace = true, features = ["json"] }
|
|
rustfs-signer.workspace = true
|
|
s3s.workspace = true
|
|
jiff = { workspace = true, features = ["serde"] }
|
|
serde = { workspace = true, features = ["derive"] }
|
|
serde_json = { workspace = true, features = ["raw_value"] }
|
|
sysinfo.workspace = true
|
|
time = { workspace = true, features = ["parsing", "formatting", "macros", "serde"] }
|
|
|
|
[lib]
|
|
doctest = false
|
|
|
|
[dev-dependencies]
|
|
rmp-serde.workspace = true
|
|
tokio = { workspace = true, features = ["macros", "rt-multi-thread", "net"] }
|