diff --git a/.agents/skills/arch-checks/SKILL.md b/.agents/skills/arch-checks/SKILL.md index d355a4fbd..a95347830 100644 --- a/.agents/skills/arch-checks/SKILL.md +++ b/.agents/skills/arch-checks/SKILL.md @@ -10,10 +10,16 @@ never weaken a check to get green. ## `check_layer_dependencies.sh` — layer DAG in `rustfs/src` -Enforces `interface (admin, storage/ecfs, storage/s3_api) → app → infra`; no -upward imports. Known legacy violations live in +Enforces `composition (server, startup/init) → interface (admin, +storage/ecfs, storage/s3_api) → app → infra`; no upward imports. Server source +files are composition roots, while imports of their exported HTTP contracts +are classified as interface dependencies. Known legacy violations live in `scripts/layer-dependency-baseline.txt`. +Dedicated `*_test.rs` and `tests/` modules are outside this production guard. +Inline `#[cfg(test)]` imports remain checked under their source file's layer; +move architecture-crossing test scaffolding into a dedicated test module. + - **New violation**: restructure your change so the dependency points downward (move the shared type/function to the lower layer). - **You legitimately removed a baseline entry**: run diff --git a/Cargo.lock b/Cargo.lock index ea2d82ace..dd420db90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -642,9 +642,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" +checksum = "3976abdc8fe7d1133d43d304afd42abdf5bc3e1319d263d223bde07b5efc4be8" dependencies = [ "compression-codecs", "compression-core", @@ -870,7 +870,7 @@ dependencies = [ "bytes", "fastrand", "hex", - "http 1.4.2", + "http 1.5.0", "sha1 0.10.7", "time", "tokio", @@ -934,7 +934,7 @@ dependencies = [ "bytes-utils", "fastrand", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "http-body 0.4.6", "http-body 1.1.0", "percent-encoding", @@ -970,7 +970,7 @@ dependencies = [ "hex", "hmac 0.13.0", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "lru 0.16.4", "percent-encoding", @@ -1001,7 +1001,7 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "regex-lite", "tracing", ] @@ -1027,7 +1027,7 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "regex-lite", "tracing", ] @@ -1054,7 +1054,7 @@ dependencies = [ "aws-types", "fastrand", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "regex-lite", "tracing", ] @@ -1076,7 +1076,7 @@ dependencies = [ "hex", "hmac 0.13.0", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "p256 0.13.2", "percent-encoding", "sha2 0.11.0", @@ -1108,7 +1108,7 @@ dependencies = [ "bytes", "crc-fast", "hex", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "md-5 0.11.0", @@ -1142,7 +1142,7 @@ dependencies = [ "bytes-utils", "futures-core", "futures-util", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "percent-encoding", @@ -1161,7 +1161,7 @@ dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", "h2", - "http 1.4.2", + "http 1.5.0", "hyper", "hyper-rustls", "hyper-util", @@ -1224,7 +1224,7 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "http-body 0.4.6", "http-body 1.1.0", "http-body-util", @@ -1245,7 +1245,7 @@ dependencies = [ "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "pin-project-lite", "tokio", "tracing", @@ -1271,7 +1271,7 @@ checksum = "7d56e0a4e53127a632224e43633b0fe045fa9e1e3cfc68b9830f1115e103f910" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", - "http 1.4.2", + "http 1.5.0", ] [[package]] @@ -1285,7 +1285,7 @@ dependencies = [ "bytes-utils", "futures-core", "http 0.2.12", - "http 1.4.2", + "http 1.5.0", "http-body 0.4.6", "http-body 1.1.0", "http-body-util", @@ -1337,7 +1337,7 @@ dependencies = [ "bytes", "form_urlencoded", "futures-util", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "hyper", @@ -1368,7 +1368,7 @@ checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "mime", @@ -3229,7 +3229,7 @@ dependencies = [ "futures-util", "headers", "htmlescape", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "libc", @@ -3654,7 +3654,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "e2e_test" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "anyhow", "astral-tokio-tar", @@ -3672,7 +3672,7 @@ dependencies = [ "flate2", "futures", "hex", - "http 1.4.2", + "http 1.5.0", "http-body-util", "hyper", "hyper-util", @@ -4384,7 +4384,7 @@ dependencies = [ "google-cloud-gax", "hex", "hmac 0.13.0", - "http 1.4.2", + "http 1.5.0", "jsonwebtoken 10.4.0", "reqwest", "rustc_version", @@ -4409,7 +4409,7 @@ dependencies = [ "futures", "google-cloud-rpc", "google-cloud-wkt", - "http 1.4.2", + "http 1.5.0", "pin-project", "rand 0.10.2", "serde", @@ -4431,7 +4431,7 @@ dependencies = [ "google-cloud-rpc", "google-cloud-wkt", "h2", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "hyper", @@ -4544,7 +4544,7 @@ dependencies = [ "google-cloud-type", "google-cloud-wkt", "hex", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "md5", "percent-encoding", @@ -4624,7 +4624,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.4.2", + "http 1.5.0", "indexmap 2.14.0", "slab", "tokio", @@ -4727,7 +4727,7 @@ dependencies = [ "base64 0.22.1", "bytes", "headers-core", - "http 1.4.2", + "http 1.5.0", "httpdate", "mime", "sha1 0.10.7", @@ -4739,7 +4739,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.4.2", + "http 1.5.0", ] [[package]] @@ -4961,9 +4961,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -4987,7 +4987,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.4.2", + "http 1.5.0", ] [[package]] @@ -4998,7 +4998,7 @@ checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "pin-project-lite", ] @@ -5044,7 +5044,7 @@ dependencies = [ "futures-channel", "futures-core", "h2", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "httparse", "httpdate", @@ -5061,7 +5061,7 @@ version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.4.2", + "http 1.5.0", "hyper", "hyper-util", "log", @@ -5095,7 +5095,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "hyper", "ipnet", @@ -6704,10 +6704,10 @@ version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" dependencies = [ - "base64 0.22.1", + "base64 0.21.7", "chrono", "getrandom 0.2.17", - "http 1.4.2", + "http 1.5.0", "rand 0.8.7", "serde", "serde_json", @@ -6815,7 +6815,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http 1.4.2", + "http 1.5.0", "humantime", "itertools 0.14.0", "parking_lot", @@ -6871,7 +6871,7 @@ dependencies = [ "dyn-clone", "ed25519-dalek 2.2.0", "hmac 0.12.1", - "http 1.4.2", + "http 1.5.0", "itertools 0.10.5", "log", "oauth2", @@ -6932,7 +6932,7 @@ checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" dependencies = [ "async-trait", "bytes", - "http 1.4.2", + "http 1.5.0", "opentelemetry", "reqwest", ] @@ -6944,7 +6944,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" dependencies = [ "flate2", - "http 1.4.2", + "http 1.5.0", "opentelemetry", "opentelemetry-http", "opentelemetry-proto", @@ -7820,7 +7820,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ "heck", - "itertools 0.14.0", + "itertools 0.10.5", "log", "multimap", "once_cell", @@ -7840,7 +7840,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", - "itertools 0.14.0", + "itertools 0.10.5", "log", "multimap", "petgraph 0.8.3", @@ -7861,7 +7861,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.119", @@ -7874,7 +7874,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.10.5", "proc-macro2", "quote", "syn 2.0.119", @@ -8329,9 +8329,9 @@ dependencies = [ [[package]] name = "redis" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b9503711b03773e43b31668c7b5bd279ee7cd9b7d18cff7c23a42cc1d08e5a" +checksum = "3257df217f7eab0044627a268c9cc6cdb60c0c421c88f83ac41c4e31520b6b84" dependencies = [ "arc-swap", "arcstr", @@ -8481,7 +8481,7 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "hyper", @@ -8627,7 +8627,7 @@ dependencies = [ "async-tungstenite", "futures-io", "futures-util", - "http 1.4.2", + "http 1.5.0", "rustls-native-certs", "rustls-pki-types", "rustls-webpki", @@ -8657,7 +8657,7 @@ dependencies = [ "flume", "futures-io", "futures-util", - "http 1.4.2", + "http 1.5.0", "log", "mqttbytes-core-next", "rumqttc-core-next", @@ -8845,7 +8845,7 @@ dependencies = [ [[package]] name = "rustfs" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "aes-gcm", "anyhow", @@ -8874,7 +8874,7 @@ dependencies = [ "hex-simd", "hmac 0.13.0", "hotpath", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "hyper", @@ -8981,7 +8981,7 @@ dependencies = [ [[package]] name = "rustfs-audit" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "chrono", @@ -9003,12 +9003,12 @@ dependencies = [ [[package]] name = "rustfs-checksums" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "base64-simd", "bytes", "crc-fast", - "http 1.4.2", + "http 1.5.0", "md-5 0.11.0", "pretty_assertions", "sha1 0.11.0", @@ -9018,7 +9018,7 @@ dependencies = [ [[package]] name = "rustfs-common" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "chrono", "metrics", @@ -9033,7 +9033,7 @@ dependencies = [ [[package]] name = "rustfs-concurrency" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "insta", "rustfs-io-core", @@ -9045,7 +9045,7 @@ dependencies = [ [[package]] name = "rustfs-config" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "const-str", "serde", @@ -9054,7 +9054,7 @@ dependencies = [ [[package]] name = "rustfs-credentials" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "base64-simd", "hmac 0.13.0", @@ -9067,7 +9067,7 @@ dependencies = [ [[package]] name = "rustfs-crypto" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "aes-gcm", "argon2", @@ -9087,7 +9087,7 @@ dependencies = [ [[package]] name = "rustfs-data-usage" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "rmp-serde", @@ -9097,7 +9097,7 @@ dependencies = [ [[package]] name = "rustfs-ecstore" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "aes-gcm", "arc-swap", @@ -9130,7 +9130,7 @@ dependencies = [ "hmac 0.13.0", "hostname", "hotpath", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "hyper", @@ -9236,7 +9236,7 @@ dependencies = [ [[package]] name = "rustfs-extension-schema" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "serde", "serde_json", @@ -9245,7 +9245,7 @@ dependencies = [ [[package]] name = "rustfs-filemeta" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "arc-swap", "byteorder", @@ -9271,12 +9271,12 @@ dependencies = [ [[package]] name = "rustfs-heal" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "base64 0.23.0", "futures", - "http 1.4.2", + "http 1.5.0", "metrics", "rustfs-common", "rustfs-concurrency", @@ -9301,13 +9301,13 @@ dependencies = [ [[package]] name = "rustfs-iam" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "arc-swap", "async-trait", "base64-simd", "futures", - "http 1.4.2", + "http 1.5.0", "jsonwebtoken 11.0.0", "moka", "openidconnect", @@ -9338,7 +9338,7 @@ dependencies = [ [[package]] name = "rustfs-io-core" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "bytes", "memmap2", @@ -9350,7 +9350,7 @@ dependencies = [ [[package]] name = "rustfs-io-metrics" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "criterion", "metrics", @@ -9413,11 +9413,11 @@ dependencies = [ [[package]] name = "rustfs-keystone" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "bytes", "futures", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "hyper", @@ -9439,7 +9439,7 @@ dependencies = [ [[package]] name = "rustfs-kms" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "aes-gcm", "arc-swap", @@ -9473,7 +9473,7 @@ dependencies = [ [[package]] name = "rustfs-lifecycle" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "metrics", @@ -9495,7 +9495,7 @@ dependencies = [ [[package]] name = "rustfs-lock" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "crossbeam-queue", @@ -9517,7 +9517,7 @@ dependencies = [ [[package]] name = "rustfs-log-analyzer" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "chrono", "flate2", @@ -9535,7 +9535,7 @@ dependencies = [ [[package]] name = "rustfs-madmin" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "chrono", "humantime", @@ -9549,7 +9549,7 @@ dependencies = [ [[package]] name = "rustfs-notify" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "arc-swap", "async-trait", @@ -9583,7 +9583,7 @@ dependencies = [ [[package]] name = "rustfs-object-capacity" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "criterion", "futures", @@ -9601,7 +9601,7 @@ dependencies = [ [[package]] name = "rustfs-object-data-cache" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "bytes", "criterion", @@ -9617,7 +9617,7 @@ dependencies = [ [[package]] name = "rustfs-obs" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "chrono", "crossbeam-channel", @@ -9669,7 +9669,7 @@ dependencies = [ [[package]] name = "rustfs-policy" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "base64-simd", @@ -9698,7 +9698,7 @@ dependencies = [ [[package]] name = "rustfs-protocols" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "astral-tokio-tar", "async-compression", @@ -9711,7 +9711,7 @@ dependencies = [ "futures-util", "hex", "hmac 0.13.0", - "http 1.4.2", + "http 1.5.0", "http-body-util", "hyper", "hyper-util", @@ -9760,7 +9760,7 @@ dependencies = [ [[package]] name = "rustfs-protos" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "flatbuffers", "prost 0.14.4", @@ -9783,7 +9783,7 @@ dependencies = [ [[package]] name = "rustfs-replication" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "byteorder", "bytes", @@ -9800,7 +9800,7 @@ dependencies = [ [[package]] name = "rustfs-rio" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "aes-gcm", "arc-swap", @@ -9812,7 +9812,7 @@ dependencies = [ "futures", "hex-simd", "hotpath", - "http 1.4.2", + "http 1.5.0", "http-body-util", "md-5 0.11.0", "pin-project-lite", @@ -9838,7 +9838,7 @@ dependencies = [ [[package]] name = "rustfs-rio-v2" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "aes-gcm", "bytes", @@ -9860,14 +9860,14 @@ dependencies = [ [[package]] name = "rustfs-s3-ops" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "rustfs-s3-types", ] [[package]] name = "rustfs-s3-types" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "serde", "serde_json", @@ -9875,7 +9875,7 @@ dependencies = [ [[package]] name = "rustfs-s3select-api" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "bytes", @@ -9883,7 +9883,7 @@ dependencies = [ "datafusion", "futures", "futures-core", - "http 1.4.2", + "http 1.5.0", "metrics", "parking_lot", "rustfs-common", @@ -9904,7 +9904,7 @@ dependencies = [ [[package]] name = "rustfs-s3select-query" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-recursion", "async-trait", @@ -9920,7 +9920,7 @@ dependencies = [ [[package]] name = "rustfs-scanner" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "bytes", @@ -9928,7 +9928,7 @@ dependencies = [ "futures", "hex-simd", "hmac 0.13.0", - "http 1.4.2", + "http 1.5.0", "metrics", "rand 0.10.2", "rmp-serde", @@ -9958,18 +9958,18 @@ dependencies = [ [[package]] name = "rustfs-security-governance" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "thiserror 2.0.19", ] [[package]] name = "rustfs-signer" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "base64-simd", "bytes", - "http 1.4.2", + "http 1.5.0", "hyper", "rustfs-utils", "s3s", @@ -9982,7 +9982,7 @@ dependencies = [ [[package]] name = "rustfs-storage-api" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "insta", @@ -9996,7 +9996,7 @@ dependencies = [ [[package]] name = "rustfs-targets" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "arc-swap", "async-nats", @@ -10049,7 +10049,7 @@ dependencies = [ [[package]] name = "rustfs-test-utils" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "rustfs-data-usage", "rustfs-ecstore", @@ -10064,7 +10064,7 @@ dependencies = [ [[package]] name = "rustfs-tls-runtime" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "arc-swap", "metrics", @@ -10084,11 +10084,11 @@ dependencies = [ [[package]] name = "rustfs-trusted-proxies" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "async-trait", "axum", - "http 1.4.2", + "http 1.5.0", "ipnetwork", "metrics", "moka", @@ -10120,7 +10120,7 @@ dependencies = [ [[package]] name = "rustfs-utils" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "base64-simd", "blake2", @@ -10134,7 +10134,7 @@ dependencies = [ "hex-simd", "highway", "hmac 0.13.0", - "http 1.4.2", + "http 1.5.0", "hyper", "local-ip-address", "lz4", @@ -10161,7 +10161,7 @@ dependencies = [ [[package]] name = "rustfs-zip" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" dependencies = [ "astral-tokio-tar", "async-compression", @@ -10191,7 +10191,7 @@ dependencies = [ "anyhow", "async-trait", "bytes", - "http 1.4.2", + "http 1.5.0", "reqwest", "rustify_derive", "serde", @@ -10231,9 +10231,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.42" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "aws-lc-rs", "log", @@ -10371,7 +10371,7 @@ dependencies = [ "futures", "hex-simd", "hmac 0.13.0", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "httparse", @@ -11499,7 +11499,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.3", + "getrandom 0.3.4", "once_cell", "rustix", "windows-sys 0.61.2", @@ -11735,13 +11735,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] @@ -11845,7 +11845,7 @@ dependencies = [ "bytes", "futures-core", "futures-sink", - "http 1.4.2", + "http 1.5.0", "httparse", "rand 0.8.7", "rustls-pki-types", @@ -11897,7 +11897,7 @@ dependencies = [ "bytes", "flate2", "h2", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "hyper", @@ -11984,7 +11984,7 @@ dependencies = [ "bitflags 2.13.1", "bytes", "futures-util", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "pin-project-lite", "tower", @@ -12004,7 +12004,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.4.2", + "http 1.5.0", "http-body 1.1.0", "http-body-util", "percent-encoding", @@ -12177,7 +12177,7 @@ checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" dependencies = [ "bytes", "data-encoding", - "http 1.4.2", + "http 1.5.0", "httparse", "log", "rand 0.9.5", @@ -12364,7 +12364,7 @@ checksum = "30ffcc0e81025065dda612ec1e26a3d81bb16ef3062354873d17a35965d68522" dependencies = [ "async-trait", "derive_builder", - "http 1.4.2", + "http 1.5.0", "reqwest", "rustify", "rustify_derive", diff --git a/Cargo.toml b/Cargo.toml index d9fafb141..d8512078f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -69,7 +69,7 @@ edition = "2024" license = "Apache-2.0" repository = "https://github.com/rustfs/rustfs" rust-version = "1.97.1" -version = "1.0.0-beta.11" +version = "1.0.0-beta.12" homepage = "https://rustfs.com" description = "RustFS is a high-performance distributed object storage software built using Rust, one of the most popular languages worldwide. " keywords = ["RustFS", "Minio", "object-storage", "filesystem", "s3"] @@ -86,58 +86,58 @@ redundant_clone = "warn" [workspace.dependencies] # RustFS Internal Crates -rustfs = { path = "./rustfs", version = "1.0.0-beta.11" } -rustfs-heal = { path = "crates/heal", version = "1.0.0-beta.11" } -rustfs-audit = { path = "crates/audit", version = "1.0.0-beta.11" } -rustfs-checksums = { path = "crates/checksums", version = "1.0.0-beta.11" } -rustfs-common = { path = "crates/common", version = "1.0.0-beta.11" } -rustfs-data-usage = { path = "crates/data-usage", version = "1.0.0-beta.11" } -rustfs-config = { path = "./crates/config", version = "1.0.0-beta.11" } -rustfs-concurrency = { path = "./crates/concurrency", version = "1.0.0-beta.11" } -rustfs-credentials = { path = "crates/credentials", version = "1.0.0-beta.11" } -rustfs-crypto = { path = "crates/crypto", version = "1.0.0-beta.11" } -rustfs-ecstore = { path = "crates/ecstore", version = "1.0.0-beta.11" } -rustfs-filemeta = { path = "crates/filemeta", version = "1.0.0-beta.11" } -rustfs-iam = { path = "crates/iam", version = "1.0.0-beta.11" } -rustfs-keystone = { path = "crates/keystone", version = "1.0.0-beta.11" } -rustfs-lifecycle = { path = "crates/lifecycle", version = "1.0.0-beta.11" } -rustfs-kms = { path = "crates/kms", version = "1.0.0-beta.11" } -rustfs-lock = { path = "crates/lock", version = "1.0.0-beta.11" } -rustfs-madmin = { path = "crates/madmin", version = "1.0.0-beta.11" } -rustfs-notify = { path = "crates/notify", version = "1.0.0-beta.11" } -rustfs-io-metrics = { path = "crates/io-metrics", version = "1.0.0-beta.11" } -rustfs-io-core = { path = "crates/io-core", version = "1.0.0-beta.11" } -rustfs-object-capacity = { path = "crates/object-capacity", version = "1.0.0-beta.11" } -rustfs-object-data-cache = { path = "crates/object-data-cache", version = "1.0.0-beta.11" } -rustfs-log-analyzer = { path = "crates/log-analyzer", version = "1.0.0-beta.11" } -rustfs-obs = { path = "crates/obs", version = "1.0.0-beta.11" } -rustfs-policy = { path = "crates/policy", version = "1.0.0-beta.11" } -rustfs-protos = { path = "crates/protos", version = "1.0.0-beta.11" } -rustfs-protocols = { path = "crates/protocols", version = "1.0.0-beta.11" } -rustfs-replication = { path = "crates/replication", version = "1.0.0-beta.11" } -rustfs-rio = { path = "crates/rio", version = "1.0.0-beta.11" } -rustfs-rio-v2 = { path = "crates/rio-v2", version = "1.0.0-beta.11" } -rustfs-s3-types = { path = "crates/s3-types", version = "1.0.0-beta.11" } -rustfs-s3-ops = { path = "crates/s3-ops", version = "1.0.0-beta.11" } -rustfs-s3select-api = { path = "crates/s3select-api", version = "1.0.0-beta.11" } -rustfs-s3select-query = { path = "crates/s3select-query", version = "1.0.0-beta.11" } -rustfs-scanner = { path = "crates/scanner", version = "1.0.0-beta.11" } -rustfs-security-governance = { path = "crates/security-governance", version = "1.0.0-beta.11" } -rustfs-extension-schema = { path = "crates/extension-schema", version = "1.0.0-beta.11" } -rustfs-signer = { path = "crates/signer", version = "1.0.0-beta.11" } -rustfs-storage-api = { path = "crates/storage-api", version = "1.0.0-beta.11" } -rustfs-trusted-proxies = { path = "crates/trusted-proxies", version = "1.0.0-beta.11" } -rustfs-targets = { path = "crates/targets", version = "1.0.0-beta.11" } -rustfs-test-utils = { path = "crates/test-utils", version = "1.0.0-beta.11" } -rustfs-tls-runtime = { path = "crates/tls-runtime", version = "1.0.0-beta.11" } -rustfs-utils = { path = "crates/utils", version = "1.0.0-beta.11" } -rustfs-zip = { path = "./crates/zip", version = "1.0.0-beta.11" } +rustfs = { path = "./rustfs", version = "1.0.0-beta.12" } +rustfs-heal = { path = "crates/heal", version = "1.0.0-beta.12" } +rustfs-audit = { path = "crates/audit", version = "1.0.0-beta.12" } +rustfs-checksums = { path = "crates/checksums", version = "1.0.0-beta.12" } +rustfs-common = { path = "crates/common", version = "1.0.0-beta.12" } +rustfs-data-usage = { path = "crates/data-usage", version = "1.0.0-beta.12" } +rustfs-config = { path = "./crates/config", version = "1.0.0-beta.12" } +rustfs-concurrency = { path = "./crates/concurrency", version = "1.0.0-beta.12" } +rustfs-credentials = { path = "crates/credentials", version = "1.0.0-beta.12" } +rustfs-crypto = { path = "crates/crypto", version = "1.0.0-beta.12" } +rustfs-ecstore = { path = "crates/ecstore", version = "1.0.0-beta.12" } +rustfs-filemeta = { path = "crates/filemeta", version = "1.0.0-beta.12" } +rustfs-iam = { path = "crates/iam", version = "1.0.0-beta.12" } +rustfs-keystone = { path = "crates/keystone", version = "1.0.0-beta.12" } +rustfs-lifecycle = { path = "crates/lifecycle", version = "1.0.0-beta.12" } +rustfs-kms = { path = "crates/kms", version = "1.0.0-beta.12" } +rustfs-lock = { path = "crates/lock", version = "1.0.0-beta.12" } +rustfs-madmin = { path = "crates/madmin", version = "1.0.0-beta.12" } +rustfs-notify = { path = "crates/notify", version = "1.0.0-beta.12" } +rustfs-io-metrics = { path = "crates/io-metrics", version = "1.0.0-beta.12" } +rustfs-io-core = { path = "crates/io-core", version = "1.0.0-beta.12" } +rustfs-object-capacity = { path = "crates/object-capacity", version = "1.0.0-beta.12" } +rustfs-object-data-cache = { path = "crates/object-data-cache", version = "1.0.0-beta.12" } +rustfs-log-analyzer = { path = "crates/log-analyzer", version = "1.0.0-beta.12" } +rustfs-obs = { path = "crates/obs", version = "1.0.0-beta.12" } +rustfs-policy = { path = "crates/policy", version = "1.0.0-beta.12" } +rustfs-protos = { path = "crates/protos", version = "1.0.0-beta.12" } +rustfs-protocols = { path = "crates/protocols", version = "1.0.0-beta.12" } +rustfs-replication = { path = "crates/replication", version = "1.0.0-beta.12" } +rustfs-rio = { path = "crates/rio", version = "1.0.0-beta.12" } +rustfs-rio-v2 = { path = "crates/rio-v2", version = "1.0.0-beta.12" } +rustfs-s3-types = { path = "crates/s3-types", version = "1.0.0-beta.12" } +rustfs-s3-ops = { path = "crates/s3-ops", version = "1.0.0-beta.12" } +rustfs-s3select-api = { path = "crates/s3select-api", version = "1.0.0-beta.12" } +rustfs-s3select-query = { path = "crates/s3select-query", version = "1.0.0-beta.12" } +rustfs-scanner = { path = "crates/scanner", version = "1.0.0-beta.12" } +rustfs-security-governance = { path = "crates/security-governance", version = "1.0.0-beta.12" } +rustfs-extension-schema = { path = "crates/extension-schema", version = "1.0.0-beta.12" } +rustfs-signer = { path = "crates/signer", version = "1.0.0-beta.12" } +rustfs-storage-api = { path = "crates/storage-api", version = "1.0.0-beta.12" } +rustfs-trusted-proxies = { path = "crates/trusted-proxies", version = "1.0.0-beta.12" } +rustfs-targets = { path = "crates/targets", version = "1.0.0-beta.12" } +rustfs-test-utils = { path = "crates/test-utils", version = "1.0.0-beta.12" } +rustfs-tls-runtime = { path = "crates/tls-runtime", version = "1.0.0-beta.12" } +rustfs-utils = { path = "crates/utils", version = "1.0.0-beta.12" } +rustfs-zip = { path = "./crates/zip", version = "1.0.0-beta.12" } # Async Runtime and Networking async-channel = "2.5.0" async_zip = { default-features = false, version = "0.0.18" } mysql_async = { default-features = false, version = "0.37" } -async-compression = { version = "0.4.42" } +async-compression = { version = "0.4.43" } async-recursion = "1.1.1" async-trait = "0.1.91" async-nats = { version = "0.50.0", default-features = false } @@ -152,7 +152,7 @@ lapin = { default-features = false, version = "4.10.0" } hyper = { version = "1.11.0" } hyper-rustls = { default-features = false, version = "0.27.9" } hyper-util = { version = "0.1.20" } -http = "1.4.2" +http = "1.5.0" http-body = "1.1.0" http-body-util = "0.1.4" minlz = "1.2.3" @@ -200,7 +200,7 @@ jsonwebtoken = { version = "11.0.0" } openidconnect = { default-features = false, version = "4.0" } pbkdf2 = "0.13.0" rsa = { version = "=0.10.0-rc.18" } -rustls = { default-features = false, version = "0.23.42" } +rustls = { default-features = false, version = "0.23.43" } rustls-native-certs = "0.8" rustls-pki-types = "1.15.1" sha1 = "0.11.0" @@ -284,7 +284,7 @@ reed-solomon-erasure = { package = "rustfs-erasure-codec", version = "8.0.2" } reed-solomon-simd = "3.1.0" regex = { version = "1.13.1" } rumqttc = { package = "rumqttc-next", version = "0.33.3" } -redis = { version = "1.4.1" } +redis = { version = "1.5.0" } rustix = { version = "1.1.4" } rust-embed = { version = "8.12.0" } rustc-hash = { version = "2.1.3" } diff --git a/README.md b/README.md index 59c1a8ca7..718889f9c 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ chown -R 10001:10001 data logs docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:latest # Using specific version -docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:1.0.0-beta.11 +docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:1.0.0-beta.12 ``` If you use [podman](https://github.com/containers/podman) instead of docker, you can install the RustFS with the below command diff --git a/README_ZH.md b/README_ZH.md index 162eba04a..789af1f51 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -113,7 +113,7 @@ chown -R 10001:10001 data logs docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:latest # 使用指定版本运行 -docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:1.0.0-beta.11 +docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:1.0.0-beta.12 ``` 如果您通过绑定挂载启用 TLS 证书目录,也请用同样方式准备该目录: diff --git a/crates/ecstore/src/store/bucket.rs b/crates/ecstore/src/store/bucket.rs index 19408114a..46c9e7aa0 100644 --- a/crates/ecstore/src/store/bucket.rs +++ b/crates/ecstore/src/store/bucket.rs @@ -310,12 +310,13 @@ impl ECStore { meta.set_created(opts.created_at); if opts.lock_enabled { - meta.object_lock_config_xml = crate::bucket::utils::serialize::(&enableObjcetLockConfig)?; - meta.versioning_config_xml = crate::bucket::utils::serialize::(&enableVersioningConfig)?; + meta.object_lock_config_xml = + crate::bucket::utils::serialize::(&ENABLED_OBJECT_LOCK_CONFIG)?; + meta.versioning_config_xml = crate::bucket::utils::serialize::(&ENABLED_VERSIONING_CONFIG)?; } if opts.versioning_enabled { - meta.versioning_config_xml = crate::bucket::utils::serialize::(&enableVersioningConfig)?; + meta.versioning_config_xml = crate::bucket::utils::serialize::(&ENABLED_VERSIONING_CONFIG)?; } await_bucket_namespace_operation( diff --git a/crates/ecstore/src/store/mod.rs b/crates/ecstore/src/store/mod.rs index de6f29e4a..6c7f2523a 100644 --- a/crates/ecstore/src/store/mod.rs +++ b/crates/ecstore/src/store/mod.rs @@ -428,11 +428,11 @@ impl ECStore { } lazy_static! { - static ref enableObjcetLockConfig: ObjectLockConfiguration = ObjectLockConfiguration { + static ref ENABLED_OBJECT_LOCK_CONFIG: ObjectLockConfiguration = ObjectLockConfiguration { object_lock_enabled: Some(ObjectLockEnabled::from_static(ObjectLockEnabled::ENABLED)), ..Default::default() }; - static ref enableVersioningConfig: VersioningConfiguration = VersioningConfiguration { + static ref ENABLED_VERSIONING_CONFIG: VersioningConfiguration = VersioningConfiguration { status: Some(BucketVersioningStatus::from_static(BucketVersioningStatus::ENABLED)), ..Default::default() }; diff --git a/crates/iam/src/manager.rs b/crates/iam/src/manager.rs index feb53fbe3..3acd8bdab 100644 --- a/crates/iam/src/manager.rs +++ b/crates/iam/src/manager.rs @@ -556,7 +556,7 @@ where Ok(now) } - pub async fn list_polices(&self, bucket_name: &str) -> Result> { + pub async fn list_policies(&self, bucket_name: &str) -> Result> { let mut m = HashMap::new(); self.api.load_policy_docs(&mut m).await?; @@ -588,6 +588,15 @@ where Ok(filtered) } + /// Backward-compatible misspelling retained until the next breaking release. + #[deprecated( + since = "1.0.0", + note = "use list_policies instead; this alias will be removed in the next breaking release" + )] + pub async fn list_polices(&self, bucket_name: &str) -> Result> { + self.list_policies(bucket_name).await + } + pub async fn merge_policies(&self, name: &str) -> (String, Policy) { let mut policies = Vec::new(); let mut to_merge = Vec::new(); @@ -2184,7 +2193,7 @@ where } } -pub fn get_default_policyes() -> HashMap { +pub fn get_default_policies() -> HashMap { let default_policies = &DEFAULT_POLICIES; default_policies .iter() @@ -2201,6 +2210,15 @@ pub fn get_default_policyes() -> HashMap { .collect() } +/// Backward-compatible misspelling retained until the next breaking release. +#[deprecated( + since = "1.0.0", + note = "use get_default_policies instead; this alias will be removed in the next breaking release" +)] +pub fn get_default_policyes() -> HashMap { + get_default_policies() +} + fn set_default_canned_policies(policies: &mut HashMap) { let default_policies = &DEFAULT_POLICIES; for (k, v) in default_policies.iter() { @@ -2900,7 +2918,7 @@ mod tests { #[test] fn test_get_default_policies() { - let policies = get_default_policyes(); + let policies = get_default_policies(); // Should contain some default policies assert!(!policies.is_empty()); @@ -2913,6 +2931,12 @@ mod tests { } } + #[test] + #[allow(deprecated)] + fn deprecated_get_default_policyes_matches_current_api() { + assert_eq!(get_default_policyes().len(), get_default_policies().len()); + } + #[test] fn test_get_token_signing_key() { // This function returns the global action credential's secret key diff --git a/crates/iam/src/store/object.rs b/crates/iam/src/store/object.rs index 500cc3510..f7e652118 100644 --- a/crates/iam/src/store/object.rs +++ b/crates/iam/src/store/object.rs @@ -22,7 +22,7 @@ use crate::{ cache::{Cache, CacheEntity}, error::{is_err_no_such_policy, is_err_no_such_user}, keyring, - manager::{extract_jwt_claims, extract_jwt_claims_allow_missing_exp, get_default_policyes}, + manager::{extract_jwt_claims, extract_jwt_claims_allow_missing_exp, get_default_policies}, root_credentials, }; use futures::future::join_all; @@ -1127,7 +1127,7 @@ impl Store for ObjectStore { let cache_snapshot = cache.snapshot(); let listed_config_items = self.list_all_iamconfig_items().await?; - let mut policy_docs_cache = CacheEntity::new(get_default_policyes()); + let mut policy_docs_cache = CacheEntity::new(get_default_policies()); if let Some(policies_list) = listed_config_items.get(POLICIES_LIST_KEY) { // Load in fixed-size chunks so each policy is fetched exactly once. diff --git a/crates/iam/src/sys.rs b/crates/iam/src/sys.rs index 608632b20..7a4822a1a 100644 --- a/crates/iam/src/sys.rs +++ b/crates/iam/src/sys.rs @@ -18,7 +18,7 @@ use crate::error::is_err_no_such_temp_account; use crate::error::{Error, Result}; use crate::federation::OIDC_VIRTUAL_PARENT_CLAIM; use crate::manager::extract_jwt_claims; -use crate::manager::get_default_policyes; +use crate::manager::get_default_policies; use crate::manager::{IamCache, IamSyncMetricsSnapshot}; use crate::store::GroupInfo; use crate::store::MappedPolicy; @@ -249,7 +249,7 @@ impl IamSys { } pub async fn delete_policy(&self, name: &str, notify: bool) -> Result<()> { - for k in get_default_policyes().keys() { + for k in get_default_policies().keys() { if k == name { return Err(Error::other("system policy can not be deleted")); } @@ -291,8 +291,17 @@ impl IamSys { self.store.api.load_mapped_policies(user_type, is_group, m).await } + pub async fn list_policies(&self, bucket_name: &str) -> Result> { + self.store.list_policies(bucket_name).await + } + + /// Backward-compatible misspelling retained until the next breaking release. + #[deprecated( + since = "1.0.0", + note = "use list_policies instead; this alias will be removed in the next breaking release" + )] pub async fn list_polices(&self, bucket_name: &str) -> Result> { - self.store.list_polices(bucket_name).await + self.list_policies(bucket_name).await } pub async fn list_policy_docs(&self, bucket_name: &str) -> Result> { @@ -1683,11 +1692,17 @@ mod tests { use super::*; use crate::cache::{Cache, CacheEntity}; use crate::error::Error; - use crate::manager::get_default_policyes; + use crate::manager::get_default_policies; use crate::store::{GroupInfo, MappedPolicy, Store, UserType}; use rustfs_credentials::{Credentials, init_global_action_credentials}; use rustfs_policy::auth::{UserIdentity, get_new_credentials_with_metadata}; use rustfs_policy::policy::Args; + + #[test] + #[allow(deprecated)] + fn deprecated_list_polices_api_is_available() { + let _ = IamSys::::list_polices; + } use rustfs_policy::policy::action::{Action, AdminAction, S3Action}; use rustfs_policy::policy::policy_uses_existing_object_tag_conditions; use serde_json::Value; @@ -1925,7 +1940,7 @@ mod tests { } async fn load_all(&self, cache: &Cache) -> Result<()> { - let mut policy_docs = get_default_policyes(); + let mut policy_docs = get_default_policies(); let custom_claim_policy = Policy::parse_config(CUSTOM_STS_CLAIM_POLICY_JSON.as_bytes()).expect("custom STS claim policy should parse"); policy_docs.insert(CUSTOM_STS_CLAIM_POLICY.to_string(), PolicyDoc::new(custom_claim_policy)); diff --git a/flake.nix b/flake.nix index 226c2f15e..7b153ab37 100644 --- a/flake.nix +++ b/flake.nix @@ -59,7 +59,7 @@ { default = rustPlatform.buildRustPackage { pname = "rustfs"; - version = "1.0.0-beta.11"; + version = "1.0.0-beta.12"; src = ./.; diff --git a/helm/rustfs/Chart.yaml b/helm/rustfs/Chart.yaml index 63b137b12..4685edcb3 100644 --- a/helm/rustfs/Chart.yaml +++ b/helm/rustfs/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: rustfs description: RustFS helm chart to deploy RustFS on kubernetes cluster. type: application -version: "0.11.0" -appVersion: "1.0.0-beta.11" +version: "0.12.0" +appVersion: "1.0.0-beta.12" home: https://rustfs.com icon: https://media.sys.truenas.net/apps/rustfs/icons/icon.svg maintainers: diff --git a/rustfs.spec b/rustfs.spec index fb5028f05..d9fdae840 100644 --- a/rustfs.spec +++ b/rustfs.spec @@ -1,9 +1,9 @@ %global _enable_debug_packages 0 %global _empty_manifest_terminate_build 0 -%global prerelease beta.11 +%global prerelease beta.12 Name: rustfs Version: 1.0.0 -Release: beta.11 +Release: beta.12 Summary: High-performance distributed object storage for MinIO alternative License: Apache-2.0 @@ -58,6 +58,9 @@ install %_builddir/%{name}-%{version}-%{prerelease}/target/%_arch/%_arch-unknown %_bindir/rustfs %changelog +* Thu Jul 30 2026 overtrue +- Update RPM package to RustFS 1.0.0-beta.12 + * Thu Jul 23 2026 overtrue - Update RPM package to RustFS 1.0.0-beta.11 diff --git a/rustfs/src/admin/handlers/policies.rs b/rustfs/src/admin/handlers/policies.rs index ad7cddc8f..354920acb 100644 --- a/rustfs/src/admin/handlers/policies.rs +++ b/rustfs/src/admin/handlers/policies.rs @@ -148,7 +148,7 @@ impl Operation for ListCannedPolicies { return Err(s3_error!(InternalError, "iam is not initialized")); }; - let policies = iam_store.list_polices(&query.bucket).await.map_err(|e| { + let policies = iam_store.list_policies(&query.bucket).await.map_err(|e| { warn!( component = LOG_COMPONENT_ADMIN, subsystem = LOG_SUBSYSTEM_POLICY, diff --git a/rustfs/src/admin/handlers/user.rs b/rustfs/src/admin/handlers/user.rs index 463cd02b8..f1e1ef099 100644 --- a/rustfs/src/admin/handlers/user.rs +++ b/rustfs/src/admin/handlers/user.rs @@ -724,7 +724,7 @@ impl Operation for ExportIam { match file { ALL_POLICIES_FILE => { let policies: HashMap = iam_store - .list_polices("") + .list_policies("") .await .map_err(|e| S3Error::with_message(S3ErrorCode::InternalError, e.to_string()))?; let json_str = serde_json::to_vec(&policies) diff --git a/scripts/check_layer_dependencies.sh b/scripts/check_layer_dependencies.sh index 32f41fc07..bbb445feb 100755 --- a/scripts/check_layer_dependencies.sh +++ b/scripts/check_layer_dependencies.sh @@ -13,7 +13,14 @@ fi classify_source_layer() { local file="$1" - if [[ "$file" == rustfs/src/app/* ]]; then + if [[ "$file" == rustfs/src/server/* ]] || + [[ "$file" == rustfs/src/startup_*.rs ]] || + [[ "$file" == rustfs/src/init.rs ]] || + [[ "$file" == rustfs/src/main.rs ]] || + [[ "$file" == rustfs/src/lib.rs ]] || + [[ "$file" == rustfs/src/embedded.rs ]]; then + printf 'composition' + elif [[ "$file" == rustfs/src/app/* ]]; then printf 'app' elif [[ "$file" == rustfs/src/admin/* ]] || [[ "$file" == rustfs/src/storage/ecfs.rs ]] || [[ "$file" == rustfs/src/storage/s3_api/* ]]; then printf 'interface' @@ -30,6 +37,14 @@ classify_target_layer() { local storage_path case "$root" in + init | main | lib | embedded | startup_*) + printf 'composition' + ;; + server) + # Server files are composition roots when they import lower layers, but + # their exported HTTP contracts belong to the interface boundary. + printf 'interface' + ;; app) printf 'app' ;; @@ -53,6 +68,9 @@ classify_target_layer() { layer_rank() { case "$1" in + composition) + printf '4' + ;; interface) printf '3' ;; @@ -68,6 +86,50 @@ layer_rank() { esac } +is_reverse_dependency() { + local source_rank target_rank + + source_rank="$(layer_rank "$1")" + target_rank="$(layer_rank "$2")" + (( source_rank < target_rank )) +} + +assert_dependency_direction() { + local expected="$1" + local source="$2" + local target="$3" + local actual='allowed' + + if is_reverse_dependency "$source" "$target"; then + actual='reverse' + fi + if [[ "$actual" != "$expected" ]]; then + printf 'Layer dependency guard self-test failed: %s -> %s (expected %s, got %s)\n' \ + "$source" "$target" "$expected" "$actual" >&2 + exit 1 + fi +} + +run_layer_model_self_tests() { + local server_source app_source storage_source server_target admin_target app_target storage_target + + server_source="$(classify_source_layer rustfs/src/server/http.rs)" + app_source="$(classify_source_layer rustfs/src/app/bucket_usecase.rs)" + storage_source="$(classify_source_layer rustfs/src/storage/rpc/node_service.rs)" + server_target="$(classify_target_layer server::http)" + admin_target="$(classify_target_layer admin::router)" + app_target="$(classify_target_layer app::bucket_usecase)" + storage_target="$(classify_target_layer storage::rpc)" + + assert_dependency_direction 'allowed' "$server_source" "$admin_target" + assert_dependency_direction 'allowed' "$server_source" "$app_target" + assert_dependency_direction 'allowed' "$server_source" "$storage_target" + assert_dependency_direction 'reverse' "$app_source" "$server_target" + assert_dependency_direction 'reverse' "$storage_source" "$server_target" + assert_dependency_direction 'reverse' "$app_source" "$admin_target" + assert_dependency_direction 'reverse' "$storage_source" "$admin_target" +} + normalize_import_group_item() { local prefix="$1" local item="$2" @@ -182,6 +244,11 @@ normalize_import_path() { emit_crate_use_statements() { (cd "$ROOT_DIR" && rg --files -g '*.rs' rustfs/src | while IFS= read -r file; do + # The guard is file-scoped: dedicated test modules are excluded, while + # inline #[cfg(test)] imports remain subject to the source file's layer. + if [[ "$file" == *_test.rs ]] || [[ "$file" == */tests/* ]]; then + continue + fi perl -0777 -ne ' while (/\buse\s+crate::.*?;/sg) { my $statement = $&; @@ -194,6 +261,26 @@ emit_crate_use_statements() { done) } +write_baseline_file() { + local entries="$1" + + cat >"$BASELINE_FILE" <<'EOF' +# Layer dependency baseline for the rustfs binary crate. +# +# The guard models production imports as: +# composition -> interface -> app -> infra +# +# Canonical dependency entry: +# dep|source_file|source_layer->target_layer|crate::imported_symbol +# +# Canonical conceptual cycle entry: +# cycle|left_layer<->right_layer +EOF + cat "$entries" >>"$BASELINE_FILE" +} + +run_layer_model_self_tests + normalize_baseline_file() { local input="$1" local output="$2" @@ -265,10 +352,7 @@ while IFS= read -r line; do printf '%s->%s\n' "$source_layer" "$target_layer" >>"$EDGES_RAW" fi - source_rank="$(layer_rank "$source_layer")" - target_rank="$(layer_rank "$target_layer")" - - if (( source_rank < target_rank )); then + if is_reverse_dependency "$source_layer" "$target_layer"; then printf 'dep|%s|%s->%s|crate::%s\n' "$file" "$source_layer" "$target_layer" "$import_path" >>"$VIOLATIONS_RAW" fi done < <(normalize_import_path "$text") @@ -292,7 +376,7 @@ done <"${TMP_DIR}/edges_sorted.txt" | sort -u >"${TMP_DIR}/cycles_sorted.txt" cat "${TMP_DIR}/violations_sorted.txt" "${TMP_DIR}/cycles_sorted.txt" | sort -u >"$CURRENT_BASELINE" if [[ "$MODE" == "update" ]]; then - cp "$CURRENT_BASELINE" "$BASELINE_FILE" + write_baseline_file "$CURRENT_BASELINE" echo "Updated baseline: $BASELINE_FILE" exit 0 fi diff --git a/scripts/layer-dependency-baseline.txt b/scripts/layer-dependency-baseline.txt index 9b41b7b12..33354b8eb 100644 --- a/scripts/layer-dependency-baseline.txt +++ b/scripts/layer-dependency-baseline.txt @@ -1,35 +1,44 @@ # Layer dependency baseline for the rustfs binary crate. # -# These are intra-crate module references within rustfs/ that cross the -# conceptual layer boundaries (app, infra/server, interface/admin). -# Since they live inside one Cargo crate, Rust doesn't enforce separation. -# The list is maintained for architectural awareness during code review. +# The guard models production imports as: +# composition -> interface -> app -> infra # -# Format for dependency entries: -# status|source_file|direction|imported_symbol|reason +# Canonical dependency entry: +# dep|source_file|source_layer->target_layer|crate::imported_symbol # -# Format for conceptual cycles: -# status|cycle|direction_pair|reason -# -# Status: -# accepted - reviewed and intentionally allowed -# todo - should be resolved in a future refactor - +# Canonical conceptual cycle entry: +# cycle|left_layer<->right_layer cycle|app<->infra cycle|app<->interface +cycle|composition<->infra +cycle|composition<->interface cycle|infra<->interface +dep|rustfs/src/admin/handlers/scanner.rs|interface->composition|crate::startup_background::ENV_SCANNER_ENABLED +dep|rustfs/src/admin/handlers/scanner.rs|interface->composition|crate::startup_background::scanner_enabled_from_env +dep|rustfs/src/app/admin_usecase.rs|app->interface|crate::server::DependencyReadiness +dep|rustfs/src/app/admin_usecase.rs|app->interface|crate::server::collect_dependency_readiness_report dep|rustfs/src/app/bucket_usecase.rs|app->interface|crate::admin::handlers::site_replication::site_replication_bucket_meta_hook dep|rustfs/src/app/bucket_usecase.rs|app->interface|crate::admin::handlers::site_replication::site_replication_delete_bucket_hook dep|rustfs/src/app/bucket_usecase.rs|app->interface|crate::admin::handlers::site_replication::site_replication_make_bucket_hook -dep|rustfs/src/init.rs|infra->interface|crate::admin +dep|rustfs/src/app/bucket_usecase.rs|app->interface|crate::server::RemoteAddr +dep|rustfs/src/app/object_usecase.rs|app->interface|crate::server::convert_ecstore_object_info +dep|rustfs/src/cluster_snapshot.rs|infra->interface|crate::server::DependencyReadiness +dep|rustfs/src/cluster_snapshot.rs|infra->interface|crate::server::DependencyReadinessReport +dep|rustfs/src/cluster_snapshot.rs|infra->interface|crate::server::ReadinessDegradedReason +dep|rustfs/src/cluster_snapshot.rs|infra->interface|crate::server::snapshot_dependency_readiness_report dep|rustfs/src/runtime_sources.rs|infra->app|crate::app::context -dep|rustfs/src/server/http.rs|infra->interface|crate::admin -dep|rustfs/src/server/layer.rs|infra->interface|crate::admin::console::is_console_path +dep|rustfs/src/storage/access.rs|infra->interface|crate::server::RemoteAddr +dep|rustfs/src/storage/ecfs_extend.rs|infra->interface|crate::server::cors dep|rustfs/src/storage/ecfs_extend.rs|infra->interface|crate::storage::ecfs::ListObjectUnorderedQuery -dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::ecfs::FS -dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::ecfs::validate_object_lock_configuration_input -dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::s3_api::common::rustfs_initiator -dep|rustfs/src/storage/ecfs_test.rs|infra->interface|crate::storage::s3_api::common::rustfs_owner +dep|rustfs/src/storage/helper.rs|infra->interface|crate::server::convert_ecstore_object_info +dep|rustfs/src/storage/helper.rs|infra->interface|crate::server::is_audit_module_enabled +dep|rustfs/src/storage/helper.rs|infra->interface|crate::server::is_notify_module_enabled +dep|rustfs/src/storage/helper.rs|infra->interface|crate::server::refresh_audit_module_enabled +dep|rustfs/src/storage/helper.rs|infra->interface|crate::server::refresh_notify_module_enabled +dep|rustfs/src/storage/rpc/http_service.rs|infra->interface|crate::server::RPC_PREFIX dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::config::reload_dynamic_config_runtime_state dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::config::reload_runtime_config_snapshot dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::admin::service::site_replication::reload_site_replication_runtime_state +dep|rustfs/src/storage/rpc/node_service.rs|infra->interface|crate::server::MODULE_SWITCHES_SIGNAL_SUBSYSTEM +dep|rustfs/src/storage/rpc/node_service/heal.rs|infra->composition|crate::startup_background::heal_enabled_from_env +dep|rustfs/src/storage/rpc/node_service/heal.rs|infra->composition|crate::startup_background::scanner_enabled_from_env