From c2f14c86eb007a0e299748ddda03de8be57a9652 Mon Sep 17 00:00:00 2001 From: David Morrison Date: Sat, 16 Nov 2024 19:40:34 -0800 Subject: [PATCH] chore: upgrade complete --- Cargo.lock | 1914 ++++++++++------- Cargo.toml | 64 +- examples/tracer_config.yml | 2 + sk-cli/src/snapshot.rs | 34 +- sk-core/Cargo.toml | 2 +- sk-core/src/external_storage.rs | 5 +- sk-core/src/k8s/pod_lifecycle.rs | 4 +- sk-core/src/k8s/testutils/fake.rs | 14 +- sk-core/src/time.rs | 2 +- sk-ctrl/src/objects.rs | 2 +- sk-driver/Cargo.toml | 1 - sk-driver/src/mutation.rs | 51 +- sk-driver/src/tests/mutation_test.rs | 6 +- sk-store/Cargo.toml | 1 + sk-store/src/tests/import_export_test.rs | 69 +- sk-store/src/watchers/dyn_obj_watcher.rs | 174 +- sk-store/src/watchers/mod.rs | 147 +- sk-store/src/watchers/pod_watcher.rs | 242 +-- sk-store/src/watchers/tests/mod.rs | 30 + .../src/watchers/tests/pod_watcher_test.rs | 140 +- sk-tracer/src/main.rs | 22 +- 21 files changed, 1596 insertions(+), 1330 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b649f679..6ee6f85a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" @@ -41,9 +41,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-tzdata" @@ -62,9 +62,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -77,43 +77,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" dependencies = [ "backtrace", ] @@ -143,6 +143,18 @@ version = "8.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "857057651cdf1fe4bc1e8308493c752db559df0330f23b45f532f6b24c2b443d" +[[package]] +name = "async-broadcast" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-channel" version = "1.9.0" @@ -168,14 +180,14 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.0", - "futures-lite 2.3.0", + "fastrand 2.2.0", + "futures-lite 2.5.0", "slab", ] @@ -187,59 +199,30 @@ checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ "async-channel 2.3.1", "async-executor", - "async-io 2.3.3", - "async-lock 3.4.0", + "async-io", + "async-lock", "blocking", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "once_cell", ] [[package]] name = "async-io" -version = "1.13.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ - "async-lock 2.8.0", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", -] - -[[package]] -name = "async-io" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" -dependencies = [ - "async-lock 3.4.0", + "async-lock", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "parking", - "polling 3.7.2", - "rustix 0.38.34", + "polling 3.7.4", + "rustix", "slab", "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", + "windows-sys 0.59.0", ] [[package]] @@ -255,28 +238,30 @@ dependencies = [ [[package]] name = "async-object-pool" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb901c30ebc2fc4ab46395bbfbdba9542c16559d853645d75190c3056caf3bc" +checksum = "333c456b97c3f2d50604e8b2624253b7f787208cb72eb75e64b0ad11b221652c" dependencies = [ "async-std", ] [[package]] name = "async-process" -version = "1.8.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", + "async-channel 2.3.1", + "async-io", + "async-lock", "async-signal", + "async-task", "blocking", "cfg-if", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.34", - "windows-sys 0.48.0", + "event-listener 5.3.1", + "futures-lite 2.5.0", + "rustix", + "tracing", ] [[package]] @@ -287,43 +272,43 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "async-signal" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ - "async-io 2.3.3", - "async-lock 3.4.0", + "async-io", + "async-lock", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.34", + "rustix", "signal-hook-registry", "slab", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "async-std" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" dependencies = [ "async-channel 1.9.0", "async-global-executor", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io", + "async-lock", "async-process", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite 1.13.0", + "futures-lite 2.5.0", "gloo-timers", "kv-log-macro", "log", @@ -337,9 +322,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -348,13 +333,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -365,13 +350,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -397,9 +382,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backoff" @@ -414,31 +399,19 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" - [[package]] name = "base64" version = "0.21.7" @@ -513,7 +486,7 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] @@ -525,9 +498,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" [[package]] name = "byteorder" @@ -537,9 +510,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "cassowary" @@ -564,9 +537,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.101" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -574,6 +550,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.38" @@ -586,14 +568,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "clap" -version = "4.5.8" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -601,57 +583,57 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.8" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] name = "clap_complete" -version = "4.5.7" +version = "4.5.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d598e88f6874d4b888ed40c71efbcbf4076f1dfbae128a08a8c9e45f710605d" +checksum = "d9647a559c112175f17cf724dc72d3645680a883c58481332779192b0d8e7a01" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.8" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "clockabilly" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ba5ead05fbdc11573017881b95c32343a382f917cf9354f8f22e3654226983" +checksum = "7e4388a860fbabd311ec78f1ad43127b6f6f18c1bcc9b6626f1e742f26951eef" dependencies = [ "chrono", ] [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "compact_str" @@ -711,9 +693,18 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" +dependencies = [ + "libc", +] [[package]] name = "crossbeam-utils" @@ -729,9 +720,9 @@ checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ "bitflags 2.6.0", "crossterm_winapi", - "mio 1.0.2", + "mio", "parking_lot", - "rustix 0.38.34", + "rustix", "signal-hook", "signal-hook-mio", "winapi", @@ -764,24 +755,24 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.46" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2161dd6eba090ff1594084e95fd67aeccf04382ffea77999ea94ed42ec67b6" +checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265" dependencies = [ "curl-sys", "libc", "openssl-probe", "openssl-sys", "schannel", - "socket2 0.5.7", + "socket2", "windows-sys 0.52.0", ] [[package]] name = "curl-sys" -version = "0.4.73+curl-8.8.0" +version = "0.4.78+curl-8.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "450ab250ecf17227c39afb9a2dd9261dc0035cb80f2612472fc0c4aac2dcb84d" +checksum = "8eec768341c5c7789611ae51cf6c459099f22e64a5d5d0ce4892434e33821eaf" dependencies = [ "cc", "libc", @@ -793,38 +784,14 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "darling" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", -] - [[package]] name = "darling" version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", -] - -[[package]] -name = "darling_core" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] @@ -837,19 +804,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", - "syn 2.0.68", -] - -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", + "strsim", + "syn 2.0.87", ] [[package]] @@ -858,9 +814,9 @@ version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.10", + "darling_core", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -872,34 +828,23 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "derive_setters" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e8ef033054e131169b8f0f9a7af8f5533a9436fadf3c500ed547f730f07090d" dependencies = [ - "darling 0.20.10", + "darling", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "devise" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8" +checksum = "f1d90b0c4c777a2cad215e3c7be59ac7c15adf45cf76317009b7d096d46f651d" dependencies = [ "devise_codegen", "devise_core", @@ -907,9 +852,9 @@ dependencies = [ [[package]] name = "devise_codegen" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6" +checksum = "71b28680d8be17a570a2334922518be6adc3f58ecc880cbb404eaeb8624fd867" dependencies = [ "devise_core", "quote", @@ -917,17 +862,23 @@ dependencies = [ [[package]] name = "devise_core" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" +checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" dependencies = [ "bitflags 2.6.0", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.68", + "syn 2.0.87", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "difflib" version = "0.4.0" @@ -986,6 +937,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "downcast" version = "0.11.0" @@ -998,6 +960,18 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "either" version = "1.13.0" @@ -1021,13 +995,33 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1050,17 +1044,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "event-listener" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - [[package]] name = "event-listener" version = "5.3.1" @@ -1093,9 +1076,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "figment" @@ -1132,6 +1115,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1149,9 +1138,9 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1164,9 +1153,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1174,15 +1163,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1191,9 +1180,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -1212,11 +1201,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 2.1.0", + "fastrand 2.2.0", "futures-core", "futures-io", "parking", @@ -1225,26 +1214,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -1254,9 +1243,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1300,15 +1289,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -1318,9 +1309,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "gloo-timers" -version = "0.2.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" dependencies = [ "futures-channel", "futures-core", @@ -1349,9 +1340,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ "atomic-waker", "bytes", @@ -1368,12 +1359,37 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "headers" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" +dependencies = [ + "base64 0.21.7", + "bytes", + "headers-core", + "http 1.1.0", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http 1.1.0", ] [[package]] @@ -1438,9 +1454,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.1.0", @@ -1455,21 +1471,15 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "pin-project-lite", ] -[[package]] -name = "http-range-header" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" - [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1491,7 +1501,7 @@ dependencies = [ "crossbeam-utils", "form_urlencoded", "futures-util", - "hyper 0.14.29", + "hyper 0.14.31", "isahc", "lazy_static", "levenshtein", @@ -1513,9 +1523,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.29" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -1528,7 +1538,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", "tower-service", "tracing", @@ -1537,16 +1547,16 @@ dependencies = [ [[package]] name = "hyper" -version = "1.3.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", "itoa", "pin-project-lite", @@ -1556,76 +1566,82 @@ dependencies = [ ] [[package]] -name = "hyper-rustls" -version = "0.24.2" +name = "hyper-http-proxy" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "5d06dbdfbacf34d996c6fb540a71a684a7aae9056c71951163af8a8a4c07b9a4" dependencies = [ + "bytes", "futures-util", - "http 0.2.12", - "hyper 0.14.29", - "log", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", + "headers", + "http 1.1.0", + "hyper 1.5.0", + "hyper-rustls", + "hyper-util", + "pin-project-lite", + "rustls-native-certs 0.7.3", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls 0.26.0", + "tower-service", ] [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.3.1", + "hyper 1.5.0", "hyper-util", - "rustls 0.23.10", - "rustls-native-certs 0.7.0", + "log", + "rustls 0.23.16", + "rustls-native-certs 0.8.0", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", "tower-service", + "webpki-roots", ] [[package]] name = "hyper-timeout" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 0.14.29", + "hyper 1.5.0", + "hyper-util", "pin-project-lite", "tokio", - "tokio-io-timeout", + "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.5" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", - "hyper 1.3.1", + "http-body 1.0.1", + "hyper 1.5.0", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1644,6 +1660,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1652,25 +1786,42 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] name = "indexmap" -version = "2.2.6" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown", "serde", ] +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + [[package]] name = "inlinable_string" version = "0.1.15" @@ -1679,9 +1830,9 @@ checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" [[package]] name = "insta" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6593a41c7a73841868772495db7dc1e8ecab43bb5c0b6da2059246c4b506ab60" +checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8" dependencies = [ "console", "lazy_static", @@ -1691,12 +1842,16 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c" +checksum = "b829f37dead9dc39df40c2d3376c179fdfd2ac771f53f55d3c30dc096a3c0c6e" dependencies = [ + "darling", + "indoc", + "pretty_assertions", + "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -1708,39 +1863,28 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "isahc" @@ -1804,24 +1948,13 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] -[[package]] -name = "json-patch" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" -dependencies = [ - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "json-patch" version = "3.0.1" @@ -1831,7 +1964,7 @@ dependencies = [ "jsonptr", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1840,21 +1973,23 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b15fa8e1747529b482cda6caff763a207911b7bcb3352130f20520a3cf0087" dependencies = [ - "json-patch 3.0.1", + "json-patch", "jsonptr", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] -name = "jsonpath_lib" -version = "0.3.0" +name = "jsonpath-rust" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" +checksum = "69a61b87f6a55cc6c28fed5739dd36b9642321ce63e4a5e4a4715d69106f4a10" dependencies = [ - "log", - "serde", + "pest", + "pest_derive", + "regex", "serde_json", + "thiserror 1.0.69", ] [[package]] @@ -1869,26 +2004,21 @@ dependencies = [ [[package]] name = "k8s-openapi" -version = "0.19.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95578de7d6eac4fba42114bc751e38c59a739968769df1be56feba6f17fd148e" +checksum = "9c8847402328d8301354c94d605481f25a6bdc1ed65471fd96af8eca71141b13" dependencies = [ - "base64 0.21.7", - "bytes", + "base64 0.22.1", "chrono", - "http 0.2.12", - "percent-encoding", "serde", "serde-value", "serde_json", - "url", ] [[package]] name = "kube" -version = "0.85.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a189cb8721a47de68d883040713bbb9c956763d784fcf066828018d32c180b96" +version = "0.96.0" +source = "git+https://github.com/kube-rs/kube?rev=8b5230f#8b5230f908aeec5659168500fa3131b5148d7f1b" dependencies = [ "k8s-openapi", "kube-client", @@ -1899,33 +2029,34 @@ dependencies = [ [[package]] name = "kube-client" -version = "0.85.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98989b6e1f27695afe22aa29c94136fa06be5e8d28b91222e6dfbe5a460c803f" +version = "0.96.0" +source = "git+https://github.com/kube-rs/kube?rev=8b5230f#8b5230f908aeec5659168500fa3131b5148d7f1b" dependencies = [ - "base64 0.20.0", + "base64 0.22.1", "bytes", "chrono", "either", "futures", "home", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.29", - "hyper-rustls 0.24.2", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.0", + "hyper-http-proxy", + "hyper-rustls", "hyper-timeout", - "jsonpath_lib", + "hyper-util", + "jsonpath-rust", "k8s-openapi", "kube-core", "pem", - "pin-project", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", + "rustls 0.23.16", + "rustls-pemfile 2.2.0", "secrecy", "serde", "serde_json", "serde_yaml", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "tower", @@ -1935,56 +2066,55 @@ dependencies = [ [[package]] name = "kube-core" -version = "0.85.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c24d23bf764ec9a5652f943442ff062b91fd52318ea6d2fc11115f19d8c84d13" +version = "0.96.0" +source = "git+https://github.com/kube-rs/kube?rev=8b5230f#8b5230f908aeec5659168500fa3131b5148d7f1b" dependencies = [ "chrono", "form_urlencoded", - "http 0.2.12", - "json-patch 1.4.0", + "http 1.1.0", + "json-patch", "k8s-openapi", - "once_cell", "schemars", "serde", + "serde-value", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "kube-derive" -version = "0.85.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbec4da219dcb02bb32afd762a7ac4dffd47ed92b7e35ac9a7b961d21327117" +version = "0.96.0" +source = "git+https://github.com/kube-rs/kube?rev=8b5230f#8b5230f908aeec5659168500fa3131b5148d7f1b" dependencies = [ - "darling 0.14.4", + "darling", "proc-macro2", "quote", "serde_json", - "syn 1.0.109", + "syn 2.0.87", ] [[package]] name = "kube-runtime" -version = "0.85.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381224caa8a6fc16f8251cf1fd6d8678cdf5366f33000a923e4c54192e4b25b5" +version = "0.96.0" +source = "git+https://github.com/kube-rs/kube?rev=8b5230f#8b5230f908aeec5659168500fa3131b5148d7f1b" dependencies = [ "ahash", + "async-broadcast", + "async-stream", "async-trait", "backoff", - "derivative", + "educe", "futures", "hashbrown", - "json-patch 1.4.0", + "json-patch", + "jsonptr", "k8s-openapi", "kube-client", "parking_lot", "pin-project", "serde", "serde_json", - "smallvec", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "tracing", @@ -2013,7 +2143,7 @@ dependencies = [ "petgraph", "pico-args", "regex", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "string_cache", "term", "tiny-keccak", @@ -2027,7 +2157,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.7", + "regex-automata 0.4.9", ] [[package]] @@ -2044,9 +2174,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libnghttp2-sys" @@ -2070,9 +2200,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.18" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ "cc", "libc", @@ -2088,15 +2218,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] -name = "linux-raw-sys" -version = "0.4.14" +name = "litemap" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "lock_api" @@ -2134,9 +2264,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ "hashbrown", ] @@ -2180,22 +2310,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", + "adler2", ] [[package]] @@ -2316,18 +2435,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.0" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "object_store" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a0c4b3a0e31f8b66f71ad8064521efa773910196e2cde791436f13409f3b45" +checksum = "6eb4c22c6154a1e759d7099f9ffad7cc5ef8245f9efbab4a41b92623079c82f3" dependencies = [ "async-trait", "base64 0.22.1", @@ -2335,16 +2454,16 @@ dependencies = [ "chrono", "futures", "humantime", - "hyper 1.3.1", + "hyper 1.5.0", "itertools 0.13.0", "md-5", "parking_lot", "percent-encoding", "quick-xml", "rand", - "reqwest 0.12.5", + "reqwest", "ring", - "rustls-pemfile 2.1.2", + "rustls-pemfile 2.2.0", "serde", "serde_json", "snafu", @@ -2356,9 +2475,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl-probe" @@ -2368,9 +2487,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -2401,9 +2520,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -2425,14 +2544,13 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] -name = "parse_datetime_fork" -version = "0.6.0-custom" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046ad1c286232a331a00b746a1a2acd57e6d246c95329f023f4b96a948c03875" +name = "parse_datetime" +version = "0.6.0" +source = "git+https://github.com/uutils/parse_datetime?rev=5e3fc53#5e3fc539a3d478809c58b2093cfa3d1cabb79b2c" dependencies = [ "chrono", "nom", @@ -2465,16 +2583,17 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "pem" -version = "1.1.1" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.13.1", + "base64 0.22.1", + "serde", ] [[package]] @@ -2483,6 +2602,51 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +dependencies = [ + "memchr", + "thiserror 1.0.69", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "pest_meta" +version = "2.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "petgraph" version = "0.6.5" @@ -2510,29 +2674,29 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2542,20 +2706,20 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.0", + "fastrand 2.2.0", "futures-io", ] [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polling" @@ -2575,17 +2739,17 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.2" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.34", + "rustix", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2596,9 +2760,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -2622,25 +2789,35 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" +checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" [[package]] name = "predicates-tree" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" dependencies = [ "predicates-core", "termtree", ] +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -2653,16 +2830,16 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "version_check", "yansi", ] [[package]] name = "quick-xml" -version = "0.36.1" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" dependencies = [ "memchr", "serde", @@ -2670,56 +2847,61 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.2" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 1.1.0", - "rustls 0.23.10", - "thiserror", + "rustc-hash", + "rustls 0.23.16", + "socket2", + "thiserror 2.0.3", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", - "rustc-hash 2.0.0", - "rustls 0.23.10", + "rustc-hash", + "rustls 0.23.16", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.3", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", - "socket2 0.5.7", + "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -2777,22 +2959,22 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2812,19 +2994,19 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -2838,13 +3020,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -2855,9 +3037,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "relative-path" @@ -2867,61 +3049,20 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.29", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg 0.50.0", -] - -[[package]] -name = "reqwest" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", "futures-core", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.3.1", - "hyper-rustls 0.27.2", + "hyper 1.5.0", + "hyper-rustls", "hyper-util", "ipnet", "js-sys", @@ -2931,9 +3072,9 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.10", - "rustls-native-certs 0.7.0", - "rustls-pemfile 2.1.2", + "rustls 0.23.16", + "rustls-native-certs 0.8.0", + "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", @@ -2948,7 +3089,8 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "winreg 0.52.0", + "webpki-roots", + "windows-registry", ] [[package]] @@ -3038,7 +3180,7 @@ dependencies = [ "proc-macro2", "quote", "rocket_http", - "syn 2.0.68", + "syn 2.0.87", "unicode-xid", "version_check", ] @@ -3053,7 +3195,7 @@ dependencies = [ "either", "futures", "http 0.2.12", - "hyper 0.14.29", + "hyper 0.14.31", "indexmap", "log", "memchr", @@ -3098,21 +3240,15 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.68", + "syn 2.0.87", "unicode-ident", ] -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" +[[package]] +name = "rustc-demangle" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3122,37 +3258,23 @@ checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.34" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.14", + "linux-raw-sys", "windows-sys 0.52.0", ] @@ -3170,38 +3292,40 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.10" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ + "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.4", + "rustls-webpki 0.102.8", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.4", + "rustls-pemfile 2.2.0", + "rustls-pki-types", "schannel", "security-framework", ] [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.2", + "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -3218,19 +3342,21 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -3244,9 +3370,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -3255,9 +3381,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -3276,11 +3402,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3305,7 +3431,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3332,19 +3458,18 @@ dependencies = [ [[package]] name = "secrecy" -version = "0.8.0" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" dependencies = [ - "serde", "zeroize", ] [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -3355,9 +3480,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -3371,9 +3496,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -3390,13 +3515,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3407,7 +3532,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3416,7 +3541,6 @@ version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ - "indexmap", "itoa", "memchr", "ryu", @@ -3435,9 +3559,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -3467,6 +3591,28 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -3476,6 +3622,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook" version = "0.3.17" @@ -3493,7 +3645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", - "mio 1.0.2", + "mio", "signal-hook", ] @@ -3508,9 +3660,9 @@ dependencies = [ [[package]] name = "similar" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" [[package]] name = "siphasher" @@ -3540,23 +3692,23 @@ dependencies = [ "async-trait", "bytes", "clockabilly", - "http 0.2.12", + "http 1.1.0", "httpmock", "k8s-openapi", "kube", "lazy_static", "mockall", "object_store", - "parse_datetime_fork", + "parse_datetime", "paste", "regex", - "reqwest 0.11.27", + "reqwest", "rstest", "schemars", "serde", "serde_json", "sk-api", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-subscriber", @@ -3577,14 +3729,14 @@ dependencies = [ "k8s-openapi", "kube", "object_store", - "reqwest 0.11.27", + "reqwest", "rstest", "schemars", "serde", "serde_json", "sk-api", "sk-core", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-test", @@ -3599,7 +3751,6 @@ dependencies = [ "clockabilly", "either", "httpmock", - "json-patch 1.4.0", "json-patch-ext", "k8s-openapi", "kube", @@ -3611,7 +3762,7 @@ dependencies = [ "sk-api", "sk-core", "sk-store", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-test", @@ -3623,6 +3774,7 @@ version = "1.1.1" dependencies = [ "anyhow", "assertables", + "async-trait", "clockabilly", "futures", "k8s-openapi", @@ -3635,7 +3787,7 @@ dependencies = [ "serde_yaml", "sk-api", "sk-core", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-test", @@ -3681,7 +3833,7 @@ dependencies = [ "kube", "lazy_static", "ratatui", - "reqwest 0.11.27", + "reqwest", "rstest", "serde", "serde_json", @@ -3720,33 +3872,23 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snafu" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b835cb902660db3415a672d862905e791e54d306c6e8189168c7f3d9ae1c79d" +checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" dependencies = [ "snafu-derive", ] [[package]] name = "snafu-derive" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d1e02fca405f6280643174a50c942219f0bbf4dbf7d480f1dd864d6f211ae5" +checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.68", -] - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", + "syn 2.0.87", ] [[package]] @@ -3774,6 +3916,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "state" version = "0.6.0" @@ -3802,12 +3950,6 @@ dependencies = [ "precomputed-hash", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -3833,7 +3975,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3855,9 +3997,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.68" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -3875,38 +4017,32 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", + "futures-core", ] [[package]] -name = "system-configuration-sys" -version = "0.5.0" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "core-foundation-sys", - "libc", + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] name = "tempfile" -version = "3.10.1" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.0", - "rustix 0.38.34", - "windows-sys 0.52.0", + "fastrand 2.2.0", + "once_cell", + "rustix", + "windows-sys 0.59.0", ] [[package]] @@ -3928,22 +4064,42 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +dependencies = [ + "thiserror-impl 2.0.3", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3996,11 +4152,21 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -4013,41 +4179,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", "libc", - "mio 0.8.11", - "num_cpus", + "mio", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2", "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-io-timeout" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" -dependencies = [ - "pin-project-lite", - "tokio", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -4066,16 +4221,16 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.10", + "rustls 0.23.16", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -4084,9 +4239,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -4098,9 +4253,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", @@ -4110,18 +4265,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.14" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", @@ -4132,14 +4287,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 0.1.2", "tokio", "tokio-util", "tower-layer", @@ -4149,18 +4304,15 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.4.4" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" +checksum = "8437150ab6bbc8c5f0f519e3d5ed4aa883a83dd4cdd3d1b21f9482936046cb97" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.6.0", "bytes", - "futures-core", - "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "http-range-header", + "http 1.1.0", + "http-body 1.0.1", "mime", "pin-project-lite", "tower-layer", @@ -4170,15 +4322,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -4200,7 +4352,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -4270,7 +4422,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -4294,6 +4446,12 @@ dependencies = [ "serde", ] +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uncased" version = "0.9.10" @@ -4304,26 +4462,11 @@ dependencies = [ "version_check", ] -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-segmentation" @@ -4350,9 +4493,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsafe-libyaml" @@ -4368,15 +4511,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -4391,9 +4546,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" [[package]] name = "vcpkg" @@ -4403,9 +4558,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "waker-fn" @@ -4440,34 +4595,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -4477,9 +4633,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4487,28 +4643,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -4519,9 +4675,19 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -4529,9 +4695,12 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "winapi" @@ -4551,11 +4720,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4579,7 +4748,37 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -4597,7 +4796,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -4617,18 +4825,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -4639,9 +4847,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -4651,9 +4859,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -4663,15 +4871,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -4681,9 +4889,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -4693,9 +4901,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -4705,9 +4913,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -4717,38 +4925,30 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.13" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] [[package]] -name = "winreg" -version = "0.50.0" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] -name = "winreg" -version = "0.52.0" +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "yansi" @@ -4759,24 +4959,70 @@ dependencies = [ "is-terminal", ] +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -4784,3 +5030,25 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] diff --git a/Cargo.toml b/Cargo.toml index c7caa4c2..97a16ebe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,53 +27,51 @@ sk-api = { version = "1.1.1", path = "sk-api" } sk-core = { version = "1.1.1", path = "sk-core" } sk-store = { version = "1.1.1", path = "sk-store" } -anyhow = { version = "1.0.75", features = ["backtrace"] } -async-recursion = "1.0.5" -async-trait = "0.1.80" -bytes = "1.5.0" +anyhow = { version = "1.0.93", features = ["backtrace"] } +async-recursion = "1.1.1" +async-trait = "0.1.83" +bytes = "1.8.0" chrono = "0.4.38" -clap = { version = "4.3.21", features = ["cargo", "derive", "string"] } -clap_complete = "4.5.6" -clockabilly = "0.1.0" +clap = { version = "4.5.21", features = ["cargo", "derive", "string"] } +clap_complete = "4.5.38" +clockabilly = "0.1.1" derive_setters = "0.1.6" dirs = "5.0.1" -either = "1.12.0" -futures = "0.3.28" -# remove this when we bump kube-rs -json-patch = { version = "1.0.0" } +either = "1.13.0" +futures = "0.3.31" json-patch-ext = "0.1.0" -k8s-openapi = { version = "0.19.0", features = ["v1_27"] } +k8s-openapi = { version = "0.23.0", features = ["v1_27"] } lazy_static = "1.5.0" -object_store = { version = "0.11.0", features = ["aws", "gcp", "azure", "http"] } -# remove this fork once https://github.com/uutils/parse_datetime/pull/80 is merged and a new version released -parse_datetime_fork = { version = "0.6.0-custom" } -paste = "1.0.14" +object_store = { version = "0.11.1", features = ["aws", "gcp", "azure", "http"] } +parse_datetime = { git="https://github.com/uutils/parse_datetime", rev = "5e3fc53" } +paste = "1.0.15" ratatui = "0.28.1" -regex = "1.10.2" -reqwest = { version = "0.11.18", default-features = false, features = ["json", "rustls-tls"] } -rmp-serde = "1.1.2" -rocket = { version = "0.5.0", features = ["json", "tls"] } -schemars = { version = "0.8.12", features = ["chrono"] } -serde = "1.0.188" -serde_json = "1.0.105" -serde_yaml = "0.9.25" -thiserror = "1.0.46" -tokio = { version = "1.28.2", features = ["io-util", "macros", "process", "rt-multi-thread", "signal"] } -tracing = "0.1.37" +regex = "1.11.1" +reqwest = { version = "0.12.9", default-features = false, features = ["json", "rustls-tls"] } +rmp-serde = "1.3.0" +rocket = { version = "0.5.1", features = ["json", "tls"] } +schemars = { version = "0.8.21", features = ["chrono"] } +serde = "1.0.215" +serde_json = "1.0.132" +serde_yaml = "0.9.34" +thiserror = "1.0.69" +tokio = { version = "1.41.1", features = ["io-util", "macros", "process", "rt-multi-thread", "signal"] } +tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } -url = "2.4.1" +url = "2.5.3" # test dependencies assertables = "8.18.0" -http = "0.2.9" +http = "1.1.0" httpmock = "0.6.8" -hyper = "0.14.27" -insta = "1.40.0" +hyper = "1.5.0" +insta = "1.41.1" mockall = "0.11.4" rstest = "0.18.2" -tracing-test = "0.2.4" +tracing-test = "0.2.5" [workspace.dependencies.kube] -version = "0.85.0" +rev = "8b5230f" +git = "https://github.com/kube-rs/kube" features = ["client", "derive", "runtime", "rustls-tls", "admission", "unstable-runtime"] default-features = false diff --git a/examples/tracer_config.yml b/examples/tracer_config.yml index a4465211..d786b2b6 100644 --- a/examples/tracer_config.yml +++ b/examples/tracer_config.yml @@ -2,3 +2,5 @@ trackedObjects: apps/v1.Deployment: podSpecTemplatePath: /spec/template + v1.ServiceAccount: {} + v1.ConfigMap: {} diff --git a/sk-cli/src/snapshot.rs b/sk-cli/src/snapshot.rs index 05595ef6..e39c0820 100644 --- a/sk-cli/src/snapshot.rs +++ b/sk-cli/src/snapshot.rs @@ -13,13 +13,15 @@ use sk_api::v1::ExportFilters; use sk_core::k8s::ApiSet; use sk_core::prelude::*; use sk_store::watchers::{ - DynObjWatcher, - PodWatcher, + DynObjHandler, + ObjWatcher, + PodHandler, }; use sk_store::{ TraceStore, TracerConfig, }; +use tokio::task::JoinSet; #[derive(clap::Args)] pub struct Args { @@ -53,24 +55,26 @@ pub async fn cmd(args: &Args) -> EmptyResult { println!("Loading snapshot into store..."); let store = Arc::new(Mutex::new(TraceStore::new(config.clone()))); - let (dyn_obj_watcher, do_ready_rx) = - DynObjWatcher::new(store.clone(), &mut apiset, &config.tracked_objects).await?; - let (pod_watcher, pod_ready_rx) = PodWatcher::new(client, store.clone(), apiset); + let mut js = JoinSet::new(); + let mut do_ready_rxs = vec![]; + for gvk in config.tracked_objects.keys() { + let (dyn_obj_handler, dyn_obj_stream) = DynObjHandler::new_with_stream(gvk, &mut apiset).await?; + let (dyn_obj_watcher, do_ready_rx) = ObjWatcher::new(dyn_obj_handler, dyn_obj_stream, store.clone()); + do_ready_rxs.push(do_ready_rx); + js.spawn(dyn_obj_watcher.start()); + } - let do_handle = tokio::spawn(dyn_obj_watcher.start()); - let pod_handle = tokio::spawn(pod_watcher.start()); + let (pod_handler, pod_stream) = PodHandler::new_with_stream(client, apiset); + let (pod_watcher, pod_ready_rx) = ObjWatcher::new(pod_handler, pod_stream, store.clone()); + js.spawn(pod_watcher.start()); // the receivers block until they get a message, so don't actually care about the value - let _ = do_ready_rx.recv(); + for do_ready_rx in do_ready_rxs { + let _ = do_ready_rx.recv(); + } let _ = pod_ready_rx.recv(); - do_handle.abort(); - pod_handle.abort(); - - // When I don't await the tasks, it seems like it hangs. I'm not 100% this was actually - // the issue though, it seemed a bit erratic. - let _ = do_handle.await; - let _ = pod_handle.await; + js.shutdown().await; println!("Exporting snapshot data from store..."); let filters = ExportFilters::new(args.excluded_namespaces.clone(), vec![], true); diff --git a/sk-core/Cargo.toml b/sk-core/Cargo.toml index 9796dde9..10ee3fb0 100644 --- a/sk-core/Cargo.toml +++ b/sk-core/Cargo.toml @@ -20,7 +20,7 @@ clockabilly = { workspace = true } kube = { workspace = true } k8s-openapi = { workspace = true } object_store = { workspace = true } -parse_datetime_fork = { workspace = true } +parse_datetime = { workspace = true } paste = { workspace = true } regex = { workspace = true } reqwest = { workspace = true } diff --git a/sk-core/src/external_storage.rs b/sk-core/src/external_storage.rs index 94baa304..b1636292 100644 --- a/sk-core/src/external_storage.rs +++ b/sk-core/src/external_storage.rs @@ -30,8 +30,6 @@ use std::path::{ use anyhow::anyhow; use async_trait::async_trait; use bytes::Bytes; -#[cfg(feature = "testutils")] -use mockall::automock; use object_store::path::Path; use object_store::{ DynObjectStore, @@ -113,6 +111,9 @@ fn parse_path(path_str: &str) -> anyhow::Result<(ObjectStoreScheme, Path)> { Ok(ObjectStoreScheme::parse(&url)?) } +#[cfg(feature = "testutils")] +use mockall::automock; + #[cfg(test)] mod test { use rstest::*; diff --git a/sk-core/src/k8s/pod_lifecycle.rs b/sk-core/src/k8s/pod_lifecycle.rs index 4c4157b9..fe2edd6d 100644 --- a/sk-core/src/k8s/pod_lifecycle.rs +++ b/sk-core/src/k8s/pod_lifecycle.rs @@ -5,7 +5,6 @@ use std::cmp::{ Ordering, }; -use clockabilly::Clockable; use tracing::*; use super::*; @@ -109,10 +108,9 @@ impl PodLifecycleData { pub fn guess_finished_lifecycle( pod: &corev1::Pod, current_lifecycle_data: &PodLifecycleData, - clock: &(dyn Clockable + Send), + now: i64, ) -> anyhow::Result { let new_lifecycle_data = PodLifecycleData::new_for(pod).unwrap_or(PodLifecycleData::Empty); - let now = clock.now_ts(); match new_lifecycle_data { PodLifecycleData::Finished(..) => Ok(new_lifecycle_data), diff --git a/sk-core/src/k8s/testutils/fake.rs b/sk-core/src/k8s/testutils/fake.rs index f51a71b4..4b8b6ef1 100644 --- a/sk-core/src/k8s/testutils/fake.rs +++ b/sk-core/src/k8s/testutils/fake.rs @@ -69,19 +69,7 @@ impl MockServerBuilder { pub fn make_fake_apiserver() -> (MockServerBuilder, kube::Client) { let builder = MockServerBuilder::new(); - let config = kube::Config { - cluster_url: builder.url(), - default_namespace: "default".into(), - root_cert: None, - connect_timeout: None, - read_timeout: None, - write_timeout: None, - accept_invalid_certs: true, - auth_info: Default::default(), - proxy_url: None, - tls_server_name: None, - }; - + let config = kube::Config::new(builder.url()); let client = kube::Client::try_from(config).unwrap(); (builder, client) } diff --git a/sk-core/src/time.rs b/sk-core/src/time.rs index dd2c1253..68b10862 100644 --- a/sk-core/src/time.rs +++ b/sk-core/src/time.rs @@ -2,7 +2,7 @@ use clockabilly::{ DateTime, Local, }; -use parse_datetime_fork::{ +use parse_datetime::{ parse_datetime, parse_datetime_at_date, }; diff --git a/sk-ctrl/src/objects.rs b/sk-ctrl/src/objects.rs index 56daa398..ed949dcb 100644 --- a/sk-ctrl/src/objects.rs +++ b/sk-ctrl/src/objects.rs @@ -201,7 +201,7 @@ pub fn build_driver_job( secrets_list .iter() .map(|s| corev1::EnvFromSource { - secret_ref: Some(corev1::SecretEnvSource { name: Some(s.clone()), optional: Some(false) }), + secret_ref: Some(corev1::SecretEnvSource { name: s.clone(), optional: Some(false) }), ..Default::default() }) .collect() diff --git a/sk-driver/Cargo.toml b/sk-driver/Cargo.toml index 76d674e7..cf4ed463 100644 --- a/sk-driver/Cargo.toml +++ b/sk-driver/Cargo.toml @@ -18,7 +18,6 @@ clockabilly = { workspace = true } either = { workspace = true } kube = { workspace = true } k8s-openapi = { workspace = true } -json-patch = { workspace = true } json-patch-ext = { workspace = true } rocket = { workspace = true } serde_json = { workspace = true } diff --git a/sk-driver/src/mutation.rs b/sk-driver/src/mutation.rs index 5706097b..c9e5e616 100644 --- a/sk-driver/src/mutation.rs +++ b/sk-driver/src/mutation.rs @@ -1,12 +1,13 @@ use std::collections::HashMap; use std::sync::Mutex; -use json_patch::{ - AddOperation, +use json_patch_ext::{ + add_operation, + escape, + format_ptr, Patch, PatchOperation, }; -use json_patch_ext::escape; use kube::core::admission::{ AdmissionRequest, AdmissionResponse, @@ -90,26 +91,14 @@ pub async fn mutate_pod( return Ok(resp); } - let mut patches = vec![]; - add_simulation_labels(ctx, pod, &mut patches)?; + let mut patches = + vec![add_operation(format_ptr!("/metadata/labels/{}", escape(SIMULATION_LABEL_KEY)), json!(ctx.name))]; add_lifecycle_annotation(ctx, pod, &owners, mut_data, &mut patches)?; add_node_selector_tolerations(pod, &mut patches)?; Ok(resp.with_patch(Patch(patches))?) } -fn add_simulation_labels(ctx: &DriverContext, pod: &corev1::Pod, patches: &mut Vec) -> EmptyResult { - if pod.metadata.labels.is_none() { - patches.push(PatchOperation::Add(AddOperation { path: "/metadata/labels".into(), value: json!({}) })); - } - patches.push(PatchOperation::Add(AddOperation { - path: format!("/metadata/labels/{}", escape(SIMULATION_LABEL_KEY)), - value: Value::String(ctx.name.clone()), - })); - - Ok(()) -} - fn add_lifecycle_annotation( ctx: &DriverContext, pod: &corev1::Pod, @@ -132,10 +121,7 @@ fn add_lifecycle_annotation( if let Some(patch) = to_annotation_patch(&lifecycle) { info!("applying lifecycle annotations (hash={hash}, seq={seq})"); if pod.metadata.annotations.is_none() { - patches.push(PatchOperation::Add(AddOperation { - path: "/metadata/annotations".into(), - value: json!({}), - })); + patches.push(add_operation(format_ptr!("/metadata/annotations"), json!({}))); } patches.push(patch); break; @@ -150,16 +136,13 @@ fn add_lifecycle_annotation( fn add_node_selector_tolerations(pod: &corev1::Pod, patches: &mut Vec) -> EmptyResult { if pod.spec()?.tolerations.is_none() { - patches.push(PatchOperation::Add(AddOperation { path: "/spec/tolerations".into(), value: json!([]) })); + patches.push(add_operation(format_ptr!("/spec/tolerations"), json!([]))); } - patches.push(PatchOperation::Add(AddOperation { - path: "/spec/nodeSelector".into(), - value: json!({"type": "virtual"}), - })); - patches.push(PatchOperation::Add(AddOperation { - path: "/spec/tolerations/-".into(), - value: json!({"key": VIRTUAL_NODE_TOLERATION_KEY, "operator": "Exists", "effect": "NoSchedule"}), - })); + patches.push(add_operation(format_ptr!("/spec/nodeSelector"), json!({"type": "virtual"}))); + patches.push(add_operation( + format_ptr!("/spec/tolerations/-"), + json!({"key": VIRTUAL_NODE_TOLERATION_KEY, "operator": "Exists", "effect": "NoSchedule"}), + )); Ok(()) } @@ -177,9 +160,9 @@ fn into_pod_review(resp: AdmissionResponse) -> AdmissionReview { fn to_annotation_patch(pld: &PodLifecycleData) -> Option { match pld { PodLifecycleData::Empty | PodLifecycleData::Running(_) => None, - PodLifecycleData::Finished(start_ts, end_ts) => Some(PatchOperation::Add(AddOperation { - path: format!("/metadata/annotations/{}", escape(LIFETIME_ANNOTATION_KEY)), - value: Value::String(format!("{}", end_ts - start_ts)), - })), + PodLifecycleData::Finished(start_ts, end_ts) => Some(add_operation( + format_ptr!("/metadata/annotations/{}", escape(LIFETIME_ANNOTATION_KEY)), + Value::String(format!("{}", end_ts - start_ts)), + )), } } diff --git a/sk-driver/src/tests/mutation_test.rs b/sk-driver/src/tests/mutation_test.rs index 3ab345dd..31abb344 100644 --- a/sk-driver/src/tests/mutation_test.rs +++ b/sk-driver/src/tests/mutation_test.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; -use json_patch::{ - patch, +use json_patch_ext::{ + patch_ext, Patch, }; use kube::api::TypeMeta; @@ -140,5 +140,5 @@ async fn test_mutate_pod(mut test_pod: corev1::Pod, mut adm_resp: AdmissionRespo adm_resp = mutate_pod(&ctx, adm_resp, &test_pod, &MutationData::new()).await.unwrap(); let mut json_pod = serde_json::to_value(&test_pod).unwrap(); let pod_patch: Patch = serde_json::from_slice(&adm_resp.patch.unwrap()).unwrap(); - patch(&mut json_pod, &pod_patch).unwrap(); + patch_ext(&mut json_pod, pod_patch.0[0].clone()).unwrap(); } diff --git a/sk-store/Cargo.toml b/sk-store/Cargo.toml index 155244d9..b74041d1 100644 --- a/sk-store/Cargo.toml +++ b/sk-store/Cargo.toml @@ -13,6 +13,7 @@ testutils = ["dep:mockall"] [dependencies] anyhow = { workspace = true } +async-trait = { workspace = true } clockabilly = { workspace = true } futures = { workspace = true } kube = { workspace = true } diff --git a/sk-store/src/tests/import_export_test.rs b/sk-store/src/tests/import_export_test.rs index 55766d96..f0536e91 100644 --- a/sk-store/src/tests/import_export_test.rs +++ b/sk-store/src/tests/import_export_test.rs @@ -16,8 +16,9 @@ use sk_core::prelude::*; use super::*; use crate::watchers::{ - DynObjWatcher, - KubeObjectStream, + DynObjHandler, + ObjStream, + ObjWatcher, }; use crate::TraceStore; @@ -25,10 +26,6 @@ fn d(idx: i64) -> DynamicObject { test_deployment(&format!("depl{idx}")) } -fn ds(idx: i64) -> DynamicObject { - test_daemonset(&format!("ds{idx}")) -} - // Set up a test stream to ensure that imports and exports work correctly. // // We use stream::unfold to build a stream from a set of events; the unfold takes a "state" tuple @@ -36,80 +33,63 @@ fn ds(idx: i64) -> DynamicObject { // // This is a little subtle because the event that we're returning at state (ts_i, id) does not // actually _happen_ until time ts_{i+1}. -fn test_stream(clock: MockUtcClock) -> KubeObjectStream { - stream::unfold((-1, 0), move |state| { +fn test_stream(clock: MockUtcClock) -> ObjStream { + stream::unfold((-1, -1), move |state| { let mut c = clock.clone(); async move { match state { - // Initial conditions: we create 10 deployments and 5 daemonsets - // These are handled by different watchers, so they appear as different events. - // I didn't really set up this test to handle multiple events happening at the - // same time so I'm just having the deployments created first and the daemonsets - // created at the next timestep. - (-1, id) => { - let objs: Vec<_> = (0..10).map(|i| d(i)).collect(); - return Some((Ok((DEPL_GVK.clone(), Event::Restarted(objs))), (0, id))); + // Initial conditions: we create 10 deployments + (-1, -1) => { + return Some((Ok(Event::Init), (-1, 0))); }, - (0, id) => { - let objs: Vec<_> = (0..5).map(|i| ds(i)).collect(); - let new_ts = c.advance(1); - return Some((Ok((DS_GVK.clone(), Event::Restarted(objs))), (new_ts, id))); + + (-1, id) if id < 10 => { + let obj = d(id); + return Some((Ok(Event::InitApply(obj)), (-1, id + 1))); + }, + + (-1, 10) => { + return Some((Ok(Event::InitDone), (0, 0))); }, - // We recreate one of the pods at time one just to make sure there's + // We recreate one of the pods at time zero just to make sure there's // no weird duplicate behaviours - (1, id) => { + (0, id) => { let obj = d(id); let new_ts = c.advance(5); - return Some((Ok((DEPL_GVK.clone(), Event::Applied(obj))), (new_ts, id))); + return Some((Ok(Event::Apply(obj)), (new_ts, id))); }, // From times 10..20, we delete one of the regular pods (5..=19, id) => { let obj = d(id); let new_ts = c.advance(5); - return Some((Ok((DEPL_GVK.clone(), Event::Deleted(obj))), (new_ts, id + 1))); + return Some((Ok(Event::Delete(obj)), (new_ts, id + 1))); }, // In times 20..25, we test the various filter options: - // - two DS pods are created // - a kube-system pod is created // - a label-selector pod is created // // In the test below, all of these events should be filtered out - (20, id) => { - let obj = ds(7); - let new_ts = c.advance(1); - return Some((Ok((DS_GVK.clone(), Event::Applied(obj))), (new_ts, id))); - }, - (21, id) => { - let obj = ds(8); - let new_ts = c.advance(1); - return Some((Ok((DS_GVK.clone(), Event::Applied(obj))), (new_ts, id))); - }, (22, id) => { let mut obj = d(30); obj.metadata.namespace = Some("kube-system".into()); let new_ts = c.advance(1); - return Some((Ok((DEPL_GVK.clone(), Event::Applied(obj))), (new_ts, id))); - }, - (23, id) => { - let obj = ds(1); - let new_ts = c.advance(1); - return Some((Ok((DS_GVK.clone(), Event::Deleted(obj))), (new_ts, id))); + return Some((Ok(Event::Apply(obj)), (new_ts, id))); }, (24, id) => { let mut obj = d(31); obj.labels_mut().insert("foo".into(), "bar".into()); let new_ts = c.advance(1); - return Some((Ok((DEPL_GVK.clone(), Event::Applied(obj))), (new_ts, id))); + return Some((Ok(Event::Apply(obj)), (new_ts, id))); }, // Lastly we delete the remaining "regular" pods (25..=55, id) => { let obj = d(id); let new_ts = c.advance(5); - return Some((Ok((DEPL_GVK.clone(), Event::Deleted(obj))), (new_ts, id + 1))); + return Some((Ok(Event::Delete(obj)), (new_ts, id + 1))); }, _ => None, } @@ -131,7 +111,8 @@ async fn itest_export(#[case] duration: Option) { let s = Arc::new(Mutex::new(TraceStore::new(Default::default()))); // First build up the stream of test data and run the watcher (this advances time to the "end") - let w = DynObjWatcher::new_from_parts(test_stream(*clock.clone()), s.clone(), clock); + let h = DynObjHandler::new(DEPL_GVK.clone()); + let w = ObjWatcher::new_from_parts(h, test_stream(*clock.clone()), s.clone(), clock); w.start().await; // Next export the data with the chosen filters diff --git a/sk-store/src/watchers/dyn_obj_watcher.rs b/sk-store/src/watchers/dyn_obj_watcher.rs index 62509355..33fd5236 100644 --- a/sk-store/src/watchers/dyn_obj_watcher.rs +++ b/sk-store/src/watchers/dyn_obj_watcher.rs @@ -1,33 +1,15 @@ -use std::collections::HashMap; -use std::pin::Pin; -use std::sync::mpsc::{ - Receiver, - Sender, -}; use std::sync::{ - mpsc, Arc, Mutex, }; -use clockabilly::{ - Clockable, - UtcClock, -}; -use futures::stream::select_all::{ - select_all, - SelectAll, -}; +use async_trait::async_trait; use futures::{ - Stream, StreamExt, TryStreamExt, }; use kube::api::DynamicObject; -use kube::runtime::watcher::{ - watcher, - Event, -}; +use kube::runtime::watcher::watcher; use kube::runtime::WatchStreamExt; use sk_core::errors::*; use sk_core::k8s::{ @@ -35,128 +17,82 @@ use sk_core::k8s::{ ApiSet, GVK, }; -use tracing::*; -use crate::{ - TraceStorable, - TraceStore, - TrackedObjectConfig, +use crate::watchers::{ + EventHandler, + ObjStream, }; - -pub type KubeObjectStream = Pin)>> + Send>>; +use crate::TraceStorable; // Watch a (customizable) list of objects. Since we don't know what these object types will be at // runtime, we have to use the DynamicObject API, which gives us everything in JSON format that we // have to parse. Unlike the pod watcher, this is pretty straightforward. We just forward all the // events that we receive to the object store. -pub struct DynObjWatcher { - clock: Box, - obj_stream: SelectAll, - store: Arc>, - - is_ready: bool, - ready_tx: Sender, +pub struct DynObjHandler { + gvk: GVK, } -impl DynObjWatcher { - pub async fn new( - store: Arc>, +impl DynObjHandler { + pub async fn new_with_stream( + gvk: &GVK, apiset: &mut ApiSet, - tracked_objects: &HashMap, - ) -> anyhow::Result<(DynObjWatcher, Receiver)> { - let mut apis = vec![]; - for gvk in tracked_objects.keys() { - let stream = build_stream_for_tracked_obj(apiset, gvk.clone()).await?; - apis.push(stream); - } + ) -> anyhow::Result<(Box, ObjStream)> { + // TODO if this fails (e.g., because some custom resource isn't present in the cluster) + // it will prevent the tracer from starting up + let api_version = gvk.api_version().clone(); + let kind = gvk.kind.clone(); - let (tx, rx): (Sender, Receiver) = mpsc::channel(); + // The "unnamespaced" api variant can list/watch in all namespaces + let (api, _) = apiset.unnamespaced_api_by_gvk(gvk).await?; Ok(( - DynObjWatcher { - clock: UtcClock::boxed(), - obj_stream: select_all(apis), - store, - - is_ready: false, - ready_tx: tx, - }, - rx, + Box::new(DynObjHandler { gvk: gvk.clone() }), + watcher(api.clone(), Default::default()) + // All these objects need to be cloned because they're moved into the stream here + .modify(move |obj| sanitize_obj(obj, &api_version, &kind)) + .map_err(|e| e.into()) + .boxed(), )) } +} - pub async fn start(mut self) { - while let Some(res) = self.obj_stream.next().await { - let ts = self.clock.now_ts(); - - match res { - Ok((ref gvk, evt)) => self.handle_obj_event(gvk, evt, ts).unwrap_or_else(|err| { - skerr!(err, "could not handle event"); - }), - Err(err) => { - skerr!(err, "watcher received error on stream"); - }, - } - } +#[async_trait] +impl EventHandler for DynObjHandler { + async fn applied( + &mut self, + obj: &DynamicObject, + ts: i64, + store: Arc>, + ) -> EmptyResult { + let mut s = store.lock().expect("trace store mutex poisoned"); + s.create_or_update_obj(obj, ts, None) } - fn handle_obj_event(&mut self, gvk: &GVK, evt: Event, ts: i64) -> EmptyResult { - // We don't expect the trace store to panic, but if it does we should panic here too - let mut store = self.store.lock().unwrap(); - match evt { - Event::Applied(obj) => store.create_or_update_obj(&obj, ts, None)?, - Event::Deleted(obj) => store.delete_obj(&obj, ts)?, - Event::Restarted(objs) => { - store.update_all_objs_for_gvk(gvk, &objs, ts)?; - - // When the watcher first starts up it does a List call, which (internally) gets - // converted into a "Restarted" event that contains all of the listed objects. - // Once we've handled this event the first time, we know we have a complete view of - // the cluster at startup time. - if !self.is_ready { - self.is_ready = true; - - // unlike golang, sending is non-blocking - self.ready_tx.send(true)?; - } - }, - }; - Ok(()) + async fn deleted( + &mut self, + obj: &DynamicObject, + ts: i64, + store: Arc>, + ) -> EmptyResult { + let mut s = store.lock().expect("trace store mutex poisoned"); + s.delete_obj(obj, ts) } -} -async fn build_stream_for_tracked_obj(apiset: &mut ApiSet, gvk: GVK) -> anyhow::Result { - // TODO if this fails (e.g., because some custom resource isn't present in the cluster) - // it will prevent the tracer from starting up - let api_version = gvk.api_version().clone(); - let kind = gvk.kind.clone(); - - // The "unnamespaced" api variant can list/watch in all namespaces - let (api, _) = apiset.unnamespaced_api_by_gvk(&gvk).await?; - - Ok(watcher(api.clone(), Default::default()) - // All these objects need to be cloned because they're moved into the stream here - .modify(move |obj| sanitize_obj(obj, &api_version, &kind)) - .map_ok(move |obj| (gvk.clone(), obj)) - .map_err(|e| e.into()) - .boxed()) + async fn initialized( + &mut self, + objs: &[DynamicObject], + ts: i64, + store: Arc>, + ) -> EmptyResult { + let mut s = store.lock().expect("trace store mutex poisoned"); + s.update_all_objs_for_gvk(&self.gvk, objs, ts) + } } #[cfg(test)] -impl DynObjWatcher { - pub fn new_from_parts( - objs: KubeObjectStream, - store: Arc>, - clock: Box, - ) -> DynObjWatcher { - let (tx, _): (Sender, Receiver) = mpsc::channel(); - DynObjWatcher { - obj_stream: select_all(vec![objs]), - store, - clock, - is_ready: true, - ready_tx: tx, - } +impl DynObjHandler { + pub fn new(gvk: GVK) -> Box { + Box::new(DynObjHandler { gvk }) } } diff --git a/sk-store/src/watchers/mod.rs b/sk-store/src/watchers/mod.rs index efe46471..5d741dd7 100644 --- a/sk-store/src/watchers/mod.rs +++ b/sk-store/src/watchers/mod.rs @@ -1,14 +1,149 @@ mod dyn_obj_watcher; mod pod_watcher; -pub use self::dyn_obj_watcher::{ - DynObjWatcher, - KubeObjectStream, +use std::pin::Pin; +use std::sync::mpsc::{ + Receiver, + Sender, }; -pub use self::pod_watcher::{ - PodStream, - PodWatcher, +use std::sync::{ + mpsc, + Arc, + Mutex, }; +use async_trait::async_trait; +use clockabilly::{ + Clockable, + UtcClock, +}; +use futures::{ + Stream, + StreamExt, +}; +use kube::runtime::watcher::Event; +use sk_core::errors::*; +use tracing::*; + +pub use self::dyn_obj_watcher::DynObjHandler; +pub use self::pod_watcher::PodHandler; +use crate::TraceStorable; + +pub type ObjStream = Pin>> + Send>>; + +#[cfg_attr(test, automock)] +#[async_trait] +pub trait EventHandler { + async fn applied(&mut self, obj: &T, ts: i64, store: Arc>) -> EmptyResult; + async fn deleted(&mut self, obj: &T, ts: i64, store: Arc>) -> EmptyResult; + async fn initialized(&mut self, objs: &[T], ts: i64, store: Arc>) -> EmptyResult; +} + +pub struct ObjWatcher { + handler: Box + Send>, + + stream: ObjStream, + store: Arc>, + + clock: Box, + is_ready: bool, + ready_tx: Sender, + + init_buffer: Vec, +} + +impl ObjWatcher { + pub fn new( + handler: Box + Send>, + stream: ObjStream, + store: Arc>, + ) -> (ObjWatcher, Receiver) { + let (tx, rx): (Sender, Receiver) = mpsc::channel(); + ( + ObjWatcher { + handler, + + stream, + store, + + clock: UtcClock::boxed(), + is_ready: false, + ready_tx: tx, + + init_buffer: vec![], + }, + rx, + ) + } + + // This is not a reference because it needs to "own" itself when tokio spawns it + pub async fn start(mut self) { + while let Some(res) = self.stream.next().await { + let ts = self.clock.now_ts(); + match res { + Ok(ref evt) => self.handle_event(evt, ts).await.unwrap_or_else(|err| { + skerr!(err, "could not handle event"); + }), + Err(err) => { + skerr!(err, "pod watcher received error on stream"); + }, + } + } + } + + pub(crate) async fn handle_event(&mut self, evt: &Event, ts: i64) -> EmptyResult { + // We don't expect the trace store to panic, but if it does we should panic here too + // (the unlock only fails here if the lock has been Poisoned, e.g., something panicked + // while holding the lock) + match evt { + Event::Apply(obj) => self.handler.applied(obj, ts, self.store.clone()).await?, + Event::Delete(obj) => self.handler.deleted(obj, ts, self.store.clone()).await?, + Event::Init => (), + Event::InitApply(obj) => self.init_buffer.push(obj.clone()), + Event::InitDone => { + self.handler.initialized(&self.init_buffer, ts, self.store.clone()).await?; + + // When the watcher first starts up it does a List call, which (internally) gets + // converted into a "Restarted" event that contains all of the listed objects. + // Once we've handled this event the first time, we know we have a complete view of + // the cluster at startup time. + if !self.is_ready { + self.is_ready = true; + + // unlike golang, sending is non-blocking + // if nobody's listening on the other end it's "fine" so we ignore the error + let _ = self.ready_tx.send(true); + } + self.init_buffer.clear(); + }, + } + Ok(()) + } +} + +#[cfg(test)] +use mockall::automock; + #[cfg(test)] mod tests; + +#[cfg(test)] +impl ObjWatcher { + pub fn new_from_parts( + handler: Box + Send>, + stream: ObjStream, + store: Arc>, + clock: Box, + ) -> ObjWatcher { + let (tx, _): (Sender, Receiver) = mpsc::channel(); + ObjWatcher { + handler, + stream, + store, + clock, + is_ready: true, + ready_tx: tx, + init_buffer: vec![], + } + } +} diff --git a/sk-store/src/watchers/pod_watcher.rs b/sk-store/src/watchers/pod_watcher.rs index 8cc0b3d5..125df85b 100644 --- a/sk-store/src/watchers/pod_watcher.rs +++ b/sk-store/src/watchers/pod_watcher.rs @@ -1,30 +1,16 @@ -use std::borrow::Borrow; use std::collections::HashMap; use std::mem::take; -use std::pin::Pin; -use std::sync::mpsc::{ - Receiver, - Sender, -}; use std::sync::{ - mpsc, Arc, Mutex, }; -use clockabilly::{ - Clockable, - UtcClock, -}; +use async_trait::async_trait; use futures::{ - Stream, StreamExt, TryStreamExt, }; -use kube::runtime::watcher::{ - watcher, - Event, -}; +use kube::runtime::watcher::watcher; use sk_core::errors::*; use sk_core::k8s::{ ApiSet, @@ -34,12 +20,11 @@ use sk_core::k8s::{ use sk_core::prelude::*; use tracing::*; -use crate::{ - TraceStorable, - TraceStore, +use crate::watchers::{ + EventHandler, + ObjStream, }; - -pub type PodStream = Pin>> + Send>>; +use crate::TraceStorable; // The PodWatcher object monitors incoming pod events and records the relevant ones to the object // store; becaues in clusters of any reasonable size, there are a) a lot of pods, and b) a lot of @@ -51,128 +36,39 @@ pub type PodStream = Pin // lifecycle data (currently start time and end time) have changed. If so, we compute the // ownership chain for the pod, and forward that info on to the store. -pub struct PodWatcher { - pod_stream: PodStream, - +pub struct PodHandler { // We store the list of owned pods in memory here, and cache the ownership chain for each pod; // This is a simpler data structure than what the object store needs, to allow for easy lookup // by pod name. (The object store needs to store a bunch of extra metadata about sequence // number and pod hash and so forth). owned_pods: HashMap, owners_cache: OwnersCache, - store: Arc>, - - clock: Box, - is_ready: bool, - ready_tx: Sender, } -impl PodWatcher { +impl PodHandler { // We take ownership of the apiset here, meaning that this has to be created after the // DynamicObject watcher. We need ownership because pod owner chains could contain arbitrary // object types (we don't necessarily know what they are until we see the pod). The // DynamicObject watcher just needs to construct the relevant api clients once, when it creates // the watch streams, so it can yield when it's done. If at some point in the future this // becomes problematic, we can always stick the apiset in an Arc>. - pub fn new(client: kube::Client, store: Arc>, apiset: ApiSet) -> (PodWatcher, Receiver) { + pub fn new_with_stream(client: kube::Client, apiset: ApiSet) -> (Box, ObjStream) { let pod_api: kube::Api = kube::Api::all(client); - let pod_stream = watcher(pod_api, Default::default()).map_err(|e| e.into()).boxed(); - let (tx, rx): (Sender, Receiver) = mpsc::channel(); - ( - PodWatcher { - pod_stream, - + Box::new(PodHandler { owned_pods: HashMap::new(), owners_cache: OwnersCache::new(apiset), - store, - - clock: UtcClock::boxed(), - is_ready: false, - ready_tx: tx, - }, - rx, + }), + watcher(pod_api, Default::default()).map_err(|e| e.into()).boxed(), ) } - // This is not a reference because it needs to "own" itself when tokio spawns it - pub async fn start(mut self) { - while let Some(res) = self.pod_stream.next().await { - match res { - Ok(mut evt) => self.handle_pod_event(&mut evt).await, - Err(err) => { - skerr!(err, "pod watcher received error on stream"); - }, - } - } - } - - // We swallow errors inside handle_pod_lifecycle to make sure that, on a refresh event, if one - // pod update fails we can still process the remaining events. If we use ? and return an error - // from handle_pod_event, then this function will bail after the first failed pod update. - pub(crate) async fn handle_pod_event(&mut self, evt: &mut Event) { - match evt { - Event::Applied(pod) => { - let ns_name = pod.namespaced_name(); - if let Err(err) = self.handle_pod_applied(&ns_name, pod).await { - skerr!(err, "applied pod {} lifecycle data could not be stored", ns_name); - } - }, - Event::Deleted(pod) => { - let ns_name = pod.namespaced_name(); - let current_lifecycle_data = match self.owned_pods.get(&ns_name) { - None => { - warn!("pod {ns_name} deleted but not tracked, may have already been processed"); - return; - }, - Some(data) => data.clone(), - }; - if let Err(err) = self.handle_pod_deleted(&ns_name, Some(pod), current_lifecycle_data).await { - skerr!(err, "deleted pod {} lifecycle data could not be stored", ns_name); - } - }, - Event::Restarted(pods) => { - // We're essentially swapping the old data structure for the new one, and removing - // events from the old and putting them into the new. Then we know that anything - // left in the old after we're done was deleted in the intervening period. This - // lets us not have to track "object versions" or use a bit vector or something - // along those lines. - let mut old_owned_pods = take(&mut self.owned_pods); - for pod in pods { - let ns_name = &pod.namespaced_name(); - if let Some(current_lifecycle_data) = old_owned_pods.remove(ns_name) { - self.owned_pods.insert(ns_name.into(), current_lifecycle_data); - } - if let Err(err) = self.handle_pod_applied(ns_name, pod).await { - skerr!(err, "(watcher restart) applied pod {} lifecycle data could not be stored", ns_name); - } - } - - for (ns_name, current_lifecycle_data) in &old_owned_pods { - // We don't have data on the deleted pods aside from the name, so we just pass - // in `None` for the pod object. - if let Err(err) = self.handle_pod_deleted(ns_name, None, current_lifecycle_data.clone()).await { - skerr!(err, "(watcher restart) deleted pod {} lifecycle data could not be stored", ns_name); - } - } - - // When the watcher first starts up it does a List call, which (internally) gets - // converted into a "Restarted" event that contains all of the listed objects. - // Once we've handled this event the first time, we know we have a complete view of - // the cluster at startup time. - if !self.is_ready { - self.is_ready = true; - - // unlike golang, sending is non-blocking - if let Err(e) = self.ready_tx.send(true) { - error!("failed to update podwatcher ready status: {e:?}") - } - } - }, - }; - } - - async fn handle_pod_applied(&mut self, ns_name: &str, pod: &corev1::Pod) -> EmptyResult { + async fn handle_pod_applied( + &mut self, + ns_name: &str, + pod: &corev1::Pod, + store: Arc>, + ) -> EmptyResult { let new_lifecycle_data = PodLifecycleData::new_for(pod)?; let current_lifecycle_data = self.owned_pods.get(ns_name); @@ -184,7 +80,8 @@ impl PodWatcher { // PodLifecycleData::Empty < everything. if new_lifecycle_data > current_lifecycle_data { self.owned_pods.insert(ns_name.into(), new_lifecycle_data.clone()); - self.store_pod_lifecycle_data(ns_name, Some(pod), &new_lifecycle_data).await?; + self.store_pod_lifecycle_data(ns_name, Some(pod), &new_lifecycle_data, store) + .await?; } else if !new_lifecycle_data.empty() && new_lifecycle_data != current_lifecycle_data { warn!( "new lifecycle data for {} does not match stored data, cowardly refusing to update: {:?} !>= {:?}", @@ -203,6 +100,8 @@ impl PodWatcher { ns_name: &str, maybe_pod: Option<&corev1::Pod>, current_lifecycle_data: PodLifecycleData, + store: Arc>, + ts: i64, ) -> EmptyResult { // Always remove the pod from our tracker, regardless of what else happens self.owned_pods.remove(ns_name); @@ -219,12 +118,13 @@ impl PodWatcher { None => { // We never store "empty" data so this unwrap should always succeed let start_ts = current_lifecycle_data.start_ts().unwrap(); - PodLifecycleData::Finished(start_ts, self.clock.now_ts()) + PodLifecycleData::Finished(start_ts, ts) }, - Some(pod) => PodLifecycleData::guess_finished_lifecycle(pod, ¤t_lifecycle_data, self.clock.borrow())?, + Some(pod) => PodLifecycleData::guess_finished_lifecycle(pod, ¤t_lifecycle_data, ts)?, }; - self.store_pod_lifecycle_data(ns_name, maybe_pod, &new_lifecycle_data).await + self.store_pod_lifecycle_data(ns_name, maybe_pod, &new_lifecycle_data, store) + .await } async fn store_pod_lifecycle_data( @@ -232,6 +132,7 @@ impl PodWatcher { ns_name: &str, maybe_pod: Option<&corev1::Pod>, lifecycle_data: &PodLifecycleData, + store: Arc>, ) -> EmptyResult { // Before storing the lifecycle data, we need to compute the ownership chain so the store // can determine if this pod is owned by anything it's tracking. We do this _after_ we've @@ -243,34 +144,81 @@ impl PodWatcher { _ => bail!("could not determine owner chain for {}", ns_name), }; - // We don't expect the trace store to panic, but if it does, we should panic here too - let mut store = self.store.lock().unwrap(); - store.record_pod_lifecycle(ns_name, maybe_pod.cloned(), owners, lifecycle_data) + let mut s = store.lock().expect("trace store mutex poisoned"); + s.record_pod_lifecycle(ns_name, maybe_pod.cloned(), owners, lifecycle_data) + } +} + +#[async_trait] +impl EventHandler for PodHandler { + async fn applied( + &mut self, + pod: &corev1::Pod, + _ts: i64, + store: Arc>, + ) -> EmptyResult { + let ns_name = pod.namespaced_name(); + self.handle_pod_applied(&ns_name, pod, store).await + } + + async fn deleted( + &mut self, + pod: &corev1::Pod, + ts: i64, + store: Arc>, + ) -> EmptyResult { + let ns_name = pod.namespaced_name(); + let Some(current_lifecycle_data) = self.owned_pods.get(&ns_name) else { + warn!("pod {ns_name} deleted but not tracked, may have already been processed"); + return Ok(()); + }; + self.handle_pod_deleted(&ns_name, Some(pod), current_lifecycle_data.clone(), store, ts) + .await + } + + async fn initialized( + &mut self, + pods: &[corev1::Pod], + ts: i64, + store: Arc>, + ) -> EmptyResult { + // We're essentially swapping the old data structure for the new one, and removing + // events from the old and putting them into the new. Then we know that anything + // left in the old after we're done was deleted in the intervening period. This + // lets us not have to track "object versions" or use a bit vector or something + // along those lines. + let mut old_owned_pods = take(&mut self.owned_pods); + for pod in pods { + let ns_name = &pod.namespaced_name(); + if let Some(current_lifecycle_data) = old_owned_pods.remove(ns_name) { + self.owned_pods.insert(ns_name.into(), current_lifecycle_data); + } + if let Err(err) = self.handle_pod_applied(ns_name, pod, store.clone()).await { + skerr!(err, "(watcher restart) applied pod {} lifecycle data could not be stored", ns_name); + } + } + + for (ns_name, current_lifecycle_data) in &old_owned_pods { + // We don't have data on the deleted pods aside from the name, so we just pass + // in `None` for the pod object. + if let Err(err) = self + .handle_pod_deleted(ns_name, None, current_lifecycle_data.clone(), store.clone(), ts) + .await + { + skerr!(err, "(watcher restart) deleted pod {} lifecycle data could not be stored", ns_name); + } + } + Ok(()) } } #[cfg(test)] -impl PodWatcher { +impl PodHandler { pub(crate) fn new_from_parts( - pod_stream: PodStream, owned_pods: HashMap, owners_cache: OwnersCache, - store: Arc>, - clock: Box, - ) -> (PodWatcher, Receiver) { - let (tx, rx): (Sender, Receiver) = mpsc::channel(); - ( - PodWatcher { - pod_stream, - owned_pods, - owners_cache, - store, - clock, - is_ready: false, - ready_tx: tx, - }, - rx, - ) + ) -> PodHandler { + PodHandler { owned_pods, owners_cache } } pub(crate) fn get_owned_pod_lifecycle(&self, ns_name: &str) -> Option<&PodLifecycleData> { diff --git a/sk-store/src/watchers/tests/mod.rs b/sk-store/src/watchers/tests/mod.rs index e74c883e..30f5aaf4 100644 --- a/sk-store/src/watchers/tests/mod.rs +++ b/sk-store/src/watchers/tests/mod.rs @@ -1,6 +1,36 @@ mod pod_watcher_test; +use futures::stream; +use kube::api::DynamicObject; +use mockall::predicate; use rstest::*; +use sk_core::prelude::*; use tracing_test::traced_test; use super::*; +use crate::mock::MockTraceStore; +use crate::watchers::MockEventHandler; + +#[rstest] +#[tokio::test] +async fn test_handle_initialize_event() { + let deployments: Vec<_> = (0..3).map(|i| test_deployment(&format!("depl{i}"))).collect(); + let mut handler = Box::new(MockEventHandler::new()); + handler + .expect_initialized() + .with(predicate::eq(deployments.clone()), predicate::eq(0), predicate::always()) + .returning(|_, _, _| Ok(())) + .once(); + + let (mut watcher, _) = ObjWatcher::::new( + handler, + Box::pin(stream::empty()), + Arc::new(Mutex::new(MockTraceStore::new())), + ); + + watcher.handle_event(&Event::Init, 0).await.unwrap(); + for depl in deployments { + watcher.handle_event(&Event::InitApply(depl), 0).await.unwrap(); + } + watcher.handle_event(&Event::InitDone, 0).await.unwrap(); +} diff --git a/sk-store/src/watchers/tests/pod_watcher_test.rs b/sk-store/src/watchers/tests/pod_watcher_test.rs index 704f00d5..6fc35724 100644 --- a/sk-store/src/watchers/tests/pod_watcher_test.rs +++ b/sk-store/src/watchers/tests/pod_watcher_test.rs @@ -5,11 +5,6 @@ use std::sync::{ }; use clockabilly::mock::MockUtcClock; -use futures::{ - stream, - StreamExt, -}; -use kube::runtime::watcher::Event; use mockall::predicate; use sk_core::k8s::{ ApiSet, @@ -29,12 +24,11 @@ fn clock() -> Box { MockUtcClock::boxed(START_TS) } -fn make_pod_watcher( +fn make_pod_handler_store( ns_name: &str, - clock: Box, stored_data: Option<&PodLifecycleData>, expected_data: Option<&PodLifecycleData>, -) -> PodWatcher { +) -> (PodHandler, Arc>) { let mut store = MockTraceStore::new(); if let Some(data) = expected_data { let _ = store @@ -56,44 +50,39 @@ fn make_pod_watcher( }; let (_, client) = make_fake_apiserver(); - PodWatcher::new_from_parts( - stream::empty().boxed(), - stored_pods, - OwnersCache::new(ApiSet::new(client)), + ( + PodHandler::new_from_parts(stored_pods, OwnersCache::new(ApiSet::new(client))), Arc::new(Mutex::new(store)), - clock, ) - .0 } #[rstest] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_applied_empty(test_pod: corev1::Pod, clock: Box) { +async fn test_handle_event_applied_empty(test_pod: corev1::Pod, clock: Box) { let ns_name = test_pod.namespaced_name(); - let mut pw = make_pod_watcher(&ns_name, clock, None, None); - - let mut evt = Event::Applied(test_pod.clone()); + let now = clock.now_ts(); + let (mut h, store) = make_pod_handler_store(&ns_name, None, None); - pw.handle_pod_event(&mut evt).await; + h.applied(&test_pod.clone(), now, store).await.unwrap(); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name), None); + assert_eq!(h.get_owned_pod_lifecycle(&ns_name), None); } #[rstest] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_applied(mut test_pod: corev1::Pod, clock: Box) { +async fn test_handle_event_applied(mut test_pod: corev1::Pod, clock: Box) { let ns_name = test_pod.namespaced_name(); let expected_data = PodLifecycleData::Running(START_TS); - let mut pw = make_pod_watcher(&ns_name, clock, None, Some(&expected_data)); + let now = clock.now_ts(); + let (mut h, store) = make_pod_handler_store(&ns_name, None, Some(&expected_data)); add_running_container(&mut test_pod, START_TS); - let mut evt = Event::Applied(test_pod); - pw.handle_pod_event(&mut evt).await; + h.applied(&test_pod, now, store).await.unwrap(); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name).unwrap(), expected_data); + assert_eq!(h.get_owned_pod_lifecycle(&ns_name).unwrap(), expected_data); } #[rstest] @@ -101,57 +90,57 @@ async fn test_handle_pod_event_applied(mut test_pod: corev1::Pod, clock: Box, #[case] stored_ts: i64, ) { let ns_name = test_pod.namespaced_name(); let stored_data = PodLifecycleData::Running(stored_ts); - let mut pw = make_pod_watcher(&ns_name, clock, Some(&stored_data), None); + let now = clock.now_ts(); + let (mut h, store) = make_pod_handler_store(&ns_name, Some(&stored_data), None); add_running_container(&mut test_pod, START_TS); - let mut evt = Event::Applied(test_pod); - pw.handle_pod_event(&mut evt).await; + h.applied(&test_pod, now, store).await.unwrap(); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name).unwrap(), stored_data); + assert_eq!(h.get_owned_pod_lifecycle(&ns_name).unwrap(), stored_data); } #[rstest] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_applied_running_to_finished(mut test_pod: corev1::Pod, clock: Box) { +async fn test_handle_event_applied_running_to_finished(mut test_pod: corev1::Pod, clock: Box) { let ns_name = test_pod.namespaced_name(); let stored_data = PodLifecycleData::Running(START_TS); let expected_data = PodLifecycleData::Finished(START_TS, END_TS); - let mut pw = make_pod_watcher(&ns_name, clock, Some(&stored_data), Some(&expected_data)); + let now = clock.now_ts(); + let (mut h, store) = make_pod_handler_store(&ns_name, Some(&stored_data), Some(&expected_data)); add_finished_container(&mut test_pod, START_TS, END_TS); - let mut evt = Event::Applied(test_pod); - pw.handle_pod_event(&mut evt).await; + h.applied(&test_pod, now, store).await.unwrap(); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name).unwrap(), expected_data); + assert_eq!(h.get_owned_pod_lifecycle(&ns_name).unwrap(), expected_data); } #[rstest] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_applied_running_to_finished_wrong_start_ts( +async fn test_handle_event_applied_running_to_finished_wrong_start_ts( mut test_pod: corev1::Pod, clock: Box, ) { let ns_name = test_pod.namespaced_name(); let stored_data = PodLifecycleData::Running(5555); - let mut pw = make_pod_watcher(&ns_name, clock, Some(&stored_data), None); + let now = clock.now_ts(); + let (mut h, store) = make_pod_handler_store(&ns_name, Some(&stored_data), None); add_finished_container(&mut test_pod, START_TS, END_TS); - let mut evt = Event::Applied(test_pod); - pw.handle_pod_event(&mut evt).await; + h.applied(&test_pod, now, store).await.unwrap(); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name).unwrap(), stored_data); + assert_eq!(h.get_owned_pod_lifecycle(&ns_name).unwrap(), stored_data); } #[rstest] @@ -159,22 +148,21 @@ async fn test_handle_pod_event_applied_running_to_finished_wrong_start_ts( #[case::mismatched_data(Some(&PodLifecycleData::Finished(1, 2)))] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_deleted_no_update( +async fn test_handle_event_deleted_no_update( mut test_pod: corev1::Pod, mut clock: Box, #[case] stored_data: Option<&PodLifecycleData>, ) { let ns_name = test_pod.namespaced_name(); - clock.set(END_TS); + let now = clock.set(END_TS); - let mut pw = make_pod_watcher(&ns_name, clock, stored_data, None); + let (mut h, store) = make_pod_handler_store(&ns_name, stored_data, None); add_running_container(&mut test_pod, START_TS); - let mut evt = Event::Deleted(test_pod); - pw.handle_pod_event(&mut evt).await; + h.deleted(&test_pod, now, store).await.unwrap(); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name), None); + assert_eq!(h.get_owned_pod_lifecycle(&ns_name), None); } #[rstest] @@ -182,7 +170,7 @@ async fn test_handle_pod_event_deleted_no_update( #[case::old_finished(true)] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_deleted_finished( +async fn test_handle_event_deleted_finished( mut test_pod: corev1::Pod, mut clock: Box, #[case] old_finished: bool, @@ -193,61 +181,59 @@ async fn test_handle_pod_event_deleted_finished( let finished = PodLifecycleData::Finished(START_TS, END_TS); let stored_data = if old_finished { finished.clone() } else { PodLifecycleData::Running(START_TS) }; let expected_data = if old_finished { None } else { Some(&finished) }; - clock.set(10000); + let now = clock.set(10000); - let mut pw = make_pod_watcher(&ns_name, clock, Some(&stored_data), expected_data); + let (mut h, store) = make_pod_handler_store(&ns_name, Some(&stored_data), expected_data); add_finished_container(&mut test_pod, START_TS, END_TS); - let mut evt = Event::Deleted(test_pod); - pw.handle_pod_event(&mut evt).await; + h.deleted(&test_pod, now, store).await.unwrap(); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name), None); + assert_eq!(h.get_owned_pod_lifecycle(&ns_name), None); } #[rstest] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_deleted_running(mut test_pod: corev1::Pod, mut clock: Box) { +async fn test_handle_event_deleted_running(mut test_pod: corev1::Pod, mut clock: Box) { // Here the pod is still "running" when the delete call comes in, so we // expect the end_ts in the lifecycle data to match the current time let ns_name = test_pod.namespaced_name(); let stored_data = PodLifecycleData::Running(START_TS); let expected_data = PodLifecycleData::Finished(START_TS, END_TS); - clock.set(END_TS); + let now = clock.set(END_TS); - let mut pw = make_pod_watcher(&ns_name, clock, Some(&stored_data), Some(&expected_data)); + let (mut h, store) = make_pod_handler_store(&ns_name, Some(&stored_data), Some(&expected_data)); add_running_container(&mut test_pod, START_TS); - let mut evt = Event::Deleted(test_pod.clone()); - pw.handle_pod_event(&mut evt).await; + h.deleted(&test_pod, now, store).await.unwrap(); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name), None); + assert_eq!(h.get_owned_pod_lifecycle(&ns_name), None); } #[rstest] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_deleted_no_container_data(test_pod: corev1::Pod, mut clock: Box) { +async fn test_handle_event_deleted_no_container_data(test_pod: corev1::Pod, mut clock: Box) { // Same as the test case above, except this time the pod object // doesn't include any info about its containers, it just has metadata let ns_name = test_pod.namespaced_name(); let stored_data = PodLifecycleData::Running(START_TS); let expected_data = PodLifecycleData::Finished(START_TS, END_TS); - clock.set(END_TS); + let now = clock.set(END_TS); - let mut pw = make_pod_watcher(&ns_name, clock, Some(&stored_data), Some(&expected_data)); - let mut evt = Event::Deleted(test_pod); - pw.handle_pod_event(&mut evt).await; + let (mut h, store) = make_pod_handler_store(&ns_name, Some(&stored_data), Some(&expected_data)); - assert_eq!(pw.get_owned_pod_lifecycle(&ns_name), None); + h.deleted(&test_pod, now, store).await.unwrap(); + + assert_eq!(h.get_owned_pod_lifecycle(&ns_name), None); } #[rstest] #[traced_test] #[tokio::test] -async fn test_handle_pod_event_restarted(mut clock: Box) { +async fn test_handle_event_restarted(mut clock: Box) { // This test probably requires some explanation: pod0 and pod1 are testing that when a // restart event comes in, updated or unchanged data is processed correctly. pod2 will fail // because there is no stored ownership data, and this is testing that we correctly continue @@ -263,7 +249,7 @@ async fn test_handle_pod_event_restarted(mut clock: Box) { let mut update_pod1 = test_pod("pod1".into()); add_running_container(&mut update_pod1, START_TS); - let clock_ts = clock.set(10000); + let now = clock.set(10000); let mut store = MockTraceStore::new(); let _ = store @@ -294,7 +280,7 @@ async fn test_handle_pod_event_restarted(mut clock: Box) { predicate::eq(pod_names[3].clone()), predicate::eq(None), predicate::eq(vec![]), - predicate::eq(PodLifecycleData::Finished(START_TS, clock_ts)), + predicate::eq(PodLifecycleData::Finished(START_TS, now)), ) .returning(|_, _, _, _| Ok(())) .once(); @@ -308,15 +294,13 @@ async fn test_handle_pod_event_restarted(mut clock: Box) { ]); let cache = OwnersCache::new_from_parts(ApiSet::new(client), owners); - let (mut pw, rx) = - PodWatcher::new_from_parts(stream::empty().boxed(), pod_lifecycles, cache, Arc::new(Mutex::new(store)), clock); - - let mut evt = Event::Restarted(vec![update_pod0, update_pod1]); - - pw.handle_pod_event(&mut evt).await; - assert_eq!(pw.get_owned_pod_lifecycle(&pod_names[0]).unwrap(), PodLifecycleData::Finished(START_TS, END_TS)); - assert_eq!(pw.get_owned_pod_lifecycle(&pod_names[1]).unwrap(), PodLifecycleData::Running(START_TS)); - assert_eq!(pw.get_owned_pod_lifecycle(&pod_names[2]), None); // pod2 should still be deleted from our index - assert_eq!(pw.get_owned_pod_lifecycle(&pod_names[3]), None); - assert!(rx.try_recv().unwrap()); // don't block this recv + let mut h = PodHandler::new_from_parts(pod_lifecycles, cache); + + h.initialized(&[update_pod0, update_pod1], now, Arc::new(Mutex::new(store))) + .await + .unwrap(); + assert_eq!(h.get_owned_pod_lifecycle(&pod_names[0]).unwrap(), PodLifecycleData::Finished(START_TS, END_TS)); + assert_eq!(h.get_owned_pod_lifecycle(&pod_names[1]).unwrap(), PodLifecycleData::Running(START_TS)); + assert_eq!(h.get_owned_pod_lifecycle(&pod_names[2]), None); // pod2 should still be deleted from our index + assert_eq!(h.get_owned_pod_lifecycle(&pod_names[3]), None); } diff --git a/sk-tracer/src/main.rs b/sk-tracer/src/main.rs index f0d8c27a..5023ca82 100644 --- a/sk-tracer/src/main.rs +++ b/sk-tracer/src/main.rs @@ -20,13 +20,15 @@ use sk_core::k8s::ApiSet; use sk_core::logging; use sk_core::prelude::*; use sk_store::watchers::{ - DynObjWatcher, - PodWatcher, + DynObjHandler, + ObjWatcher, + PodHandler, }; use sk_store::{ TraceStore, TracerConfig, }; +use tokio::task::JoinSet; use tracing::*; use crate::errors::ExportResponseError; @@ -92,8 +94,17 @@ async fn run(args: Options) -> EmptyResult { let mut apiset = ApiSet::new(client.clone()); let store = Arc::new(Mutex::new(TraceStore::new(config.clone()))); - let (dyn_obj_watcher, _) = DynObjWatcher::new(store.clone(), &mut apiset, &config.tracked_objects).await?; - let (pod_watcher, _) = PodWatcher::new(client, store.clone(), apiset); + + let mut js = JoinSet::new(); + for gvk in config.tracked_objects.keys() { + let (dyn_obj_handler, dyn_obj_stream) = DynObjHandler::new_with_stream(gvk, &mut apiset).await?; + let (dyn_obj_watcher, _) = ObjWatcher::new(dyn_obj_handler, dyn_obj_stream, store.clone()); + js.spawn(dyn_obj_watcher.start()); + } + + let (pod_handler, pod_stream) = PodHandler::new_with_stream(client, apiset); + let (pod_watcher, _) = ObjWatcher::new(pod_handler, pod_stream, store.clone()); + js.spawn(pod_watcher.start()); let rkt_config = rocket::Config { port: args.server_port, ..Default::default() }; let server = rocket::custom(&rkt_config) @@ -101,8 +112,7 @@ async fn run(args: Options) -> EmptyResult { .manage(store.clone()); tokio::select! { - res = tokio::spawn(dyn_obj_watcher.start()) => res.map_err(|e| e.into()), - res = tokio::spawn(pod_watcher.start()) => res.map_err(|e| e.into()), + _ = js.join_all() => Ok(()), res = tokio::spawn(server.launch()) => match res { Ok(r) => r.map(|_| ()).map_err(|err| err.into()), Err(err) => Err(err.into()),