diff --git a/Cargo.lock b/Cargo.lock index 4e94c15..a3ecb20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -106,7 +106,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -128,7 +128,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -139,7 +139,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -165,9 +165,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ "axum-core", "bytes", @@ -190,9 +190,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", @@ -220,9 +220,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bitflags" @@ -319,31 +319,6 @@ dependencies = [ "serde_with", ] -[[package]] -name = "bon" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebeb9aaf9329dff6ceb65c689ca3db33dbf15f324909c60e4e5eef5701ce31b1" -dependencies = [ - "bon-macros", - "rustversion", -] - -[[package]] -name = "bon-macros" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e9d642a7e3a318e37c2c9427b5a6a48aa1ad55dcd986f3034ab2239045a645" -dependencies = [ - "darling", - "ident_case", - "prettyplease", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.111", -] - [[package]] name = "bumpalo" version = "3.19.1" @@ -367,9 +342,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.50" +version = "1.2.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ "find-msvc-tools", "shlex", @@ -389,9 +364,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", @@ -537,7 +512,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -548,7 +523,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -592,7 +567,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -754,7 +729,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -765,9 +740,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "ferroid" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce161062fb044bd629c2393590efd47cab8d0241faf15704ffb0d47b7b4e4a35" +checksum = "bb330bbd4cb7a5b9f559427f06f98a4f853a137c8298f3bd3f8ca57663e21986" dependencies = [ "portable-atomic", "rand 0.9.2", @@ -788,9 +763,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" [[package]] name = "fixedbitset" @@ -912,7 +887,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -957,9 +932,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -984,20 +959,19 @@ dependencies = [ [[package]] name = "google-cloud-auth" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "590a1c28795779d5da6fda35b149d5271bcddcf2ce1709eae9e9460faf2f2aa9" +checksum = "34f8aadacd3195fc3b08f2a5d582f2401c60d9f1598574acfcfb6228de25db29" dependencies = [ "async-trait", "base64 0.22.1", - "bon", "bytes", "google-cloud-gax", "http", "reqwest", "rustc_version", "rustls", - "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "thiserror", @@ -1007,9 +981,9 @@ dependencies = [ [[package]] name = "google-cloud-gax" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324fb97d35103787e80a33ed41ccc43d947c376d2ece68ca53e860f5844dbe24" +checksum = "b218292363f2e2d6ab8d6da4118acf91cc044439c442d2d6809b581e0728b377" dependencies = [ "base64 0.22.1", "bytes", @@ -1027,9 +1001,9 @@ dependencies = [ [[package]] name = "google-cloud-gax-internal" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75b810886ae872aca68a35ad1d4d5e8f2be39e40238116d8aff9d778f04b38" +checksum = "78125fa0347492177131d30c010e57ddce9bba1504c33be135f5853a9105c277" dependencies = [ "bytes", "futures", @@ -1061,9 +1035,9 @@ dependencies = [ [[package]] name = "google-cloud-iam-v1" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498a68e2a958e8aa9938f7db2c7147aad1b5a0ff2cd47c5ba4e10cb0dcb5bfc5" +checksum = "f84b431125034e0928e41e8c117bcbc40b0b55b55464b2e964b26e1ffcb15323" dependencies = [ "async-trait", "bytes", @@ -1081,9 +1055,9 @@ dependencies = [ [[package]] name = "google-cloud-longrunning" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c80938e704401a47fdf36b51ec10e1a99b1ec22793d607afd0e67c7b675b8b3" +checksum = "5d0612f4062f42b141b4d050d1a8a2f860e907a548bde28cb82d4fdf0eb346a3" dependencies = [ "async-trait", "bytes", @@ -1128,13 +1102,14 @@ dependencies = [ [[package]] name = "google-cloud-storage" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043be824d1b105bfdce786c720e45cae04e66436f8e5d0168e98ca8e5715ce9f" +checksum = "6abde5d51a4728f47b8f7781d7bf86ab51e310b42ec7c7c96578f1d03da938e4" dependencies = [ "async-trait", "base64 0.22.1", "bytes", + "chrono", "crc32c", "futures", "google-cloud-auth", @@ -1146,6 +1121,7 @@ dependencies = [ "google-cloud-rpc", "google-cloud-type", "google-cloud-wkt", + "hex", "http", "http-body", "hyper", @@ -1166,6 +1142,7 @@ dependencies = [ "tokio-stream", "tonic", "tracing", + "url", "uuid", ] @@ -1200,9 +1177,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", "bytes", @@ -1210,7 +1187,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.12.1", + "indexmap 2.13.0", "slab", "tokio", "tokio-util", @@ -1385,7 +1362,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.4", + "webpki-roots 1.0.5", ] [[package]] @@ -1603,9 +1580,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -1621,9 +1598,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" dependencies = [ "memchr", "serde", @@ -1646,15 +1623,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jiff" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" +checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" dependencies = [ "jiff-static", "log", @@ -1665,20 +1642,20 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -1695,9 +1672,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.178" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libm" @@ -1707,13 +1684,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ "bitflags", "libc", - "redox_syscall 0.6.0", + "redox_syscall 0.7.0", ] [[package]] @@ -1848,7 +1825,7 @@ dependencies = [ "libc", "log", "openssl", - "openssl-probe", + "openssl-probe 0.1.6", "openssl-sys", "schannel", "security-framework 2.11.1", @@ -1954,7 +1931,7 @@ dependencies = [ [[package]] name = "object-store" -version = "1.0.0-alpha.1" +version = "1.0.0-alpha.4" dependencies = [ "async-recursion", "async-trait", @@ -2031,7 +2008,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2040,6 +2017,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-probe" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" + [[package]] name = "openssl-sys" version = "0.9.111" @@ -2109,15 +2092,9 @@ dependencies = [ "regex", "regex-syntax", "structmeta", - "syn 2.0.111", + "syn 2.0.114", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -2135,12 +2112,13 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "petgraph" -version = "0.7.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", - "indexmap 2.12.1", + "hashbrown 0.15.5", + "indexmap 2.13.0", ] [[package]] @@ -2160,7 +2138,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2204,9 +2182,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f59e70c4aef1e55797c2e8fd94a4f2a973fc972cfde0e0b05f683667b0cd39dd" +checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" [[package]] name = "portable-atomic-util" @@ -2248,7 +2226,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2270,23 +2248,23 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ "unicode-ident", ] [[package]] name = "prost" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" dependencies = [ "bytes", "prost-derive", @@ -2294,15 +2272,14 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" +checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ "heck", "itertools", "log", "multimap", - "once_cell", "petgraph", "prettyplease", "prost", @@ -2310,28 +2287,28 @@ dependencies = [ "pulldown-cmark", "pulldown-cmark-to-cmark", "regex", - "syn 2.0.111", + "syn 2.0.114", "tempfile", ] [[package]] name = "prost-derive" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", "itertools", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "prost-types" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" dependencies = [ "prost", ] @@ -2349,9 +2326,9 @@ dependencies = [ [[package]] name = "pulldown-cmark-to-cmark" -version = "21.1.0" +version = "22.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8246feae3db61428fd0bb94285c690b460e4517d83152377543ca802357785f1" +checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" dependencies = [ "pulldown-cmark", ] @@ -2419,9 +2396,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ "proc-macro2", ] @@ -2450,7 +2427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -2470,7 +2447,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -2479,14 +2456,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] @@ -2502,9 +2479,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" dependencies = [ "bitflags", ] @@ -2526,7 +2503,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2560,9 +2537,9 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.26" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", @@ -2604,7 +2581,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.4", + "webpki-roots 1.0.5", ] [[package]] @@ -2615,7 +2592,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -2623,31 +2600,28 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" dependencies = [ - "byteorder", "num-traits", - "paste", ] [[package]] name = "rmp-serde" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "byteorder", "rmp", "serde", ] [[package]] name = "rsa" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ "const-oid", "digest", @@ -2686,9 +2660,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ "bitflags", "errno", @@ -2699,9 +2673,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ "log", "once_cell", @@ -2714,11 +2688,11 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ - "openssl-probe", + "openssl-probe 0.2.0", "rustls-pki-types", "schannel", "security-framework 3.5.1", @@ -2762,9 +2736,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" [[package]] name = "schannel" @@ -2789,9 +2763,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" dependencies = [ "dyn-clone", "ref-cast", @@ -2874,20 +2848,20 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] @@ -2898,7 +2872,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2923,9 +2897,9 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.1", + "indexmap 2.13.0", "schemars 0.9.0", - "schemars 1.1.0", + "schemars 1.2.0", "serde_core", "serde_json", "serde_with_macros", @@ -2941,7 +2915,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2974,10 +2948,11 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.7" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -3073,7 +3048,7 @@ dependencies = [ "futures-util", "hashbrown 0.15.5", "hashlink", - "indexmap 2.12.1", + "indexmap 2.13.0", "log", "memchr", "once_cell", @@ -3102,7 +3077,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3125,7 +3100,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.111", + "syn 2.0.114", "tokio", "url", ] @@ -3271,7 +3246,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3282,7 +3257,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3304,9 +3279,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.111" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -3330,7 +3305,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3356,9 +3331,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" dependencies = [ "fastrand", "getrandom 0.3.4", @@ -3369,9 +3344,9 @@ dependencies = [ [[package]] name = "testcontainers" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1483605f58b2fff80d786eb56a0b6b4e8b1e5423fbc9ec2e3e562fa2040d6f27" +checksum = "a81ec0158db5fbb9831e09d1813fe5ea9023a2b5e6e8e0a5fe67e2a820733629" dependencies = [ "astral-tokio-tar", "async-trait", @@ -3423,35 +3398,35 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "time" -version = "0.3.44" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" dependencies = [ "num-conv", "time-core", @@ -3484,9 +3459,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -3506,7 +3481,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3531,9 +3506,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -3543,9 +3518,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -3594,7 +3569,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3632,20 +3607,20 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.111", + "syn 2.0.114", "tempfile", "tonic-build", ] [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 2.12.1", + "indexmap 2.13.0", "pin-project-lite", "slab", "sync_wrapper", @@ -3706,7 +3681,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3732,9 +3707,9 @@ checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-bidi" @@ -3782,7 +3757,7 @@ dependencies = [ "rustls-pki-types", "ureq-proto", "utf-8", - "webpki-roots 1.0.4", + "webpki-roots 1.0.5", ] [[package]] @@ -3799,14 +3774,15 @@ dependencies = [ [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", + "serde_derive", ] [[package]] @@ -3883,9 +3859,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -3896,11 +3872,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.56" +version = "0.4.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -3909,9 +3886,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3919,22 +3896,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] @@ -3954,9 +3931,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" dependencies = [ "js-sys", "wasm-bindgen", @@ -3978,14 +3955,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.4", + "webpki-roots 1.0.5", ] [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" dependencies = [ "rustls-pki-types", ] @@ -4043,7 +4020,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4054,7 +4031,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4355,28 +4332,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.31" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.31" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4396,7 +4373,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "synstructure", ] @@ -4436,5 +4413,11 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] + +[[package]] +name = "zmij" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" diff --git a/Cargo.toml b/Cargo.toml index e716d5c..6223c64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "object-store" -version = "1.0.0-alpha.2" +version = "1.0.0-alpha.4" authors = ["Stephen Cirner "] edition = "2024" diff --git a/build.rs b/build.rs index 9dfc8ce..3a9025b 100644 --- a/build.rs +++ b/build.rs @@ -4,10 +4,11 @@ fn main() -> Result<(), Box> { .build_server(true) .compile_protos( &[ - "proto/public_key.proto", - "proto/object.proto", + "proto/admin.proto", "proto/dime.proto", "proto/mailbox.proto", + "proto/object.proto", + "proto/public_key.proto", ], &["proto"], )?; diff --git a/docs/FEATURES.md b/docs/FEATURES.md new file mode 100644 index 0000000..cdffeb6 --- /dev/null +++ b/docs/FEATURES.md @@ -0,0 +1,21 @@ +# Features +## Maintenance Mode +Introduced: `v1.0.0` +Puts `object-store` in read-only mode. Objects can be retrieved and replication, if enabled, will run. +Useful if 1) a migration to another instance is needed or 2) you need a read-only replica + +### Usage +Enable maintenance mode +```bash +grpcurl -proto ./proto/admin.proto -plaintext -d '{"maintenance_state": true}' localhost:5000 objectstore.AdminService/SetConfig +``` + +Disable maintenance mode +```bash +grpcurl -proto ./proto/admin.proto -plaintext -d '{"maintenance_state": false}' localhost:5000 objectstore.AdminService/SetConfig +``` + +Get current config +```bash +grpcurl -proto ./proto/admin.proto -plaintext localhost:5000 objectstore.AdminService/GetConfig +``` diff --git a/proto/admin.proto b/proto/admin.proto new file mode 100644 index 0000000..889df37 --- /dev/null +++ b/proto/admin.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +package objectstore; + +option java_package = "io.provenance.objectstore.proto"; +option java_outer_classname = "Admin"; + +service AdminService { + rpc SetConfig(SetConfigRequest) returns (ConfigResponse); + rpc GetConfig(GetConfigRequest) returns (ConfigResponse); +} + +message SetConfigRequest { + optional bool maintenance_state = 1; +} + +message GetConfigRequest {} + +message ConfigResponse { + bool maintenance_state = 1; +} diff --git a/src/admin/mod.rs b/src/admin/mod.rs new file mode 100644 index 0000000..42bf5fa --- /dev/null +++ b/src/admin/mod.rs @@ -0,0 +1,48 @@ +use std::sync::Arc; + +use tonic::{Request, Response}; + +use crate::{ + config::Config, + pb::{ConfigResponse, GetConfigRequest, SetConfigRequest, admin_service_server::AdminService}, + types::GrpcResult, +}; + +#[derive(Debug)] +pub struct AdminGrpc { + config: Arc, +} + +impl AdminGrpc { + pub fn new(config: Arc) -> Self { + Self { config } + } +} + +#[tonic::async_trait] +impl AdminService for AdminGrpc { + async fn set_config( + &self, + request: Request, + ) -> GrpcResult> { + let request = request.into_inner(); + + if let Some(maintenance_state) = request.maintenance_state { + log::info!("Setting maintenance_state to {}", maintenance_state); + self.config.set_maintenance_state(maintenance_state); + } + + Ok(Response::new(ConfigResponse { + maintenance_state: self.config.is_maintenance_state(), + })) + } + + async fn get_config( + &self, + _request: Request, + ) -> GrpcResult> { + Ok(Response::new(ConfigResponse { + maintenance_state: self.config.is_maintenance_state(), + })) + } +} diff --git a/src/config.rs b/src/config.rs index 30e5390..1f33606 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,7 @@ use std::env; use std::net::{IpAddr, SocketAddr}; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Duration; use chrono::TimeDelta; @@ -70,6 +71,8 @@ pub struct Config { pub trace_header: String, pub user_auth_enabled: bool, pub health_service_enabled: bool, + /// Runtime maintenance mode state. When true, write operations are rejected. + pub maintenance_state: AtomicBool, } const BASE_SPAN_TAGS: [(&str, &str); 3] = [ @@ -189,6 +192,10 @@ impl Config { .unwrap_or("true".to_owned()) .parse() .expect("HEALTH_SERVICE_ENABLED could not be parsed into a bool"); + let maintenance_state: bool = env::var("MAINTENANCE_STATE") + .unwrap_or("false".to_owned()) + .parse() + .expect("MAINTENANCE_STATE could not be parsed into a bool"); let replication_config = ReplicationConfig { replication_enabled, @@ -224,6 +231,7 @@ impl Config { trace_header, user_auth_enabled, health_service_enabled, + maintenance_state: AtomicBool::new(maintenance_state), }) } @@ -236,4 +244,12 @@ impl Config { self.db_user, password, self.db_host, self.db_port, self.db_database, ) } + + pub fn is_maintenance_state(&self) -> bool { + self.maintenance_state.load(Ordering::Relaxed) + } + + pub fn set_maintenance_state(&self, enabled: bool) { + self.maintenance_state.store(enabled, Ordering::Relaxed); + } } diff --git a/src/lib.rs b/src/lib.rs index 72439ac..2d778ce 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ use sqlx::PgPool; use tonic_health::pb::health_server::{Health, HealthServer}; use crate::{ + admin::AdminGrpc, cache::Cache, config::Config, db::connect_and_migrate, @@ -16,6 +17,7 @@ use crate::{ types::OsError, }; +pub mod admin; pub mod authorization; pub mod cache; pub mod config; @@ -44,6 +46,7 @@ pub struct AppContext { pub cache: Arc>, pub db_pool: Arc, pub storage: Arc>, + pub admin_service: AdminGrpc, pub public_key_service: PublicKeyGrpc, pub mailbox_service: MailboxGrpc, pub object_service: ObjectGrpc, @@ -59,7 +62,8 @@ impl AppContext { let cache = Cache::new(db_pool.clone()).await?; let storage = new_storage(&config).await?; - let public_key_service = PublicKeyGrpc::new(cache.clone(), db_pool.clone()); + let admin_service = AdminGrpc::new(config.clone()); + let public_key_service = PublicKeyGrpc::new(cache.clone(), config.clone(), db_pool.clone()); let mailbox_service = MailboxGrpc::new(cache.clone(), config.clone(), db_pool.clone()); let object_service = ObjectGrpc::new( cache.clone(), @@ -84,6 +88,7 @@ impl AppContext { cache, db_pool, storage, + admin_service, public_key_service, mailbox_service, object_service, diff --git a/src/mailbox.rs b/src/mailbox.rs index f8e2127..b3ce12b 100644 --- a/src/mailbox.rs +++ b/src/mailbox.rs @@ -118,6 +118,10 @@ impl MailboxService for MailboxGrpc { #[trace(name = "mailbox::ack")] async fn ack(&self, request: Request) -> GrpcResult> { + if self.config.is_maintenance_state() { + return Err(Status::unavailable("Service is in maintenance mode")); + } + let metadata = request.metadata().clone(); let request = request.into_inner(); diff --git a/src/object.rs b/src/object.rs index d290dc0..d2a19c8 100644 --- a/src/object.rs +++ b/src/object.rs @@ -67,6 +67,10 @@ impl ObjectService for ObjectGrpc { &self, request: Request>, ) -> GrpcResult> { + if self.config.is_maintenance_state() { + return Err(Status::unavailable("Service is in maintenance mode")); + } + let metadata = request.metadata().clone(); let mut stream = request.into_inner(); diff --git a/src/public_key.rs b/src/public_key.rs index a1996cf..a3749f8 100644 --- a/src/public_key.rs +++ b/src/public_key.rs @@ -1,4 +1,5 @@ use crate::cache::Cache; +use crate::config::Config; use crate::datastore; use crate::domain::PublicKeyApiResponse; use crate::pb::public_key_request::Impl::HeaderAuth as HeaderAuthEnumRequest; @@ -16,16 +17,21 @@ use url::Url; #[derive(Debug)] pub struct PublicKeyGrpc { - // This cache is using a std::sync::Mutex because the tokio docs mention that this is often - // preferrable to the tokio Mutex when you are strictly locking data. In cases where you - // are locking over a database connection, or io resource, the tokio Mutex is required. + /// This cache is using a std::sync::Mutex because the tokio docs mention that this is often + /// preferrable to the tokio Mutex when you are strictly locking data. In cases where you + /// are locking over a database connection, or io resource, the tokio Mutex is required. cache: Arc>, + config: Arc, db_pool: Arc, } impl PublicKeyGrpc { - pub fn new(cache: Arc>, db_pool: Arc) -> Self { - Self { cache, db_pool } + pub fn new(cache: Arc>, config: Arc, db_pool: Arc) -> Self { + Self { + cache, + config, + db_pool, + } } } @@ -35,6 +41,10 @@ impl PublicKeyService for PublicKeyGrpc { &self, request: Request, ) -> GrpcResult> { + if self.config.is_maintenance_state() { + return Err(Status::unavailable("Service is in maintenance mode")); + } + let request = request.into_inner(); // validate public_key diff --git a/src/server/mod.rs b/src/server/mod.rs index 7e21592..be8f077 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -8,7 +8,8 @@ use crate::{ AppContext, middleware::{LoggingMiddlewareLayer, MinitraceGrpcMiddlewareLayer}, pb::{ - mailbox_service_server::MailboxServiceServer, object_service_server::ObjectServiceServer, + admin_service_server::AdminServiceServer, mailbox_service_server::MailboxServiceServer, + object_service_server::ObjectServiceServer, public_key_service_server::PublicKeyServiceServer, }, server::trace::start_trace_reporter, @@ -39,6 +40,7 @@ pub async fn configure_and_start_server(mut context: AppContext) -> Result<(), E .into_inner(), ) .add_optional_service(health_service) + .add_service(AdminServiceServer::new(context.admin_service)) .add_service(PublicKeyServiceServer::new(context.public_key_service)) .add_service(MailboxServiceServer::new(context.mailbox_service)) .add_service(ObjectServiceServer::new(context.object_service)) diff --git a/tests/admin.rs b/tests/admin.rs new file mode 100644 index 0000000..7a8e0bc --- /dev/null +++ b/tests/admin.rs @@ -0,0 +1,137 @@ +mod common; + +use object_store::pb::{GetConfigRequest, SetConfigRequest}; + +use crate::common::client::get_admin_client; +use crate::common::config::test_config; +use crate::common::containers::start_containers; +use crate::common::start_test_server; + +#[tokio::test] +async fn get_config_returns_default_maintenance_state() { + let (db_port, _postgres) = start_containers().await; + let (_, _, _, config) = start_test_server(test_config(db_port), None).await; + + let mut client = get_admin_client(config.url).await; + let response = client.get_config(GetConfigRequest {}).await; + + match response { + Ok(result) => { + let result = result.into_inner(); + assert!(!result.maintenance_state); + } + Err(err) => panic!("Expected success, got error: {:?}", err), + } +} + +#[tokio::test] +async fn set_config_enables_maintenance_state() { + let (db_port, _postgres) = start_containers().await; + let (_, _, _, config) = start_test_server(test_config(db_port), None).await; + + let mut client = get_admin_client(config.url).await; + let response = client + .set_config(SetConfigRequest { + maintenance_state: Some(true), + }) + .await; + + match response { + Ok(result) => { + let result = result.into_inner(); + assert!(result.maintenance_state); + } + Err(err) => panic!("Expected success, got error: {:?}", err), + } +} + +#[tokio::test] +async fn set_config_disables_maintenance_state() { + let (db_port, _postgres) = start_containers().await; + let test_cfg = test_config(db_port); + // Start with maintenance enabled + test_cfg.set_maintenance_state(true); + let (_, _, _, config) = start_test_server(test_cfg, None).await; + + // Verify it's enabled + let mut client = get_admin_client(config.url).await; + let response = client.get_config(GetConfigRequest {}).await.unwrap(); + assert!(response.into_inner().maintenance_state); + + // Disable it + let response = client + .set_config(SetConfigRequest { + maintenance_state: Some(false), + }) + .await; + + match response { + Ok(result) => { + let result = result.into_inner(); + assert!(!result.maintenance_state); + } + Err(err) => panic!("Expected success, got error: {:?}", err), + } +} + +#[tokio::test] +async fn set_config_without_maintenance_state_preserves_current() { + let (db_port, _postgres) = start_containers().await; + let test_cfg = test_config(db_port); + test_cfg.set_maintenance_state(true); + let (_, _, _, config) = start_test_server(test_cfg, None).await; + + let mut client = get_admin_client(config.url).await; + + // Send request without maintenance_state field + let response = client + .set_config(SetConfigRequest { + maintenance_state: None, + }) + .await; + + match response { + Ok(result) => { + let result = result.into_inner(); + // Should preserve the current state (true) + assert!(result.maintenance_state); + } + Err(err) => panic!("Expected success, got error: {:?}", err), + } +} + +#[tokio::test] +async fn get_config_reflects_set_config_changes() { + let (db_port, _postgres) = start_containers().await; + let (_, _, _, config) = start_test_server(test_config(db_port), None).await; + + let mut client = get_admin_client(config.url).await; + + // Initially false + let response = client.get_config(GetConfigRequest {}).await.unwrap(); + assert!(!response.into_inner().maintenance_state); + + // Set to true + client + .set_config(SetConfigRequest { + maintenance_state: Some(true), + }) + .await + .unwrap(); + + // Verify get_config returns true + let response = client.get_config(GetConfigRequest {}).await.unwrap(); + assert!(response.into_inner().maintenance_state); + + // Set back to false + client + .set_config(SetConfigRequest { + maintenance_state: Some(false), + }) + .await + .unwrap(); + + // Verify get_config returns false + let response = client.get_config(GetConfigRequest {}).await.unwrap(); + assert!(!response.into_inner().maintenance_state); +} diff --git a/tests/common/client.rs b/tests/common/client.rs index f8ed3f5..b516f93 100644 --- a/tests/common/client.rs +++ b/tests/common/client.rs @@ -1,10 +1,17 @@ use std::net::SocketAddr; use object_store::pb::{ - mailbox_service_client::MailboxServiceClient, object_service_client::ObjectServiceClient, + admin_service_client::AdminServiceClient, mailbox_service_client::MailboxServiceClient, + object_service_client::ObjectServiceClient, }; use tonic::transport::Channel; +pub async fn get_admin_client(addr: SocketAddr) -> AdminServiceClient { + AdminServiceClient::connect(format!("tcp://{}", addr)) + .await + .unwrap() +} + pub async fn get_mailbox_client(addr: SocketAddr) -> MailboxServiceClient { MailboxServiceClient::connect(format!("tcp://{}", addr)) .await diff --git a/tests/common/config.rs b/tests/common/config.rs index 18b2916..ec1db8e 100644 --- a/tests/common/config.rs +++ b/tests/common/config.rs @@ -38,6 +38,7 @@ pub fn test_config(db_port: u16) -> Config { trace_header: String::default(), user_auth_enabled: false, health_service_enabled: false, + maintenance_state: false.into(), } } diff --git a/tests/common/mod.rs b/tests/common/mod.rs index a03dd11..4668587 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -20,6 +20,7 @@ use object_store::consts::{ }; use object_store::datastore::{MailboxPublicKey, ObjectPublicKey}; use object_store::dime::Dime; +use object_store::pb::admin_service_server::AdminServiceServer; use object_store::pb::chunk_bidi::Impl::{ Chunk as ChunkEnum, MultiStreamHeader as MultiStreamHeaderEnum, }; @@ -248,6 +249,7 @@ pub async fn start_test_server( // TODO: call configure_and_start_server here once it supports using a listener tokio::spawn(async move { tonic::transport::Server::builder() + .add_service(AdminServiceServer::new(context.admin_service)) .add_service(MailboxServiceServer::new(context.mailbox_service)) .add_service(ObjectServiceServer::new(context.object_service)) .serve_with_incoming(tokio_stream::wrappers::TcpListenerStream::new(listener)) diff --git a/tests/mailbox.rs b/tests/mailbox.rs index d635195..9b7cfb4 100644 --- a/tests/mailbox.rs +++ b/tests/mailbox.rs @@ -712,3 +712,55 @@ async fn auth_ack_no_key() { _ => assert_eq!(format!("{:?}", response), ""), } } + +#[tokio::test] +async fn ack_rejected_in_maintenance_mode() { + let (db_port, _postgres) = start_containers().await; + + // First start without maintenance mode to create some mail + let (_, config) = start_server(test_config(db_port)).await; + + let (audience1, signature1) = party_1(); + let (audience2, signature2) = party_2(); + let dime = { + let mut dime = generate_dime( + vec![audience1, audience2.clone()], + vec![signature1, signature2], + ); + dime.metadata + .insert(MAILBOX_KEY.to_owned(), MAILBOX_FRAGMENT_REQUEST.to_owned()); + dime + }; + let payload: bytes::Bytes = "testing small payload".as_bytes().into(); + let chunk_size = 500; + let request = put_helper( + dime, + payload.clone(), + chunk_size, + HashMap::default(), + Vec::default(), + ); + + let mut os_client = get_object_client(config.url).await; + let response = os_client.put(request).await.unwrap(); + + // Enable maintenance mode + config.set_maintenance_state(true); + + // Try to ack - should fail + let mut client = get_mailbox_client(config.url).await; + let public_key = audience2.public_key_decoded(); + let request = Request::new(AckRequest { + uuid: response.into_inner().uuid, + public_key, + }); + let response = client.ack(request).await; + + match response { + Err(err) => { + assert_eq!(err.code(), tonic::Code::Unavailable); + assert_eq!(err.message(), "Service is in maintenance mode"); + } + _ => panic!("Expected Unavailable error, got: {:?}", response), + } +} diff --git a/tests/object.rs b/tests/object.rs index 8a03240..ab0f1f6 100644 --- a/tests/object.rs +++ b/tests/object.rs @@ -1122,3 +1122,35 @@ async fn get_object_no_properties() { // TODO add test that has storage backed payload but the file wasn't written due to failure // verify that fetch returns an accurate error and also a subsequent PUT can write the file // TODO add test to verify owner signature is added to dime + +#[tokio::test] +async fn put_rejected_in_maintenance_mode() { + let (db_port, _postgres) = start_containers().await; + + let test_cfg = test_config(db_port); + test_cfg.set_maintenance_state(true); + let (_, _, _, config) = start_test_server(test_cfg, None).await; + + let (audience, signature) = party_1(); + let dime = generate_dime(vec![audience], vec![signature]); + let payload: bytes::Bytes = "testing small payload".as_bytes().into(); + let chunk_size = 500; + let request = put_helper( + dime, + payload, + chunk_size, + HashMap::default(), + Vec::default(), + ); + + let mut os_client = get_object_client(config.url).await; + let response = os_client.put(request).await; + + match response { + Err(err) => { + assert_eq!(err.code(), tonic::Code::Unavailable); + assert_eq!(err.message(), "Service is in maintenance mode"); + } + _ => panic!("Expected Unavailable error, got: {:?}", response), + } +} diff --git a/tests/public_key.rs b/tests/public_key.rs index d8fde5d..db1c7bf 100644 --- a/tests/public_key.rs +++ b/tests/public_key.rs @@ -352,3 +352,28 @@ async fn adds_nonempty_urls_to_remote_cache() { String::from("") ); } + +#[tokio::test] +async fn add_rejected_in_maintenance_mode() { + let (db_port, _postgres) = start_containers().await; + let config = test_config(db_port); + config.set_maintenance_state(true); + let context = AppContext::new(Arc::new(config)).await.unwrap(); + + let request = PublicKeyRequest { + public_key: Some(vec![1u8, 2u8, 3u8].into()), + r#impl: None, + url: String::default(), + metadata: None, + }; + + let response = context.public_key_service.add(Request::new(request)).await; + + match response { + Err(err) => { + assert_eq!(err.code(), tonic::Code::Unavailable); + assert_eq!(err.message(), "Service is in maintenance mode"); + } + _ => panic!("Expected Unavailable error, got: {:?}", response), + } +}