diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fca81f2..2f68b765 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,10 @@ All notable changes to this project will be documented in this file. - Reduce CRD size from `479KB` to `53KB` by accepting arbitrary YAML input instead of the underlying schema for the following fields ([#750]): - `podOverrides` - `affinity` +- Migrate to exposing Kafka using Listener Operator ([#443]). + - BREAKING: The existing services will be migrated to the new format. Clients will need to re-read settings from the discovery configmap. + - BREAKING: Kafka is now only accessible from within the Kubernetes cluster by default. Set listener classes manually to expose it to the outside world (again). + - BREAKING: To complete an upgrade to this kafka-operator, all existing Kafka StatefulSets must be deleted manually. This will cause some downtime. ### Fixed @@ -24,6 +28,7 @@ All notable changes to this project will be documented in this file. - Remove versions `3.4.1`, `3.6.1`, `3.6.2` ([#753]). +[#443]: https://github.com/stackabletech/kafka-operator/pull/443 [#741]: https://github.com/stackabletech/kafka-operator/pull/741 [#750]: https://github.com/stackabletech/kafka-operator/pull/750 [#753]: https://github.com/stackabletech/kafka-operator/pull/753 diff --git a/Cargo.lock b/Cargo.lock index 76929333..dc9f0805 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -613,15 +613,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" - -[[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", @@ -634,9 +628,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", @@ -644,15 +638,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", @@ -661,15 +655,15 @@ 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-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", @@ -678,15 +672,15 @@ dependencies = [ [[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" @@ -696,11 +690,10 @@ 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 0.1.31", "futures-channel", "futures-core", "futures-io", @@ -1142,7 +1135,7 @@ dependencies = [ "bytes", "chrono", "either", - "futures 0.3.30", + "futures", "home", "http", "http-body", @@ -1213,7 +1206,7 @@ dependencies = [ "async-trait", "backoff", "derivative", - "futures 0.3.30", + "futures", "hashbrown 0.14.5", "json-patch", "jsonptr", @@ -1766,7 +1759,7 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a2c585be59b6b5dd66a9d2084aa1d8bd52fbdb806eafdeffb52791147862035" dependencies = [ - "futures 0.3.30", + "futures", "futures-timer", "rstest_macros", "rustc_version", @@ -2171,7 +2164,7 @@ dependencies = [ "anyhow", "built", "clap", - "futures 0.3.30", + "futures", "product-config", "serde", "serde_json", @@ -2196,7 +2189,7 @@ dependencies = [ "derivative", "dockerfile-parser", "either", - "futures 0.3.30", + "futures", "indexmap", "json-patch", "k8s-openapi", diff --git a/Cargo.nix b/Cargo.nix index 922fac35..65dc4b46 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -85,9 +85,10 @@ rec { crates = { "addr2line" = rec { crateName = "addr2line"; - version = "0.22.0"; + version = "0.24.1"; edition = "2018"; - sha256 = "0y66f1sa27i9kvmlh76ynk60rxfrmkba9ja8x527h32wdb206ibf"; + crateBin = []; + sha256 = "0xfkfsk45dwps3jq4n5ikk7v15i6g51cpnnivxgl1ga28j71vyzm"; dependencies = [ { name = "gimli"; @@ -97,28 +98,29 @@ rec { } ]; features = { + "all" = [ "bin" ]; "alloc" = [ "dep:alloc" ]; + "bin" = [ "loader" "rustc-demangle" "cpp_demangle" "smallvec" "dep:clap" ]; "compiler_builtins" = [ "dep:compiler_builtins" ]; "core" = [ "dep:core" ]; "cpp_demangle" = [ "dep:cpp_demangle" ]; - "default" = [ "rustc-demangle" "cpp_demangle" "std-object" "fallible-iterator" "smallvec" "memmap2" ]; + "default" = [ "rustc-demangle" "cpp_demangle" "loader" "fallible-iterator" "smallvec" ]; "fallible-iterator" = [ "dep:fallible-iterator" ]; - "memmap2" = [ "dep:memmap2" ]; - "object" = [ "dep:object" ]; + "loader" = [ "std" "dep:object" "dep:memmap2" "dep:typed-arena" ]; "rustc-demangle" = [ "dep:rustc-demangle" ]; "rustc-dep-of-std" = [ "core" "alloc" "compiler_builtins" "gimli/rustc-dep-of-std" ]; "smallvec" = [ "dep:smallvec" ]; "std" = [ "gimli/std" ]; - "std-object" = [ "std" "object" "object/std" "object/compression" "gimli/endian-reader" ]; }; }; - "adler" = rec { - crateName = "adler"; - version = "1.0.2"; - edition = "2015"; - sha256 = "1zim79cvzd5yrkzl3nyfx0avijwgk9fqv3yrscdy1cc79ih02qpj"; + "adler2" = rec { + crateName = "adler2"; + version = "2.0.0"; + edition = "2021"; + sha256 = "09r6drylvgy8vv8k20lnbvwq8gp09h7smfn6h1rxsy15pgh629si"; authors = [ "Jonas Schievink " + "oyvindln " ]; features = { "compiler_builtins" = [ "dep:compiler_builtins" ]; @@ -328,7 +330,7 @@ rec { dependencies = [ { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.52.0"; target = { target, features }: (target."windows" or false); features = [ "Win32_System_Console" "Win32_Foundation" ]; } @@ -348,7 +350,7 @@ rec { } { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.52.0"; target = { target, features }: (target."windows" or false); features = [ "Win32_System_Console" "Win32_Foundation" ]; } @@ -357,9 +359,9 @@ rec { }; "anyhow" = rec { crateName = "anyhow"; - version = "1.0.86"; + version = "1.0.89"; edition = "2018"; - sha256 = "1nk301x8qhpdaks6a9zvcp7yakjqnczjmqndbg7vk4494d3d1ldk"; + sha256 = "1xh1vg89n56h6nqikcmgbpmkixjds33492klrp9m96xrbmhgizc6"; authors = [ "David Tolnay " ]; @@ -402,9 +404,9 @@ rec { }; "async-stream" = rec { crateName = "async-stream"; - version = "0.3.5"; - edition = "2018"; - sha256 = "0l8sjq1rylkb1ak0pdyjn83b3k6x36j22myngl4sqqgg7whdsmnd"; + version = "0.3.6"; + edition = "2021"; + sha256 = "0xl4zqncrdmw2g6241wgr11dxdg4h7byy6bz3l6si03qyfk72nhb"; libName = "async_stream"; authors = [ "Carl Lerche " @@ -427,9 +429,9 @@ rec { }; "async-stream-impl" = rec { crateName = "async-stream-impl"; - version = "0.3.5"; - edition = "2018"; - sha256 = "14q179j4y8p2z1d0ic6aqgy9fhwz8p9cai1ia8kpw4bw7q12mrhn"; + version = "0.3.6"; + edition = "2021"; + sha256 = "0kaplfb5axsvf1gfs2gk6c4zx6zcsns0yf3ssk7iwni7bphlvhn7"; procMacro = true; libName = "async_stream_impl"; authors = [ @@ -446,7 +448,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" "visit-mut" ]; } ]; @@ -454,9 +456,9 @@ rec { }; "async-trait" = rec { crateName = "async-trait"; - version = "0.1.81"; + version = "0.1.83"; edition = "2021"; - sha256 = "01w10ad3984czxrmc8ckdrabhmsv80aynfxibjnqwz1dr3f2h33f"; + sha256 = "1p8q8gm4fv2fdka8hwy2w3f8df7p5inixqi7rlmbnky3wmysw73j"; procMacro = true; libName = "async_trait"; authors = [ @@ -473,18 +475,18 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; usesDefaultFeatures = false; - features = [ "full" "visit-mut" "parsing" "printing" "proc-macro" ]; + features = [ "full" "parsing" "printing" "proc-macro" "visit-mut" ]; } ]; }; "autocfg" = rec { crateName = "autocfg"; - version = "1.3.0"; + version = "1.4.0"; edition = "2015"; - sha256 = "1c3njkfzpil03k92q0mij5y1pkhhfr4j3bf0h53bgl2vs85lsjqc"; + sha256 = "09lz3by90d2hphbq56znag9v87gfpd9gb8nr82hll8z6x2nhprdc"; authors = [ "Josh Stone " ]; @@ -526,9 +528,9 @@ rec { }; "backtrace" = rec { crateName = "backtrace"; - version = "0.3.73"; + version = "0.3.74"; edition = "2021"; - sha256 = "02iffg2pkg5nc36pgml8il7f77s138hhjw9f9l56v5zqlilk5hjw"; + sha256 = "06pfif7nwx66qf2zaanc2fcq7m64i91ki9imw9xd3bnz5hrwp0ld"; authors = [ "The Rust Project Developers" ]; @@ -566,11 +568,10 @@ rec { name = "rustc-demangle"; packageId = "rustc-demangle"; } - ]; - buildDependencies = [ { - name = "cc"; - packageId = "cc"; + name = "windows-targets"; + packageId = "windows-targets"; + target = { target, features }: (target."windows" or false); } ]; features = { @@ -578,8 +579,6 @@ rec { "default" = [ "std" ]; "serde" = [ "dep:serde" ]; "serialize-serde" = [ "serde" ]; - "verify-winapi" = [ "winapi/dbghelp" "winapi/handleapi" "winapi/libloaderapi" "winapi/memoryapi" "winapi/minwindef" "winapi/processthreadsapi" "winapi/synchapi" "winapi/tlhelp32" "winapi/winbase" "winapi/winnt" "winapi/winnls" "winapi/stringapiset" ]; - "winapi" = [ "dep:winapi" ]; }; resolvedDefaultFeatures = [ "default" "std" ]; }; @@ -761,9 +760,9 @@ rec { }; "bytes" = rec { crateName = "bytes"; - version = "1.7.1"; + version = "1.7.2"; edition = "2018"; - sha256 = "0l5sf69avjxcw41cznyzxsnymwmkpmk08q0sm7fgicvvn0ysa643"; + sha256 = "1wzs7l57iwqmrszdpr2mmqf1b1hgvpxafc30imxhnry0zfl9m3a2"; authors = [ "Carl Lerche " "Sean McArthur " @@ -776,9 +775,9 @@ rec { }; "cc" = rec { crateName = "cc"; - version = "1.1.14"; + version = "1.1.24"; edition = "2018"; - sha256 = "0ci9aqcywcwx7pwpixfr6vas7i9yz7k5w88wwcllbgyiscyfpljh"; + sha256 = "0f6rp3djvk05gx4wdip718ikgf2m5c6lk5rn7l00n1qa5ykwnal1"; authors = [ "Alex Crichton " ]; @@ -884,10 +883,10 @@ rec { }; "clap" = rec { crateName = "clap"; - version = "4.5.16"; + version = "4.5.19"; edition = "2021"; crateBin = []; - sha256 = "068hjwbrndn4iz4fsc6d52q4ymg1kfsymjnqbxzdil23zbzijrzd"; + sha256 = "0586lgxw68hc7x7bqk349778jshh1l9i98l6vzcji2lpnx6p9rbv"; dependencies = [ { name = "clap_builder"; @@ -925,9 +924,9 @@ rec { }; "clap_builder" = rec { crateName = "clap_builder"; - version = "4.5.15"; + version = "4.5.19"; edition = "2021"; - sha256 = "1dmas5z20yqmlmfhykr38pn1hkcnr4jzxjw4cs2f6lkn2wmyqsi1"; + sha256 = "0jyvmyzh8l9ph81kvvbhpgacgxp6bbks5cl2n9aqy9zq7ryw3yx5"; dependencies = [ { name = "anstream"; @@ -964,9 +963,9 @@ rec { }; "clap_derive" = rec { crateName = "clap_derive"; - version = "4.5.13"; + version = "4.5.18"; edition = "2021"; - sha256 = "1860xq3rbgwsqwcj9rd14cky9iiywwx86j7fvvngdjixbyfka7ah"; + sha256 = "1ardb26bvcpg72q9myr7yir3a8c83gx7vxk1cccabsd9n73s1ija"; procMacro = true; dependencies = [ { @@ -983,7 +982,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" ]; } ]; @@ -1034,9 +1033,9 @@ rec { }; "const_format" = rec { crateName = "const_format"; - version = "0.2.32"; + version = "0.2.33"; edition = "2021"; - sha256 = "0wvns8mzqwkyciwr00p2g5g4ak7zz8m473di85srj11xmz3i98p3"; + sha256 = "0jx6ffj65prbx1w9664ddwm73k7hm5g25afyvjq4y4gi3zc5bijh"; authors = [ "rodrimati1992 " ]; @@ -1066,9 +1065,9 @@ rec { }; "const_format_proc_macros" = rec { crateName = "const_format_proc_macros"; - version = "0.2.32"; + version = "0.2.33"; edition = "2021"; - sha256 = "0015dzbjbd773nn6096dwqv11fm8m3gy4a4a56cz5x10zl4gzxn7"; + sha256 = "1c8f7xh2b2kca9hlzvjplcdkvr4iqpsk4yd236n1nyzljd5s9wgg"; procMacro = true; authors = [ "rodrimati1992 " @@ -1143,9 +1142,9 @@ rec { }; "cpufeatures" = rec { crateName = "cpufeatures"; - version = "0.2.13"; + version = "0.2.14"; edition = "2018"; - sha256 = "1b89kljf7phyh63vxwsvf9lbgwkv0dsj7pcjmqgysnwsvkk55s2i"; + sha256 = "1q3qd9qkw94vs7n5i0y3zz2cqgzcxvdgyb54ryngwmjhfbgrg1k0"; authors = [ "RustCrypto Developers" ]; @@ -1287,7 +1286,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" "extra-traits" ]; } ]; @@ -1317,16 +1316,16 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; } ]; }; "delegate" = rec { crateName = "delegate"; - version = "0.12.0"; + version = "0.13.0"; edition = "2018"; - sha256 = "16zpkc6v2ss5qivwx7p7vb1bjnb6s0p7kkifaqkgyl7bpv68y0af"; + sha256 = "0mh98via297c51dq7b2yb0fq7gxlgb8px2iz4w3sjgxpxc7vnq2h"; procMacro = true; authors = [ "Godfrey Chan " @@ -1343,7 +1342,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" "visit-mut" ]; } ]; @@ -1639,13 +1638,13 @@ rec { } { name = "regex-automata"; - packageId = "regex-automata 0.4.7"; + packageId = "regex-automata 0.4.8"; usesDefaultFeatures = false; features = [ "alloc" "syntax" "meta" "nfa" "dfa" "hybrid" ]; } { name = "regex-syntax"; - packageId = "regex-syntax 0.8.4"; + packageId = "regex-syntax 0.8.5"; usesDefaultFeatures = false; } ]; @@ -1713,24 +1712,11 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "default" "std" ]; }; - "futures 0.1.31" = rec { - crateName = "futures"; - version = "0.1.31"; - edition = "2015"; - sha256 = "0y46qbmhi37dqkch8dlfq5aninqpzqgrr98awkb3rn4fxww1lirs"; - authors = [ - "Alex Crichton " - ]; - features = { - "default" = [ "use_std" "with-deprecated" ]; - }; - resolvedDefaultFeatures = [ "default" "use_std" "with-deprecated" ]; - }; - "futures 0.3.30" = rec { + "futures" = rec { crateName = "futures"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "1c04g14bccmprwsvx2j9m2blhwrynq7vhl151lsvcv4gi0b6jp34"; + sha256 = "0xh8ddbkm9jy8kc5gbvjp9a4b6rqqxvc8471yb2qaz5wm2qhgg35"; dependencies = [ { name = "futures-channel"; @@ -1785,13 +1771,13 @@ rec { "unstable" = [ "futures-core/unstable" "futures-task/unstable" "futures-channel/unstable" "futures-io/unstable" "futures-util/unstable" ]; "write-all-vectored" = [ "futures-util/write-all-vectored" ]; }; - resolvedDefaultFeatures = [ "alloc" "async-await" "compat" "default" "executor" "futures-executor" "std" ]; + resolvedDefaultFeatures = [ "alloc" "async-await" "default" "executor" "futures-executor" "std" ]; }; "futures-channel" = rec { crateName = "futures-channel"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "0y6b7xxqdjm9hlcjpakcg41qfl7lihf6gavk8fyqijsxhvbzgj7a"; + sha256 = "040vpqpqlbk099razq8lyn74m0f161zd0rp36hciqrwcg2zibzrd"; libName = "futures_channel"; dependencies = [ { @@ -1817,9 +1803,9 @@ rec { }; "futures-core" = rec { crateName = "futures-core"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "07aslayrn3lbggj54kci0ishmd1pr367fp7iks7adia1p05miinz"; + sha256 = "0gk6yrxgi5ihfanm2y431jadrll00n5ifhnpx090c2f2q1cr1wh5"; libName = "futures_core"; features = { "default" = [ "std" ]; @@ -1830,9 +1816,9 @@ rec { }; "futures-executor" = rec { crateName = "futures-executor"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "07dh08gs9vfll2h36kq32q9xd86xm6lyl9xikmmwlkqnmrrgqxm5"; + sha256 = "17vcci6mdfzx4gbk0wx64chr2f13wwwpvyf3xd5fb1gmjzcx2a0y"; libName = "futures_executor"; dependencies = [ { @@ -1861,9 +1847,9 @@ rec { }; "futures-io" = rec { crateName = "futures-io"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "1hgh25isvsr4ybibywhr4dpys8mjnscw4wfxxwca70cn1gi26im4"; + sha256 = "1ikmw1yfbgvsychmsihdkwa8a1knank2d9a8dk01mbjar9w1np4y"; libName = "futures_io"; features = { "default" = [ "std" ]; @@ -1872,9 +1858,9 @@ rec { }; "futures-macro" = rec { crateName = "futures-macro"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "1b49qh9d402y8nka4q6wvvj0c88qq91wbr192mdn5h54nzs0qxc7"; + sha256 = "0l1n7kqzwwmgiznn0ywdc5i24z72zvh9q1dwps54mimppi7f6bhn"; procMacro = true; libName = "futures_macro"; dependencies = [ @@ -1888,7 +1874,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" ]; } ]; @@ -1896,9 +1882,9 @@ rec { }; "futures-sink" = rec { crateName = "futures-sink"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "1dag8xyyaya8n8mh8smx7x6w2dpmafg2din145v973a3hw7f1f4z"; + sha256 = "1xyly6naq6aqm52d5rh236snm08kw8zadydwqz8bip70s6vzlxg5"; libName = "futures_sink"; features = { "default" = [ "std" ]; @@ -1908,9 +1894,9 @@ rec { }; "futures-task" = rec { crateName = "futures-task"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "013h1724454hj8qczp8vvs10qfiqrxr937qsrv6rhii68ahlzn1q"; + sha256 = "124rv4n90f5xwfsm9qw6y99755y021cmi5dhzh253s920z77s3zr"; libName = "futures_task"; features = { "default" = [ "std" ]; @@ -1935,17 +1921,11 @@ rec { }; "futures-util" = rec { crateName = "futures-util"; - version = "0.3.30"; + version = "0.3.31"; edition = "2018"; - sha256 = "0j0xqhcir1zf2dcbpd421kgw6wvsk0rpxflylcysn1rlp3g02r1x"; + sha256 = "10aa1ar8bgkgbr4wzxlidkqkcxf77gffyj8j7768h831pcaq784z"; libName = "futures_util"; dependencies = [ - { - name = "futures"; - packageId = "futures 0.1.31"; - rename = "futures_01"; - optional = true; - } { name = "futures-channel"; packageId = "futures-channel"; @@ -2023,7 +2003,7 @@ rec { "unstable" = [ "futures-core/unstable" "futures-task/unstable" ]; "write-all-vectored" = [ "io" ]; }; - resolvedDefaultFeatures = [ "alloc" "async-await" "async-await-macro" "channel" "compat" "futures-channel" "futures-io" "futures-macro" "futures-sink" "futures_01" "io" "memchr" "sink" "slab" "std" ]; + resolvedDefaultFeatures = [ "alloc" "async-await" "async-await-macro" "channel" "futures-channel" "futures-io" "futures-macro" "futures-sink" "io" "memchr" "sink" "slab" "std" ]; }; "generic-array" = rec { crateName = "generic-array"; @@ -2091,9 +2071,9 @@ rec { }; "gimli" = rec { crateName = "gimli"; - version = "0.29.0"; + version = "0.31.0"; edition = "2018"; - sha256 = "1zgzprnjaawmg6zyic4f2q2hc39kdhn116qnkqpgvsasgc3x9v20"; + sha256 = "0r1d55xdi1k2l5ah9p0n23i93pm47cl8apjm8rwgqd1j7yi5w21j"; features = { "default" = [ "read-all" "write" ]; "endian-reader" = [ "read" "dep:stable_deref_trait" ]; @@ -2159,7 +2139,7 @@ rec { ]; }; - "hashbrown" = rec { + "hashbrown 0.14.5" = rec { crateName = "hashbrown"; version = "0.14.5"; edition = "2021"; @@ -2196,7 +2176,30 @@ rec { "rustc-dep-of-std" = [ "nightly" "core" "compiler_builtins" "alloc" "rustc-internal-api" ]; "serde" = [ "dep:serde" ]; }; - resolvedDefaultFeatures = [ "ahash" "allocator-api2" "default" "inline-more" "raw" ]; + resolvedDefaultFeatures = [ "ahash" "allocator-api2" "default" "inline-more" ]; + }; + "hashbrown 0.15.0" = rec { + crateName = "hashbrown"; + version = "0.15.0"; + edition = "2021"; + sha256 = "1yx4xq091s7i6mw6bn77k8cp4jrpcac149xr32rg8szqsj27y20y"; + authors = [ + "Amanieu d'Antras " + ]; + features = { + "alloc" = [ "dep:alloc" ]; + "allocator-api2" = [ "dep:allocator-api2" ]; + "borsh" = [ "dep:borsh" ]; + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "default" = [ "default-hasher" "inline-more" "allocator-api2" "equivalent" "raw-entry" ]; + "default-hasher" = [ "dep:foldhash" ]; + "equivalent" = [ "dep:equivalent" ]; + "nightly" = [ "allocator-api2?/nightly" "bumpalo/allocator_api" ]; + "rayon" = [ "dep:rayon" ]; + "rustc-dep-of-std" = [ "nightly" "core" "compiler_builtins" "alloc" "rustc-internal-api" "raw-entry" ]; + "serde" = [ "dep:serde" ]; + }; }; "headers" = rec { crateName = "headers"; @@ -2291,7 +2294,7 @@ rec { dependencies = [ { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.52.0"; target = { target, features }: (target."windows" or false); features = [ "Win32_Foundation" "Win32_UI_Shell" "Win32_System_Com" ]; } @@ -2388,9 +2391,9 @@ rec { }; "httparse" = rec { crateName = "httparse"; - version = "1.9.4"; + version = "1.9.5"; edition = "2018"; - sha256 = "1nc2s1pziq5ncl39xm7ybdhpnw5xsm505smqirr0py2v2550pk0g"; + sha256 = "0ip9v8m9lvgvq1lznl31wvn0ch1v254na7lhid9p29yx9rbx6wbx"; authors = [ "Sean McArthur " ]; @@ -2551,7 +2554,7 @@ rec { } { name = "rustls-native-certs"; - packageId = "rustls-native-certs"; + packageId = "rustls-native-certs 0.7.3"; optional = true; } { @@ -2602,9 +2605,9 @@ rec { }; "hyper-rustls" = rec { crateName = "hyper-rustls"; - version = "0.27.2"; + version = "0.27.3"; edition = "2021"; - sha256 = "0ma1wyfnqnkz7zyr7wpply3xfvlijd0rqqhb6ajs28c9jhnbxr2y"; + sha256 = "0cxkph8hsmbz693a8ih2ciy7h0xbac844rpm981y6c0iqfsxpbq8"; libName = "hyper_rustls"; dependencies = [ { @@ -2639,7 +2642,7 @@ rec { } { name = "rustls-native-certs"; - packageId = "rustls-native-certs"; + packageId = "rustls-native-certs 0.8.0"; optional = true; } { @@ -2746,9 +2749,9 @@ rec { }; "hyper-util" = rec { crateName = "hyper-util"; - version = "0.1.7"; + version = "0.1.9"; edition = "2021"; - sha256 = "1fg9h591skksq5zxnffyisj7487jhdcgj6c7bvlkckn535bhbryd"; + sha256 = "12yhradh0bpwa9jjyyq6shrrcx9fxbdkrq06xj7ccfhqkyq6waa1"; libName = "hyper_util"; authors = [ "Sean McArthur " @@ -2796,13 +2799,6 @@ rec { optional = true; usesDefaultFeatures = false; } - { - name = "tower"; - packageId = "tower"; - optional = true; - usesDefaultFeatures = false; - features = [ "make" "util" ]; - } { name = "tower-service"; packageId = "tower-service"; @@ -2833,24 +2829,24 @@ rec { } ]; features = { - "client" = [ "hyper/client" "dep:tracing" "dep:futures-channel" "dep:tower" "dep:tower-service" ]; + "client" = [ "hyper/client" "dep:tracing" "dep:futures-channel" "dep:tower-service" ]; "client-legacy" = [ "client" "dep:socket2" "tokio/sync" ]; "full" = [ "client" "client-legacy" "server" "server-auto" "server-graceful" "service" "http1" "http2" "tokio" ]; "http1" = [ "hyper/http1" ]; "http2" = [ "hyper/http2" ]; "server" = [ "hyper/server" ]; "server-auto" = [ "server" "http1" "http2" ]; - "server-graceful" = [ "server" "tokio/sync" ]; - "service" = [ "dep:tower" "dep:tower-service" ]; + "server-graceful" = [ "server" "tokio/sync" "futures-util/alloc" ]; + "service" = [ "dep:tower-service" ]; "tokio" = [ "dep:tokio" "tokio/net" "tokio/rt" "tokio/time" ]; }; resolvedDefaultFeatures = [ "client" "client-legacy" "default" "http1" "tokio" ]; }; "iana-time-zone" = rec { crateName = "iana-time-zone"; - version = "0.1.60"; + version = "0.1.61"; edition = "2018"; - sha256 = "0hdid5xz3jznm04lysjm3vi93h3c523w0hcc3xba47jl3ddbpzz7"; + sha256 = "085jjsls330yj1fnwykfzmb2f10zp6l7w4fhq81ng81574ghhpi3"; libName = "iana_time_zone"; authors = [ "Andrew Straw " @@ -2876,12 +2872,12 @@ rec { { name = "js-sys"; packageId = "js-sys"; - target = { target, features }: ("wasm32" == target."arch" or null); + target = { target, features }: (("wasm32" == target."arch" or null) && ("unknown" == target."os" or null)); } { name = "wasm-bindgen"; packageId = "wasm-bindgen"; - target = { target, features }: ("wasm32" == target."arch" or null); + target = { target, features }: (("wasm32" == target."arch" or null) && ("unknown" == target."os" or null)); } { name = "windows-core"; @@ -2949,9 +2945,9 @@ rec { }; "indexmap" = rec { crateName = "indexmap"; - version = "2.4.0"; + version = "2.6.0"; edition = "2021"; - sha256 = "0p2hwvmir50qcl5q6lib8fjq5dzv4f0gqy8czcyfva3yzhzdbslk"; + sha256 = "1nmrwn8lbs19gkvhxaawffzbvrpyrb5y3drcrr645x957kz0fybh"; dependencies = [ { name = "equivalent"; @@ -2960,9 +2956,8 @@ rec { } { name = "hashbrown"; - packageId = "hashbrown"; + packageId = "hashbrown 0.15.0"; usesDefaultFeatures = false; - features = [ "raw" ]; } ]; features = { @@ -3227,10 +3222,10 @@ rec { }; "k8s-openapi" = rec { crateName = "k8s-openapi"; - version = "0.22.0"; + version = "0.23.0"; edition = "2021"; - links = "k8s-openapi-0.22.0"; - sha256 = "0mcpy1gdxpqayc74i3x3ayh3q5bl6dzvsgmw91jq1r9sjkxill0r"; + links = "k8s-openapi-0.23.0"; + sha256 = "04qv2iqwm3mgjvyp2m6n3vf6nnpjh5a60kf9ah9k1n184d04g24w"; libName = "k8s_openapi"; authors = [ "Arnav Singh " @@ -3272,17 +3267,17 @@ rec { } ]; features = { - "earliest" = [ "v1_24" ]; - "latest" = [ "v1_30" ]; + "earliest" = [ "v1_26" ]; + "latest" = [ "v1_31" ]; "schemars" = [ "dep:schemars" ]; }; - resolvedDefaultFeatures = [ "schemars" "v1_30" ]; + resolvedDefaultFeatures = [ "schemars" "v1_31" ]; }; "kube" = rec { crateName = "kube"; - version = "0.93.1"; + version = "0.95.0"; edition = "2021"; - sha256 = "05k4wwb1f1hs0izn4hnyaw0l1wljqh0sh74wc4ijs6mgfl094r83"; + sha256 = "1y04cqn7ami9rs6csjsf63c4clm5zyvyx3bzbmyaf828hly0c8gs"; authors = [ "clux " "Natalie Klestrup Röijezon " @@ -3325,34 +3320,35 @@ rec { ]; features = { "admission" = [ "kube-core/admission" ]; + "aws-lc-rs" = [ "kube-client?/aws-lc-rs" ]; "client" = [ "kube-client/client" "config" ]; "config" = [ "kube-client/config" ]; "default" = [ "client" "rustls-tls" ]; "derive" = [ "kube-derive" "kube-core/schema" ]; - "gzip" = [ "kube-client/gzip" ]; - "http-proxy" = [ "kube-client/http-proxy" ]; + "gzip" = [ "kube-client/gzip" "client" ]; + "http-proxy" = [ "kube-client/http-proxy" "client" ]; "jsonpatch" = [ "kube-core/jsonpatch" ]; "kube-client" = [ "dep:kube-client" ]; "kube-derive" = [ "dep:kube-derive" ]; "kube-runtime" = [ "dep:kube-runtime" ]; "kubelet-debug" = [ "kube-client/kubelet-debug" "kube-core/kubelet-debug" ]; - "oauth" = [ "kube-client/oauth" ]; - "oidc" = [ "kube-client/oidc" ]; - "openssl-tls" = [ "kube-client/openssl-tls" ]; + "oauth" = [ "kube-client/oauth" "client" ]; + "oidc" = [ "kube-client/oidc" "client" ]; + "openssl-tls" = [ "kube-client/openssl-tls" "client" ]; "runtime" = [ "kube-runtime" ]; - "rustls-tls" = [ "kube-client/rustls-tls" ]; - "socks5" = [ "kube-client/socks5" ]; - "unstable-client" = [ "kube-client/unstable-client" ]; - "unstable-runtime" = [ "kube-runtime/unstable-runtime" ]; + "rustls-tls" = [ "kube-client/rustls-tls" "client" ]; + "socks5" = [ "kube-client/socks5" "client" ]; + "unstable-client" = [ "kube-client/unstable-client" "client" ]; + "unstable-runtime" = [ "kube-runtime/unstable-runtime" "runtime" ]; "ws" = [ "kube-client/ws" "kube-core/ws" ]; }; resolvedDefaultFeatures = [ "client" "config" "derive" "jsonpatch" "kube-client" "kube-derive" "kube-runtime" "runtime" "rustls-tls" ]; }; "kube-client" = rec { crateName = "kube-client"; - version = "0.93.1"; + version = "0.95.0"; edition = "2021"; - sha256 = "00w69ym31mzdi7kmxq1cjjnjps92cvb7mad5jw6a842v7bmkc4yq"; + sha256 = "1dwvvd37psgzcaqv87lppx2yrmdb8wggx9ki1s8132lxbigkbhii"; libName = "kube_client"; authors = [ "clux " @@ -3383,7 +3379,7 @@ rec { } { name = "futures"; - packageId = "futures 0.3.30"; + packageId = "futures"; optional = true; usesDefaultFeatures = false; features = [ "std" ]; @@ -3524,7 +3520,7 @@ rec { devDependencies = [ { name = "futures"; - packageId = "futures 0.3.30"; + packageId = "futures"; usesDefaultFeatures = false; features = [ "async-await" ]; } @@ -3543,6 +3539,7 @@ rec { features = { "__non_core" = [ "tracing" "serde_yaml" "base64" ]; "admission" = [ "kube-core/admission" ]; + "aws-lc-rs" = [ "rustls?/aws-lc-rs" ]; "base64" = [ "dep:base64" ]; "bytes" = [ "dep:bytes" ]; "chrono" = [ "dep:chrono" ]; @@ -3591,9 +3588,9 @@ rec { }; "kube-core" = rec { crateName = "kube-core"; - version = "0.93.1"; + version = "0.95.0"; edition = "2021"; - sha256 = "1rhg99v7w5qrj3ikh6n0pbbhp1kj6q7spvydcf846zbq9nkp7qyc"; + sha256 = "0rp6n4k4b1ai6ghxqci72wy67kxrgn6x9rs70ajl9dcx3kchn0zk"; libName = "kube_core"; authors = [ "clux " @@ -3635,6 +3632,10 @@ rec { packageId = "serde"; features = [ "derive" ]; } + { + name = "serde-value"; + packageId = "serde-value"; + } { name = "serde_json"; packageId = "serde_json"; @@ -3664,9 +3665,9 @@ rec { }; "kube-derive" = rec { crateName = "kube-derive"; - version = "0.93.1"; + version = "0.95.0"; edition = "2021"; - sha256 = "1wkqxfjxx4lc8gapd44kylprwgxhk29cwpdy55ri47kr8jc6r8h4"; + sha256 = "09qcgysprgrdhl838y28xfvvyrak0x367s5879vhmmyxisbvx67s"; procMacro = true; libName = "kube_derive"; authors = [ @@ -3693,7 +3694,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "extra-traits" ]; } ]; @@ -3701,9 +3702,9 @@ rec { }; "kube-runtime" = rec { crateName = "kube-runtime"; - version = "0.93.1"; + version = "0.95.0"; edition = "2021"; - sha256 = "197zjakpach42n6s62qdh0g6qrs8cawzyhqb474qaq7d1wy7711v"; + sha256 = "053r458alv2gk2q7vb8nbycw4d1bclsvja7i10j95b21ls5cp5aq"; libName = "kube_runtime"; authors = [ "clux " @@ -3737,13 +3738,13 @@ rec { } { name = "futures"; - packageId = "futures 0.3.30"; + packageId = "futures"; usesDefaultFeatures = false; features = [ "async-await" ]; } { name = "hashbrown"; - packageId = "hashbrown"; + packageId = "hashbrown 0.14.5"; } { name = "json-patch"; @@ -3835,9 +3836,9 @@ rec { }; "libc" = rec { crateName = "libc"; - version = "0.2.158"; + version = "0.2.159"; edition = "2015"; - sha256 = "0fb4qldw1jrxljrwz6bsjn8lv4rqizlqmab41q3j98q332xw9bfq"; + sha256 = "1i9xpia0hn1y8dws7all8rqng6h3lc8ymlgslnljcvm376jrf7an"; authors = [ "The Rust Project Developers" ]; @@ -4034,17 +4035,17 @@ rec { }; "miniz_oxide" = rec { crateName = "miniz_oxide"; - version = "0.7.4"; - edition = "2018"; - sha256 = "024wv14aa75cvik7005s5y2nfc8zfidddbd7g55g7sjgnzfl18mq"; + version = "0.8.0"; + edition = "2021"; + sha256 = "1wadxkg6a6z4lr7kskapj5d8pxlx7cp1ifw4daqnkzqjxych5n72"; authors = [ "Frommi " "oyvindln " ]; dependencies = [ { - name = "adler"; - packageId = "adler"; + name = "adler2"; + packageId = "adler2"; usesDefaultFeatures = false; } ]; @@ -4053,7 +4054,7 @@ rec { "compiler_builtins" = [ "dep:compiler_builtins" ]; "core" = [ "dep:core" ]; "default" = [ "with-alloc" ]; - "rustc-dep-of-std" = [ "core" "alloc" "compiler_builtins" "adler/rustc-dep-of-std" ]; + "rustc-dep-of-std" = [ "core" "alloc" "compiler_builtins" "adler2/rustc-dep-of-std" ]; "simd" = [ "simd-adler32" ]; "simd-adler32" = [ "dep:simd-adler32" ]; }; @@ -4092,7 +4093,7 @@ rec { } { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.52.0"; target = { target, features }: (target."windows" or false); features = [ "Wdk_Foundation" "Wdk_Storage_FileSystem" "Wdk_System_IO" "Win32_Foundation" "Win32_Networking_WinSock" "Win32_Storage_FileSystem" "Win32_System_IO" "Win32_System_WindowsProgramming" ]; } @@ -4189,9 +4190,9 @@ rec { }; "object" = rec { crateName = "object"; - version = "0.36.3"; + version = "0.36.4"; edition = "2018"; - sha256 = "1nggchwvjgilrxarwcmfcisa9fq1phg382y672aa6lb86ir4kdi7"; + sha256 = "02h7k38dwi8rndc3y81n6yjxijbss99p2jm9c0b6ak5c45c1lkq8"; dependencies = [ { name = "memchr"; @@ -4223,12 +4224,20 @@ rec { }; "once_cell" = rec { crateName = "once_cell"; - version = "1.19.0"; + version = "1.20.1"; edition = "2021"; - sha256 = "14kvw7px5z96dk4dwdm1r9cqhhy2cyj1l5n5b29mynbb8yr15nrz"; + sha256 = "1ldgc54v54swjxh33jh2fjynd37zrmg5wpmdyam5zaqrw95ir242"; authors = [ "Aleksey Kladov " ]; + dependencies = [ + { + name = "portable-atomic"; + packageId = "portable-atomic"; + optional = true; + usesDefaultFeatures = false; + } + ]; features = { "alloc" = [ "race" ]; "atomic-polyfill" = [ "critical-section" ]; @@ -4236,6 +4245,7 @@ rec { "default" = [ "std" ]; "parking_lot" = [ "dep:parking_lot_core" ]; "portable-atomic" = [ "dep:portable-atomic" ]; + "race" = [ "portable-atomic?/require-cas" ]; "std" = [ "alloc" ]; }; resolvedDefaultFeatures = [ "alloc" "default" "race" "std" ]; @@ -4439,7 +4449,7 @@ rec { } { name = "ordered-float"; - packageId = "ordered-float 4.2.2"; + packageId = "ordered-float 4.3.0"; } { name = "percent-encoding"; @@ -4527,11 +4537,11 @@ rec { }; resolvedDefaultFeatures = [ "default" "std" ]; }; - "ordered-float 4.2.2" = rec { + "ordered-float 4.3.0" = rec { crateName = "ordered-float"; - version = "4.2.2"; + version = "4.3.0"; edition = "2021"; - sha256 = "19k5c2m8m7xfkw7wa4i65krswbnd2299ar6fj1wqqvv78hc1g4aa"; + sha256 = "0dr5d8byvqkiclxjimp5kyh3m9qz4zvwifx6cg0d6w9glzqh3ma4"; libName = "ordered_float"; authors = [ "Jonathan Reem " @@ -4549,6 +4559,7 @@ rec { "borsh" = [ "dep:borsh" ]; "bytemuck" = [ "dep:bytemuck" ]; "default" = [ "std" ]; + "num-cmp" = [ "dep:num-cmp" ]; "proptest" = [ "dep:proptest" ]; "rand" = [ "dep:rand" ]; "randtest" = [ "rand/std" "rand/std_rng" ]; @@ -4576,9 +4587,9 @@ rec { }; "parking" = rec { crateName = "parking"; - version = "2.2.0"; + version = "2.2.1"; edition = "2018"; - sha256 = "1blwbkq6im1hfxp5wlbr475mw98rsyc0bbr2d5n16m38z253p0dv"; + sha256 = "1fnfgmzkfpjd69v4j9x737b1k8pnn054bvzcn5dm3pkgq595d3gk"; authors = [ "Stjepan Glavina " "The Rust Project Developers" @@ -4700,9 +4711,9 @@ rec { }; "pest" = rec { crateName = "pest"; - version = "2.7.11"; + version = "2.7.13"; edition = "2021"; - sha256 = "15cxh3nc7yibzjn6dbndjkbhadhkry60jdx83kf5ywr67zwdylyd"; + sha256 = "1nf2vwl5xhiqn1kl6skgwajp7naaxcjys86jmfasi1vhsk8zkgpx"; authors = [ "Dragoș Tiselice " ]; @@ -4726,6 +4737,7 @@ rec { features = { "default" = [ "std" "memchr" ]; "memchr" = [ "dep:memchr" ]; + "miette-error" = [ "std" "pretty-print" "dep:miette" "dep:thiserror" ]; "pretty-print" = [ "dep:serde" "dep:serde_json" ]; "std" = [ "ucd-trie/std" "dep:thiserror" ]; }; @@ -4733,9 +4745,9 @@ rec { }; "pest_derive" = rec { crateName = "pest_derive"; - version = "2.7.11"; + version = "2.7.13"; edition = "2021"; - sha256 = "16p49072arqm45l6j5blisjshj45rxpx6m254hf3nxx6xhmqsm1a"; + sha256 = "182sp7b10216mwdccr8296462k3mf5ap4g1rnsrzx07cjhrnwfjd"; procMacro = true; authors = [ "Dragoș Tiselice " @@ -4762,9 +4774,9 @@ rec { }; "pest_generator" = rec { crateName = "pest_generator"; - version = "2.7.11"; + version = "2.7.13"; edition = "2021"; - sha256 = "10vi0wbrxih85pghd1y2vkpnka68hyl5wkplpbf2amqlilpai4rw"; + sha256 = "03lk1v5ih4lkjpm5j6jp4r3snwj17z3n46b0np8nkjp1pl39ahll"; authors = [ "Dragoș Tiselice " ]; @@ -4788,7 +4800,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; } ]; features = { @@ -4801,9 +4813,9 @@ rec { }; "pest_meta" = rec { crateName = "pest_meta"; - version = "2.7.11"; + version = "2.7.13"; edition = "2021"; - sha256 = "0ksc295cyz9yxzsqvaaxfmmwrapzns2nfksyqbgbw23yxagl4hd9"; + sha256 = "0gx30r4jq8ijfar4a0mcfd277wrzwfw5z6jfwfv90dp9c8c0g2mc"; authors = [ "Dragoș Tiselice " ]; @@ -4861,7 +4873,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" "visit-mut" ]; } ]; @@ -4888,15 +4900,28 @@ rec { }; "pkg-config" = rec { crateName = "pkg-config"; - version = "0.3.30"; - edition = "2015"; - sha256 = "1v07557dj1sa0aly9c90wsygc0i8xv5vnmyv0g94lpkvj8qb4cfj"; + version = "0.3.31"; + edition = "2018"; + sha256 = "1wk6yp2phl91795ia0lwkr3wl4a9xkrympvhqq8cxk4d75hwhglm"; libName = "pkg_config"; authors = [ "Alex Crichton " ]; }; + "portable-atomic" = rec { + crateName = "portable-atomic"; + version = "1.9.0"; + edition = "2018"; + sha256 = "1cmd87qj90panwsi350djb8lsxdryqkkxmimjcz7a1nsysini76c"; + libName = "portable_atomic"; + features = { + "critical-section" = [ "dep:critical-section" ]; + "default" = [ "fallback" ]; + "serde" = [ "dep:serde" ]; + }; + resolvedDefaultFeatures = [ "require-cas" ]; + }; "powerfmt" = rec { crateName = "powerfmt"; version = "0.2.0"; @@ -4934,9 +4959,9 @@ rec { }; "proc-macro-crate" = rec { crateName = "proc-macro-crate"; - version = "3.1.0"; + version = "3.2.0"; edition = "2021"; - sha256 = "110jcl9vnj92ihbhjqmkp19m8rzxc14a7i60knlmv99qlwfcadvd"; + sha256 = "0yzsqnavb3lmrcsmbrdjfrky9vcbl46v59xi9avn0796rb3likwf"; libName = "proc_macro_crate"; authors = [ "Bastian Köcher " @@ -5016,7 +5041,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.4"; + packageId = "snafu 0.8.5"; } { name = "xml-rs"; @@ -5146,9 +5171,9 @@ rec { }; "redox_syscall" = rec { crateName = "redox_syscall"; - version = "0.5.3"; - edition = "2018"; - sha256 = "1916m7abg9649gkif055pn5nsvqjhp70isy0v7gx1zgi01p8m41a"; + version = "0.5.7"; + edition = "2021"; + sha256 = "07vpgfr6a04k0x19zqr1xdlqm6fncik3zydbdi3f5g3l5k7zwvcv"; libName = "syscall"; authors = [ "Jeremy Soller " @@ -5161,14 +5186,16 @@ rec { ]; features = { "core" = [ "dep:core" ]; + "default" = [ "userspace" ]; "rustc-dep-of-std" = [ "core" "bitflags/rustc-dep-of-std" ]; }; + resolvedDefaultFeatures = [ "default" "userspace" ]; }; "regex" = rec { crateName = "regex"; - version = "1.10.6"; + version = "1.11.0"; edition = "2021"; - sha256 = "06cnlxwzyqfbw1za1i7ks89ns4i2kr0lpg5ykx56b8v7dd6df6a2"; + sha256 = "1n5imk7yxam409ik5nagsjpwqvbg3f0g0mznd5drf549x1g0w81q"; authors = [ "The Rust Project Developers" "Andrew Gallant " @@ -5188,13 +5215,13 @@ rec { } { name = "regex-automata"; - packageId = "regex-automata 0.4.7"; + packageId = "regex-automata 0.4.8"; usesDefaultFeatures = false; features = [ "alloc" "syntax" "meta" "nfa-pikevm" ]; } { name = "regex-syntax"; - packageId = "regex-syntax 0.8.4"; + packageId = "regex-syntax 0.8.5"; usesDefaultFeatures = false; } ]; @@ -5247,11 +5274,11 @@ rec { }; resolvedDefaultFeatures = [ "default" "regex-syntax" "std" ]; }; - "regex-automata 0.4.7" = rec { + "regex-automata 0.4.8" = rec { crateName = "regex-automata"; - version = "0.4.7"; + version = "0.4.8"; edition = "2021"; - sha256 = "1pwjdi4jckpbaivpl6x4v5g4crb37zr2wac93wlfsbzgqn6gbjiq"; + sha256 = "18wd530ndrmygi6xnz3sp345qi0hy2kdbsa89182nwbl6br5i1rn"; libName = "regex_automata"; authors = [ "The Rust Project Developers" @@ -5272,7 +5299,7 @@ rec { } { name = "regex-syntax"; - packageId = "regex-syntax 0.8.4"; + packageId = "regex-syntax 0.8.5"; optional = true; usesDefaultFeatures = false; } @@ -5323,11 +5350,11 @@ rec { }; resolvedDefaultFeatures = [ "default" "unicode" "unicode-age" "unicode-bool" "unicode-case" "unicode-gencat" "unicode-perl" "unicode-script" "unicode-segment" ]; }; - "regex-syntax 0.8.4" = rec { + "regex-syntax 0.8.5" = rec { crateName = "regex-syntax"; - version = "0.8.4"; + version = "0.8.5"; edition = "2021"; - sha256 = "16r0kjy20vx33dr4mhasj5l1f87czas714x2fz6zl0f8wwxa0rks"; + sha256 = "0p41p3hj9ww7blnbwbj9h7rwxzxg0c1hvrdycgys8rxyhqqw859b"; libName = "regex_syntax"; authors = [ "The Rust Project Developers" @@ -5392,7 +5419,7 @@ rec { } { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.52.0"; target = { target, features }: (("aarch64" == target."arch" or null) && ("windows" == target."os" or null)); features = [ "Win32_Foundation" "Win32_System_Threading" ]; } @@ -5421,16 +5448,16 @@ rec { }; "rstest" = rec { crateName = "rstest"; - version = "0.22.0"; + version = "0.23.0"; edition = "2021"; - sha256 = "0dlrn6y4z5xgsvf6ky3lrjwsxpvi13sizlkwnqs1gmmxc873yhkv"; + sha256 = "0d90hr3i2yajzgpzvsh6p2yjzmcb3nm8884xdbb5sswvwmdmhb0a"; authors = [ "Michele d'Amico " ]; dependencies = [ { name = "futures"; - packageId = "futures 0.3.30"; + packageId = "futures"; optional = true; } { @@ -5459,9 +5486,9 @@ rec { }; "rstest_macros" = rec { crateName = "rstest_macros"; - version = "0.22.0"; + version = "0.23.0"; edition = "2021"; - sha256 = "0hiba8l3d20ajkifd3kz5rzzpxsy311ca4c4ll94pxqlglg73qf5"; + sha256 = "0nmdm7a4ysihnh0zz6w6gqrmw205zfp7xqkb2id3858vg20afpl2"; procMacro = true; authors = [ "Michele d'Amico " @@ -5498,7 +5525,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" "parsing" "extra-traits" "visit" "visit-mut" ]; } { @@ -5535,13 +5562,9 @@ rec { }; "rustc_version" = rec { crateName = "rustc_version"; - version = "0.4.0"; + version = "0.4.1"; edition = "2018"; - sha256 = "0rpk9rcdk405xhbmgclsh4pai0svn49x35aggl4nhbkd4a2zb85z"; - authors = [ - "Dirkjan Ochtman " - "Marvin Löbel " - ]; + sha256 = "14lvdsmr5si5qbqzrajgb6vfn69k0sfygrvfvr2mps26xwi3mjyg"; dependencies = [ { name = "semver"; @@ -5552,9 +5575,9 @@ rec { }; "rustls" = rec { crateName = "rustls"; - version = "0.23.12"; + version = "0.23.13"; edition = "2021"; - sha256 = "0i5h0sw8j6bly8rilidb0snd5czpkyjhzqfcd890mz1f7628r3y5"; + sha256 = "1j7lf7b6s43ljf5v18cqd1698j6ah4x7h1nvd9b7x4b6fjnbmnpj"; dependencies = [ { name = "log"; @@ -5618,11 +5641,45 @@ rec { }; resolvedDefaultFeatures = [ "log" "logging" "ring" "std" "tls12" ]; }; - "rustls-native-certs" = rec { + "rustls-native-certs 0.7.3" = rec { crateName = "rustls-native-certs"; - version = "0.7.2"; + version = "0.7.3"; edition = "2021"; - sha256 = "1ynz8a108bd3k7zix26z79n8cnqfsrfflsf01x7406h9r7zjs604"; + sha256 = "1r9ib5gwkfci2wbqnbh44nigvrfgxs4n1x89js82w97dxsab7gz5"; + libName = "rustls_native_certs"; + dependencies = [ + { + name = "openssl-probe"; + packageId = "openssl-probe"; + target = { target, features }: ((target."unix" or false) && (!("macos" == target."os" or null))); + } + { + name = "rustls-pemfile"; + packageId = "rustls-pemfile"; + } + { + name = "rustls-pki-types"; + packageId = "rustls-pki-types"; + rename = "pki-types"; + } + { + name = "schannel"; + packageId = "schannel"; + target = { target, features }: (target."windows" or false); + } + { + name = "security-framework"; + packageId = "security-framework"; + target = { target, features }: ("macos" == target."os" or null); + } + ]; + + }; + "rustls-native-certs 0.8.0" = rec { + crateName = "rustls-native-certs"; + version = "0.8.0"; + edition = "2021"; + sha256 = "12izz1ahwj3yr9fkd39q1w535577z9wsapsahz6jcwxyyaj1ibzw"; libName = "rustls_native_certs"; dependencies = [ { @@ -5654,17 +5711,11 @@ rec { }; "rustls-pemfile" = rec { crateName = "rustls-pemfile"; - version = "2.1.3"; + version = "2.2.0"; edition = "2018"; - sha256 = "09bl873pkibmb2da49kkbm9jlagscjvzrv257q6k01p101my2vqr"; + sha256 = "0l3f3mrfkgdjrava7ibwzgwc4h3dljw3pdkbsi9rkwz3zvji9qyw"; libName = "rustls_pemfile"; dependencies = [ - { - name = "base64"; - packageId = "base64 0.22.1"; - usesDefaultFeatures = false; - features = [ "alloc" ]; - } { name = "rustls-pki-types"; packageId = "rustls-pki-types"; @@ -5673,15 +5724,15 @@ rec { ]; features = { "default" = [ "std" ]; - "std" = [ "base64/std" ]; + "std" = [ "pki-types/std" ]; }; resolvedDefaultFeatures = [ "default" "std" ]; }; "rustls-pki-types" = rec { crateName = "rustls-pki-types"; - version = "1.8.0"; + version = "1.9.0"; edition = "2021"; - sha256 = "1w6a1x8h61p5ddlnijfvj5fvs516h5xr5rw1pc0m8rgq8vk2q2pw"; + sha256 = "0mcc901b4hm2ql2qwpf2gzqhqn6d7iag92hr872wjr8c6wsnws8f"; libName = "rustls_pki_types"; features = { "default" = [ "alloc" ]; @@ -5693,9 +5744,9 @@ rec { }; "rustls-webpki" = rec { crateName = "rustls-webpki"; - version = "0.102.6"; + version = "0.102.8"; edition = "2021"; - sha256 = "0bl55zb5m78l45d8i5frracq96x8shsshmfwby1zsxm1zpa54swf"; + sha256 = "1sdy8ks86b7jpabpnb2px2s7f1sq8v0nqf6fnlvwzm4vfk41pjk4"; libName = "webpki"; dependencies = [ { @@ -5750,9 +5801,9 @@ rec { }; "schannel" = rec { crateName = "schannel"; - version = "0.1.23"; + version = "0.1.24"; edition = "2018"; - sha256 = "0d1m156bsjrws6xzzr1wyfyih9i22mb2csb5pc5kmkrvci2ibjgv"; + sha256 = "12wv1zwcs99rd4hnzc2fvmabvdihsvxq5780zxbxdqxnlbaszap9"; authors = [ "Steven Fackler " "Steffen Butzer " @@ -5760,14 +5811,14 @@ rec { dependencies = [ { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.59.0"; features = [ "Win32_Foundation" "Win32_Security_Cryptography" "Win32_Security_Authentication_Identity" "Win32_Security_Credentials" "Win32_System_Memory" ]; } ]; devDependencies = [ { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.59.0"; features = [ "Win32_System_SystemInformation" "Win32_System_Time" ]; } ]; @@ -5863,7 +5914,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "extra-traits" ]; } ]; @@ -5958,9 +6009,9 @@ rec { }; "security-framework-sys" = rec { crateName = "security-framework-sys"; - version = "2.11.1"; + version = "2.12.0"; edition = "2021"; - sha256 = "1byfpx39sbmndfjrlqqylcxdpn3mpjyb9d92dffzw24vkgz2knkm"; + sha256 = "1dml0lp9lrvvi01s011lyss5kzzsmakaamdwsxr0431jd4l2jjpa"; libName = "security_framework_sys"; authors = [ "Steven Fackler " @@ -6003,9 +6054,9 @@ rec { }; "serde" = rec { crateName = "serde"; - version = "1.0.209"; + version = "1.0.210"; edition = "2018"; - sha256 = "029yqqbb3c8v3gc720fhxn49dhgvb88zbyprdg5621riwzzy1z4r"; + sha256 = "0flc0z8wgax1k4j5bf2zyq48bgzyv425jkd5w0i6wbh7f8j5kqy8"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -6058,9 +6109,9 @@ rec { }; "serde_derive" = rec { crateName = "serde_derive"; - version = "1.0.209"; + version = "1.0.210"; edition = "2015"; - sha256 = "0w114ksg1ymnmqdisd0g1j3g8jgz6pam45xg6yb47dfpkybip0x5"; + sha256 = "07yzy4wafk79ps0hmbqmsqh5xjna4pm4q57wc847bb8gl3nh4f94"; procMacro = true; authors = [ "Erick Tryzelaar " @@ -6081,7 +6132,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" "proc-macro" ]; } @@ -6113,7 +6164,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" ]; } @@ -6122,9 +6173,9 @@ rec { }; "serde_json" = rec { crateName = "serde_json"; - version = "1.0.127"; + version = "1.0.128"; edition = "2021"; - sha256 = "1b99lgg1d986gwz5fbmmzmvjmqg5bx0lzmhy6rqp5gc2kxnw0hw0"; + sha256 = "1n43nia50ybpcfmh3gcw4lcc627qsg9nyakzwgkk9pm10xklbxbg"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -6401,18 +6452,18 @@ rec { }; resolvedDefaultFeatures = [ "default" "guide" "std" ]; }; - "snafu 0.8.4" = rec { + "snafu 0.8.5" = rec { crateName = "snafu"; - version = "0.8.4"; + version = "0.8.5"; edition = "2018"; - sha256 = "17f7w6d3szwc2s4q2vkc616yb4g70llqcbb7b90v63b60awmr0rb"; + sha256 = "06ahz9g4f6475rspfcay8512x776wpxc205rizzc6a9abv492f12"; authors = [ "Jake Goulding " ]; dependencies = [ { name = "snafu-derive"; - packageId = "snafu-derive 0.8.4"; + packageId = "snafu-derive 0.8.5"; } ]; features = { @@ -6426,6 +6477,7 @@ rec { "pin-project" = [ "dep:pin-project" ]; "rust_1_61" = [ "snafu-derive/rust_1_61" ]; "rust_1_65" = [ "rust_1_61" ]; + "rust_1_81" = [ "rust_1_65" ]; "unstable-provider-api" = [ "snafu-derive/unstable-provider-api" ]; }; resolvedDefaultFeatures = [ "default" "rust_1_61" "rust_1_65" "std" ]; @@ -6458,11 +6510,11 @@ rec { features = { }; }; - "snafu-derive 0.8.4" = rec { + "snafu-derive 0.8.5" = rec { crateName = "snafu-derive"; - version = "0.8.4"; + version = "0.8.5"; edition = "2018"; - sha256 = "1r8s45plv1nxy60d9xyvyjxz0692jh6aax1icj064ps0r8py1l9q"; + sha256 = "05zr38bcngn8ha4mfi7lr2pqqfysjhwhxvk9lz57xzkzjavwdhq3"; procMacro = true; libName = "snafu_derive"; authors = [ @@ -6484,7 +6536,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" ]; } ]; @@ -6509,7 +6561,7 @@ rec { } { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.52.0"; target = { target, features }: (target."windows" or false); features = [ "Win32_Foundation" "Win32_Networking_WinSock" "Win32_System_IO" "Win32_System_Threading" "Win32_System_WindowsProgramming" ]; } @@ -6572,7 +6624,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.4"; + packageId = "snafu 0.8.5"; } { name = "stackable-operator"; @@ -6626,8 +6678,7 @@ rec { } { name = "futures"; - packageId = "futures 0.3.30"; - features = [ "compat" ]; + packageId = "futures"; } { name = "product-config"; @@ -6644,7 +6695,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.4"; + packageId = "snafu 0.8.5"; } { name = "stackable-kafka-crd"; @@ -6686,13 +6737,13 @@ rec { }; "stackable-operator" = rec { crateName = "stackable-operator"; - version = "0.74.0"; + version = "0.78.0"; edition = "2021"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "c77a5423b66bc1667b63af7d8bec00de88a5303f"; - sha256 = "1g1a0v98wlcb36ibwv1nv75g3b3s1mjmaps443fc2w2maam94lya"; + rev = "8b0172ded942499845ebf647ef1b17ccfc7bdbb3"; + sha256 = "0nd05xk84s4jdd635ivvwp0lxqghxdxz45cf40xyx07k9bqq4fzg"; }; libName = "stackable_operator"; authors = [ @@ -6731,7 +6782,11 @@ rec { } { name = "futures"; - packageId = "futures 0.3.30"; + packageId = "futures"; + } + { + name = "indexmap"; + packageId = "indexmap"; } { name = "json-patch"; @@ -6741,7 +6796,7 @@ rec { name = "k8s-openapi"; packageId = "k8s-openapi"; usesDefaultFeatures = false; - features = [ "schemars" "v1_30" ]; + features = [ "schemars" "v1_31" ]; } { name = "kube"; @@ -6791,7 +6846,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.8.4"; + packageId = "snafu 0.8.5"; } { name = "stackable-operator-derive"; @@ -6841,8 +6896,8 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "c77a5423b66bc1667b63af7d8bec00de88a5303f"; - sha256 = "1g1a0v98wlcb36ibwv1nv75g3b3s1mjmaps443fc2w2maam94lya"; + rev = "8b0172ded942499845ebf647ef1b17ccfc7bdbb3"; + sha256 = "0nd05xk84s4jdd635ivvwp0lxqghxdxz45cf40xyx07k9bqq4fzg"; }; procMacro = true; libName = "stackable_operator_derive"; @@ -6864,7 +6919,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; } ]; @@ -6937,7 +6992,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "parsing" "extra-traits" ]; } ]; @@ -6990,11 +7045,11 @@ rec { }; resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "extra-traits" "full" "parsing" "printing" "proc-macro" "quote" "visit" ]; }; - "syn 2.0.76" = rec { + "syn 2.0.79" = rec { crateName = "syn"; - version = "2.0.76"; + version = "2.0.79"; edition = "2021"; - sha256 = "09fmdkmqqkkfkg53qnldl10ppwqkqlw22ixhg4rgrkp02hd0i3jp"; + sha256 = "147mk4sgigmvsb9l8qzj199ygf0fgb0bphwdsghn8205pz82q4w9"; authors = [ "David Tolnay " ]; @@ -7025,9 +7080,9 @@ rec { }; "thiserror" = rec { crateName = "thiserror"; - version = "1.0.63"; + version = "1.0.64"; edition = "2021"; - sha256 = "092p83mf4p1vkjb2j6h6z96dan4raq2simhirjv12slbndq26d60"; + sha256 = "114s8lmssxl0c2480s671am88vzlasbaikxbvfv8pyqrq6mzh2nm"; authors = [ "David Tolnay " ]; @@ -7041,9 +7096,9 @@ rec { }; "thiserror-impl" = rec { crateName = "thiserror-impl"; - version = "1.0.63"; + version = "1.0.64"; edition = "2021"; - sha256 = "0qd21l2jjrkvnpr5da3l3b58v4wmrkn6aa0h1z5dg6kb8rc8nmd4"; + sha256 = "1hvzmjx9iamln854l74qyhs0jl2pg3hhqzpqm9p8gszmf9v4x408"; procMacro = true; libName = "thiserror_impl"; authors = [ @@ -7060,7 +7115,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; } ]; @@ -7299,9 +7354,9 @@ rec { }; "tokio" = rec { crateName = "tokio"; - version = "1.39.3"; + version = "1.40.0"; edition = "2021"; - sha256 = "1xgzhj7bxqqpjaabjkgsx8hi0f600bzj4iyp9f0a9gr3k6dwkawv"; + sha256 = "166rllhfkyqp0fs7sxn6crv74iizi4wzd3cvxkcpmlk52qip1c72"; authors = [ "Tokio Contributors " ]; @@ -7357,7 +7412,7 @@ rec { } { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.52.0"; optional = true; target = { target, features }: (target."windows" or false); } @@ -7375,7 +7430,7 @@ rec { } { name = "windows-sys"; - packageId = "windows-sys"; + packageId = "windows-sys 0.52.0"; target = {target, features}: (target."windows" or false); features = [ "Win32_Foundation" "Win32_Security_Authorization" ]; } @@ -7422,7 +7477,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" ]; } ]; @@ -7471,9 +7526,9 @@ rec { }; "tokio-stream" = rec { crateName = "tokio-stream"; - version = "0.1.15"; + version = "0.1.16"; edition = "2021"; - sha256 = "1brpbsqyg8yfmfc4y0j9zxvc8xsxjc31d48kb0g6jvpc1fgchyi6"; + sha256 = "1wc65gprcsyzqlr0k091glswy96kph90i32gffi4ksyh03hnqkjg"; libName = "tokio_stream"; authors = [ "Tokio Contributors " @@ -7515,9 +7570,9 @@ rec { }; "tokio-util" = rec { crateName = "tokio-util"; - version = "0.7.11"; + version = "0.7.12"; edition = "2021"; - sha256 = "1qcz30db6m8lxkl61b3nic4bim1symi636nhbb3rmi3i6xxv9xlw"; + sha256 = "0spc0g4irbnf2flgag22gfii87avqzibwfm0si0d1g0k9ijw7rv1"; libName = "tokio_util"; authors = [ "Tokio Contributors " @@ -7587,9 +7642,9 @@ rec { }; "toml_edit" = rec { crateName = "toml_edit"; - version = "0.21.1"; + version = "0.22.22"; edition = "2021"; - sha256 = "1qch02syrd9c8krcimfl72gyjz11fmjssh03hrg41dbqgzyk91ba"; + sha256 = "1xf7sxfzmnc45f75x302qrn5aph52vc8w226v59yhrm211i8vr2a"; authors = [ "Andronik Ordian " "Ed Page " @@ -7721,7 +7776,7 @@ rec { "tracing" = [ "dep:tracing" ]; "util" = [ "__common" "futures-util" "pin-project" ]; }; - resolvedDefaultFeatures = [ "__common" "buffer" "default" "filter" "futures-core" "futures-util" "log" "make" "pin-project" "pin-project-lite" "tokio" "tokio-util" "tracing" "util" ]; + resolvedDefaultFeatures = [ "__common" "buffer" "default" "filter" "futures-core" "futures-util" "log" "pin-project" "pin-project-lite" "tokio" "tokio-util" "tracing" "util" ]; }; "tower-http" = rec { crateName = "tower-http"; @@ -7956,7 +8011,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; usesDefaultFeatures = false; features = [ "full" "parsing" "printing" "visit-mut" "clone-impls" "extra-traits" "proc-macro" ]; } @@ -8307,9 +8362,9 @@ rec { }; "ucd-trie" = rec { crateName = "ucd-trie"; - version = "0.1.6"; + version = "0.1.7"; edition = "2021"; - sha256 = "1ff4yfksirqs37ybin9aw71aa5gva00hw7jdxbw8w668zy964r7d"; + sha256 = "0wc9p07sqwz320848i52nvyjvpsxkx3kv5bfbmm6s35809fdk5i8"; libName = "ucd_trie"; authors = [ "Andrew Gallant " @@ -8340,9 +8395,9 @@ rec { }; "unicode-ident" = rec { crateName = "unicode-ident"; - version = "1.0.12"; + version = "1.0.13"; edition = "2018"; - sha256 = "0jzf1znfpb2gx8nr8mvmyqs1crnv79l57nxnbiszc7xf7ynbjm1k"; + sha256 = "1zm1xylzsdfvm2a5ib9li3g5pp7qnkv4amhspydvgbmd9k6mc6z9"; libName = "unicode_ident"; authors = [ "David Tolnay " @@ -8351,9 +8406,9 @@ rec { }; "unicode-normalization" = rec { crateName = "unicode-normalization"; - version = "0.1.23"; + version = "0.1.24"; edition = "2018"; - sha256 = "1x81a50h2zxigj74b9bqjsirxxbyhmis54kg600xj213vf31cvd5"; + sha256 = "0mnrk809z3ix1wspcqy97ld5wxdb31f3xz6nsvg5qcv289ycjcsh"; libName = "unicode_normalization"; authors = [ "kwantam " @@ -8373,9 +8428,9 @@ rec { }; "unicode-xid" = rec { crateName = "unicode-xid"; - version = "0.2.5"; + version = "0.2.6"; edition = "2015"; - sha256 = "02n96yhcjwx7vphbwf9p7xfqbwvqgzdw2qz4h0x3wd5wgxj315r2"; + sha256 = "0lzqaky89fq0bcrh6jj6bhlz37scfd8c7dsj5dq7y32if56c1hgb"; libName = "unicode_xid"; authors = [ "erick.tryzelaar " @@ -8594,7 +8649,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "full" ]; } { @@ -8653,7 +8708,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; features = [ "visit" "full" ]; } { @@ -8772,7 +8827,7 @@ rec { }; resolvedDefaultFeatures = [ "default" ]; }; - "windows-sys" = rec { + "windows-sys 0.52.0" = rec { crateName = "windows-sys"; version = "0.52.0"; edition = "2021"; @@ -9018,7 +9073,266 @@ rec { "Win32_Web" = [ "Win32" ]; "Win32_Web_InternetExplorer" = [ "Win32_Web" ]; }; - resolvedDefaultFeatures = [ "Wdk" "Wdk_Foundation" "Wdk_Storage" "Wdk_Storage_FileSystem" "Wdk_System" "Wdk_System_IO" "Win32" "Win32_Foundation" "Win32_Networking" "Win32_Networking_WinSock" "Win32_Security" "Win32_Security_Authentication" "Win32_Security_Authentication_Identity" "Win32_Security_Credentials" "Win32_Security_Cryptography" "Win32_Storage" "Win32_Storage_FileSystem" "Win32_System" "Win32_System_Com" "Win32_System_Console" "Win32_System_IO" "Win32_System_Memory" "Win32_System_Pipes" "Win32_System_SystemServices" "Win32_System_Threading" "Win32_System_WindowsProgramming" "Win32_UI" "Win32_UI_Shell" "default" ]; + resolvedDefaultFeatures = [ "Wdk" "Wdk_Foundation" "Wdk_Storage" "Wdk_Storage_FileSystem" "Wdk_System" "Wdk_System_IO" "Win32" "Win32_Foundation" "Win32_Networking" "Win32_Networking_WinSock" "Win32_Security" "Win32_Storage" "Win32_Storage_FileSystem" "Win32_System" "Win32_System_Com" "Win32_System_Console" "Win32_System_IO" "Win32_System_Pipes" "Win32_System_SystemServices" "Win32_System_Threading" "Win32_System_WindowsProgramming" "Win32_UI" "Win32_UI_Shell" "default" ]; + }; + "windows-sys 0.59.0" = rec { + crateName = "windows-sys"; + version = "0.59.0"; + edition = "2021"; + sha256 = "0fw5672ziw8b3zpmnbp9pdv1famk74f1l9fcbc3zsrzdg56vqf0y"; + libName = "windows_sys"; + authors = [ + "Microsoft" + ]; + dependencies = [ + { + name = "windows-targets"; + packageId = "windows-targets"; + } + ]; + features = { + "Wdk" = [ "Win32_Foundation" ]; + "Wdk_Devices" = [ "Wdk" ]; + "Wdk_Devices_Bluetooth" = [ "Wdk_Devices" ]; + "Wdk_Devices_HumanInterfaceDevice" = [ "Wdk_Devices" ]; + "Wdk_Foundation" = [ "Wdk" ]; + "Wdk_Graphics" = [ "Wdk" ]; + "Wdk_Graphics_Direct3D" = [ "Wdk_Graphics" ]; + "Wdk_NetworkManagement" = [ "Wdk" ]; + "Wdk_NetworkManagement_Ndis" = [ "Wdk_NetworkManagement" ]; + "Wdk_NetworkManagement_WindowsFilteringPlatform" = [ "Wdk_NetworkManagement" ]; + "Wdk_Storage" = [ "Wdk" ]; + "Wdk_Storage_FileSystem" = [ "Wdk_Storage" ]; + "Wdk_Storage_FileSystem_Minifilters" = [ "Wdk_Storage_FileSystem" ]; + "Wdk_System" = [ "Wdk" ]; + "Wdk_System_IO" = [ "Wdk_System" ]; + "Wdk_System_Memory" = [ "Wdk_System" ]; + "Wdk_System_OfflineRegistry" = [ "Wdk_System" ]; + "Wdk_System_Registry" = [ "Wdk_System" ]; + "Wdk_System_SystemInformation" = [ "Wdk_System" ]; + "Wdk_System_SystemServices" = [ "Wdk_System" ]; + "Wdk_System_Threading" = [ "Wdk_System" ]; + "Win32" = [ "Win32_Foundation" ]; + "Win32_Data" = [ "Win32" ]; + "Win32_Data_HtmlHelp" = [ "Win32_Data" ]; + "Win32_Data_RightsManagement" = [ "Win32_Data" ]; + "Win32_Devices" = [ "Win32" ]; + "Win32_Devices_AllJoyn" = [ "Win32_Devices" ]; + "Win32_Devices_BiometricFramework" = [ "Win32_Devices" ]; + "Win32_Devices_Bluetooth" = [ "Win32_Devices" ]; + "Win32_Devices_Communication" = [ "Win32_Devices" ]; + "Win32_Devices_DeviceAndDriverInstallation" = [ "Win32_Devices" ]; + "Win32_Devices_DeviceQuery" = [ "Win32_Devices" ]; + "Win32_Devices_Display" = [ "Win32_Devices" ]; + "Win32_Devices_Enumeration" = [ "Win32_Devices" ]; + "Win32_Devices_Enumeration_Pnp" = [ "Win32_Devices_Enumeration" ]; + "Win32_Devices_Fax" = [ "Win32_Devices" ]; + "Win32_Devices_HumanInterfaceDevice" = [ "Win32_Devices" ]; + "Win32_Devices_PortableDevices" = [ "Win32_Devices" ]; + "Win32_Devices_Properties" = [ "Win32_Devices" ]; + "Win32_Devices_Pwm" = [ "Win32_Devices" ]; + "Win32_Devices_Sensors" = [ "Win32_Devices" ]; + "Win32_Devices_SerialCommunication" = [ "Win32_Devices" ]; + "Win32_Devices_Tapi" = [ "Win32_Devices" ]; + "Win32_Devices_Usb" = [ "Win32_Devices" ]; + "Win32_Devices_WebServicesOnDevices" = [ "Win32_Devices" ]; + "Win32_Foundation" = [ "Win32" ]; + "Win32_Gaming" = [ "Win32" ]; + "Win32_Globalization" = [ "Win32" ]; + "Win32_Graphics" = [ "Win32" ]; + "Win32_Graphics_Dwm" = [ "Win32_Graphics" ]; + "Win32_Graphics_Gdi" = [ "Win32_Graphics" ]; + "Win32_Graphics_GdiPlus" = [ "Win32_Graphics" ]; + "Win32_Graphics_Hlsl" = [ "Win32_Graphics" ]; + "Win32_Graphics_OpenGL" = [ "Win32_Graphics" ]; + "Win32_Graphics_Printing" = [ "Win32_Graphics" ]; + "Win32_Graphics_Printing_PrintTicket" = [ "Win32_Graphics_Printing" ]; + "Win32_Management" = [ "Win32" ]; + "Win32_Management_MobileDeviceManagementRegistration" = [ "Win32_Management" ]; + "Win32_Media" = [ "Win32" ]; + "Win32_Media_Audio" = [ "Win32_Media" ]; + "Win32_Media_DxMediaObjects" = [ "Win32_Media" ]; + "Win32_Media_KernelStreaming" = [ "Win32_Media" ]; + "Win32_Media_Multimedia" = [ "Win32_Media" ]; + "Win32_Media_Streaming" = [ "Win32_Media" ]; + "Win32_Media_WindowsMediaFormat" = [ "Win32_Media" ]; + "Win32_NetworkManagement" = [ "Win32" ]; + "Win32_NetworkManagement_Dhcp" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_Dns" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_InternetConnectionWizard" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_IpHelper" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_Multicast" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_Ndis" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_NetBios" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_NetManagement" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_NetShell" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_NetworkDiagnosticsFramework" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_P2P" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_QoS" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_Rras" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_Snmp" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_WNet" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_WebDav" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_WiFi" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_WindowsConnectionManager" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_WindowsFilteringPlatform" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_WindowsFirewall" = [ "Win32_NetworkManagement" ]; + "Win32_NetworkManagement_WindowsNetworkVirtualization" = [ "Win32_NetworkManagement" ]; + "Win32_Networking" = [ "Win32" ]; + "Win32_Networking_ActiveDirectory" = [ "Win32_Networking" ]; + "Win32_Networking_Clustering" = [ "Win32_Networking" ]; + "Win32_Networking_HttpServer" = [ "Win32_Networking" ]; + "Win32_Networking_Ldap" = [ "Win32_Networking" ]; + "Win32_Networking_WebSocket" = [ "Win32_Networking" ]; + "Win32_Networking_WinHttp" = [ "Win32_Networking" ]; + "Win32_Networking_WinInet" = [ "Win32_Networking" ]; + "Win32_Networking_WinSock" = [ "Win32_Networking" ]; + "Win32_Networking_WindowsWebServices" = [ "Win32_Networking" ]; + "Win32_Security" = [ "Win32" ]; + "Win32_Security_AppLocker" = [ "Win32_Security" ]; + "Win32_Security_Authentication" = [ "Win32_Security" ]; + "Win32_Security_Authentication_Identity" = [ "Win32_Security_Authentication" ]; + "Win32_Security_Authorization" = [ "Win32_Security" ]; + "Win32_Security_Credentials" = [ "Win32_Security" ]; + "Win32_Security_Cryptography" = [ "Win32_Security" ]; + "Win32_Security_Cryptography_Catalog" = [ "Win32_Security_Cryptography" ]; + "Win32_Security_Cryptography_Certificates" = [ "Win32_Security_Cryptography" ]; + "Win32_Security_Cryptography_Sip" = [ "Win32_Security_Cryptography" ]; + "Win32_Security_Cryptography_UI" = [ "Win32_Security_Cryptography" ]; + "Win32_Security_DiagnosticDataQuery" = [ "Win32_Security" ]; + "Win32_Security_DirectoryServices" = [ "Win32_Security" ]; + "Win32_Security_EnterpriseData" = [ "Win32_Security" ]; + "Win32_Security_ExtensibleAuthenticationProtocol" = [ "Win32_Security" ]; + "Win32_Security_Isolation" = [ "Win32_Security" ]; + "Win32_Security_LicenseProtection" = [ "Win32_Security" ]; + "Win32_Security_NetworkAccessProtection" = [ "Win32_Security" ]; + "Win32_Security_WinTrust" = [ "Win32_Security" ]; + "Win32_Security_WinWlx" = [ "Win32_Security" ]; + "Win32_Storage" = [ "Win32" ]; + "Win32_Storage_Cabinets" = [ "Win32_Storage" ]; + "Win32_Storage_CloudFilters" = [ "Win32_Storage" ]; + "Win32_Storage_Compression" = [ "Win32_Storage" ]; + "Win32_Storage_DistributedFileSystem" = [ "Win32_Storage" ]; + "Win32_Storage_FileHistory" = [ "Win32_Storage" ]; + "Win32_Storage_FileSystem" = [ "Win32_Storage" ]; + "Win32_Storage_Imapi" = [ "Win32_Storage" ]; + "Win32_Storage_IndexServer" = [ "Win32_Storage" ]; + "Win32_Storage_InstallableFileSystems" = [ "Win32_Storage" ]; + "Win32_Storage_IscsiDisc" = [ "Win32_Storage" ]; + "Win32_Storage_Jet" = [ "Win32_Storage" ]; + "Win32_Storage_Nvme" = [ "Win32_Storage" ]; + "Win32_Storage_OfflineFiles" = [ "Win32_Storage" ]; + "Win32_Storage_OperationRecorder" = [ "Win32_Storage" ]; + "Win32_Storage_Packaging" = [ "Win32_Storage" ]; + "Win32_Storage_Packaging_Appx" = [ "Win32_Storage_Packaging" ]; + "Win32_Storage_ProjectedFileSystem" = [ "Win32_Storage" ]; + "Win32_Storage_StructuredStorage" = [ "Win32_Storage" ]; + "Win32_Storage_Vhd" = [ "Win32_Storage" ]; + "Win32_Storage_Xps" = [ "Win32_Storage" ]; + "Win32_System" = [ "Win32" ]; + "Win32_System_AddressBook" = [ "Win32_System" ]; + "Win32_System_Antimalware" = [ "Win32_System" ]; + "Win32_System_ApplicationInstallationAndServicing" = [ "Win32_System" ]; + "Win32_System_ApplicationVerifier" = [ "Win32_System" ]; + "Win32_System_ClrHosting" = [ "Win32_System" ]; + "Win32_System_Com" = [ "Win32_System" ]; + "Win32_System_Com_Marshal" = [ "Win32_System_Com" ]; + "Win32_System_Com_StructuredStorage" = [ "Win32_System_Com" ]; + "Win32_System_Com_Urlmon" = [ "Win32_System_Com" ]; + "Win32_System_ComponentServices" = [ "Win32_System" ]; + "Win32_System_Console" = [ "Win32_System" ]; + "Win32_System_CorrelationVector" = [ "Win32_System" ]; + "Win32_System_DataExchange" = [ "Win32_System" ]; + "Win32_System_DeploymentServices" = [ "Win32_System" ]; + "Win32_System_DeveloperLicensing" = [ "Win32_System" ]; + "Win32_System_Diagnostics" = [ "Win32_System" ]; + "Win32_System_Diagnostics_Ceip" = [ "Win32_System_Diagnostics" ]; + "Win32_System_Diagnostics_Debug" = [ "Win32_System_Diagnostics" ]; + "Win32_System_Diagnostics_Debug_Extensions" = [ "Win32_System_Diagnostics_Debug" ]; + "Win32_System_Diagnostics_Etw" = [ "Win32_System_Diagnostics" ]; + "Win32_System_Diagnostics_ProcessSnapshotting" = [ "Win32_System_Diagnostics" ]; + "Win32_System_Diagnostics_ToolHelp" = [ "Win32_System_Diagnostics" ]; + "Win32_System_Diagnostics_TraceLogging" = [ "Win32_System_Diagnostics" ]; + "Win32_System_DistributedTransactionCoordinator" = [ "Win32_System" ]; + "Win32_System_Environment" = [ "Win32_System" ]; + "Win32_System_ErrorReporting" = [ "Win32_System" ]; + "Win32_System_EventCollector" = [ "Win32_System" ]; + "Win32_System_EventLog" = [ "Win32_System" ]; + "Win32_System_EventNotificationService" = [ "Win32_System" ]; + "Win32_System_GroupPolicy" = [ "Win32_System" ]; + "Win32_System_HostCompute" = [ "Win32_System" ]; + "Win32_System_HostComputeNetwork" = [ "Win32_System" ]; + "Win32_System_HostComputeSystem" = [ "Win32_System" ]; + "Win32_System_Hypervisor" = [ "Win32_System" ]; + "Win32_System_IO" = [ "Win32_System" ]; + "Win32_System_Iis" = [ "Win32_System" ]; + "Win32_System_Ioctl" = [ "Win32_System" ]; + "Win32_System_JobObjects" = [ "Win32_System" ]; + "Win32_System_Js" = [ "Win32_System" ]; + "Win32_System_Kernel" = [ "Win32_System" ]; + "Win32_System_LibraryLoader" = [ "Win32_System" ]; + "Win32_System_Mailslots" = [ "Win32_System" ]; + "Win32_System_Mapi" = [ "Win32_System" ]; + "Win32_System_Memory" = [ "Win32_System" ]; + "Win32_System_Memory_NonVolatile" = [ "Win32_System_Memory" ]; + "Win32_System_MessageQueuing" = [ "Win32_System" ]; + "Win32_System_MixedReality" = [ "Win32_System" ]; + "Win32_System_Ole" = [ "Win32_System" ]; + "Win32_System_PasswordManagement" = [ "Win32_System" ]; + "Win32_System_Performance" = [ "Win32_System" ]; + "Win32_System_Performance_HardwareCounterProfiling" = [ "Win32_System_Performance" ]; + "Win32_System_Pipes" = [ "Win32_System" ]; + "Win32_System_Power" = [ "Win32_System" ]; + "Win32_System_ProcessStatus" = [ "Win32_System" ]; + "Win32_System_Recovery" = [ "Win32_System" ]; + "Win32_System_Registry" = [ "Win32_System" ]; + "Win32_System_RemoteDesktop" = [ "Win32_System" ]; + "Win32_System_RemoteManagement" = [ "Win32_System" ]; + "Win32_System_RestartManager" = [ "Win32_System" ]; + "Win32_System_Restore" = [ "Win32_System" ]; + "Win32_System_Rpc" = [ "Win32_System" ]; + "Win32_System_Search" = [ "Win32_System" ]; + "Win32_System_Search_Common" = [ "Win32_System_Search" ]; + "Win32_System_SecurityCenter" = [ "Win32_System" ]; + "Win32_System_Services" = [ "Win32_System" ]; + "Win32_System_SetupAndMigration" = [ "Win32_System" ]; + "Win32_System_Shutdown" = [ "Win32_System" ]; + "Win32_System_StationsAndDesktops" = [ "Win32_System" ]; + "Win32_System_SubsystemForLinux" = [ "Win32_System" ]; + "Win32_System_SystemInformation" = [ "Win32_System" ]; + "Win32_System_SystemServices" = [ "Win32_System" ]; + "Win32_System_Threading" = [ "Win32_System" ]; + "Win32_System_Time" = [ "Win32_System" ]; + "Win32_System_TpmBaseServices" = [ "Win32_System" ]; + "Win32_System_UserAccessLogging" = [ "Win32_System" ]; + "Win32_System_Variant" = [ "Win32_System" ]; + "Win32_System_VirtualDosMachines" = [ "Win32_System" ]; + "Win32_System_WindowsProgramming" = [ "Win32_System" ]; + "Win32_System_Wmi" = [ "Win32_System" ]; + "Win32_UI" = [ "Win32" ]; + "Win32_UI_Accessibility" = [ "Win32_UI" ]; + "Win32_UI_ColorSystem" = [ "Win32_UI" ]; + "Win32_UI_Controls" = [ "Win32_UI" ]; + "Win32_UI_Controls_Dialogs" = [ "Win32_UI_Controls" ]; + "Win32_UI_HiDpi" = [ "Win32_UI" ]; + "Win32_UI_Input" = [ "Win32_UI" ]; + "Win32_UI_Input_Ime" = [ "Win32_UI_Input" ]; + "Win32_UI_Input_KeyboardAndMouse" = [ "Win32_UI_Input" ]; + "Win32_UI_Input_Pointer" = [ "Win32_UI_Input" ]; + "Win32_UI_Input_Touch" = [ "Win32_UI_Input" ]; + "Win32_UI_Input_XboxController" = [ "Win32_UI_Input" ]; + "Win32_UI_InteractionContext" = [ "Win32_UI" ]; + "Win32_UI_Magnification" = [ "Win32_UI" ]; + "Win32_UI_Shell" = [ "Win32_UI" ]; + "Win32_UI_Shell_Common" = [ "Win32_UI_Shell" ]; + "Win32_UI_Shell_PropertiesSystem" = [ "Win32_UI_Shell" ]; + "Win32_UI_TabletPC" = [ "Win32_UI" ]; + "Win32_UI_TextServices" = [ "Win32_UI" ]; + "Win32_UI_WindowsAndMessaging" = [ "Win32_UI" ]; + "Win32_Web" = [ "Win32" ]; + "Win32_Web_InternetExplorer" = [ "Win32_Web" ]; + }; + resolvedDefaultFeatures = [ "Win32" "Win32_Foundation" "Win32_Security" "Win32_Security_Authentication" "Win32_Security_Authentication_Identity" "Win32_Security_Credentials" "Win32_Security_Cryptography" "Win32_System" "Win32_System_Memory" "default" ]; }; "windows-targets" = rec { crateName = "windows-targets"; @@ -9155,9 +9469,9 @@ rec { }; "winnow" = rec { crateName = "winnow"; - version = "0.5.40"; + version = "0.6.20"; edition = "2021"; - sha256 = "0xk8maai7gyxda673mmw3pj1hdizy5fpi7287vaywykkk19sk4zm"; + sha256 = "16y4i8z9vh8hazjxg5mvmq0c5i35wlk8rxi5gkq6cn5vlb0zxh9n"; dependencies = [ { name = "memchr"; @@ -9167,7 +9481,7 @@ rec { } ]; features = { - "debug" = [ "dep:anstream" "dep:anstyle" "dep:is-terminal" "dep:terminal_size" ]; + "debug" = [ "std" "dep:anstream" "dep:anstyle" "dep:is-terminal" "dep:terminal_size" ]; "default" = [ "std" ]; "simd" = [ "dep:memchr" ]; "std" = [ "alloc" "memchr?/std" ]; @@ -9177,10 +9491,10 @@ rec { }; "xml-rs" = rec { crateName = "xml-rs"; - version = "0.8.21"; + version = "0.8.22"; edition = "2021"; crateBin = []; - sha256 = "00g63s3kcnj69hsgg96gvbh822qa71vv2sfsqvf37qqdgkp7g6jk"; + sha256 = "09pg779vjh0xp3ph10j4wy1ihz8pzvxm1qf1jqw0jnmsghpjwkmg"; libName = "xml"; authors = [ "Vladimir Matveev " @@ -9250,7 +9564,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.76"; + packageId = "syn 2.0.79"; } ]; diff --git a/Cargo.toml b/Cargo.toml index 4fc428ca..110b7af7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ repository = "https://github.com/stackabletech/kafka-operator" anyhow = "1.0" built = { version = "0.7", features = ["chrono", "git2"] } clap = "4.5" -futures = { version = "0.3", features = ["compat"] } +futures = { version = "0.3" } indoc = "2.0" product-config = { git = "https://github.com/stackabletech/product-config.git", tag = "0.7.0" } rstest = "0.23" @@ -28,4 +28,5 @@ tokio = { version = "1.40", features = ["full"] } tracing = "0.1" # [patch."https://github.com/stackabletech/operator-rs.git"] +# stackable-operator = { path = "../operator-rs/crates/stackable-operator" } # stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "main" } diff --git a/crate-hashes.json b/crate-hashes.json index 8725a492..51bd7d5b 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -1,5 +1,5 @@ { - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.74.0#stackable-operator-derive@0.3.1": "1g1a0v98wlcb36ibwv1nv75g3b3s1mjmaps443fc2w2maam94lya", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.74.0#stackable-operator@0.74.0": "1g1a0v98wlcb36ibwv1nv75g3b3s1mjmaps443fc2w2maam94lya", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.78.0#stackable-operator-derive@0.3.1": "0nd05xk84s4jdd635ivvwp0lxqghxdxz45cf40xyx07k9bqq4fzg", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.78.0#stackable-operator@0.78.0": "0nd05xk84s4jdd635ivvwp0lxqghxdxz45cf40xyx07k9bqq4fzg", "git+https://github.com/stackabletech/product-config.git?tag=0.7.0#product-config@0.7.0": "0gjsm80g6r75pm3824dcyiz4ysq1ka4c1if6k1mjm9cnd5ym0gny" } \ No newline at end of file diff --git a/deploy/helm/kafka-operator/crds/crds.yaml b/deploy/helm/kafka-operator/crds/crds.yaml index 273022a3..4c6ead0f 100644 --- a/deploy/helm/kafka-operator/crds/crds.yaml +++ b/deploy/helm/kafka-operator/crds/crds.yaml @@ -67,6 +67,14 @@ spec: type: object x-kubernetes-preserve-unknown-fields: true type: object + bootstrapListenerClass: + description: The ListenerClass used for bootstrapping new clients. Should use a stable ListenerClass to avoid unnecessary client restarts (such as `cluster-internal` or `external-stable`). + nullable: true + type: string + brokerListenerClass: + description: The ListenerClass used for connecting to brokers. Should use a direct connection ListenerClass to minimize cost and minimize performance overhead (such as `cluster-internal` or `external-unstable`). + nullable: true + type: string gracefulShutdownTimeout: description: Time period Pods have to gracefully shut down, e.g. `30m`, `1h` or `2d`. Consult the operator documentation for details. nullable: true @@ -330,6 +338,14 @@ spec: type: object x-kubernetes-preserve-unknown-fields: true type: object + bootstrapListenerClass: + description: The ListenerClass used for bootstrapping new clients. Should use a stable ListenerClass to avoid unnecessary client restarts (such as `cluster-internal` or `external-stable`). + nullable: true + type: string + brokerListenerClass: + description: The ListenerClass used for connecting to brokers. Should use a direct connection ListenerClass to minimize cost and minimize performance overhead (such as `cluster-internal` or `external-unstable`). + nullable: true + type: string gracefulShutdownTimeout: description: Time period Pods have to gracefully shut down, e.g. `30m`, `1h` or `2d`. Consult the operator documentation for details. nullable: true diff --git a/deploy/helm/kafka-operator/templates/roles-kafka.yaml b/deploy/helm/kafka-operator/templates/roles-kafka.yaml index b8e445ba..d1497b4f 100644 --- a/deploy/helm/kafka-operator/templates/roles-kafka.yaml +++ b/deploy/helm/kafka-operator/templates/roles-kafka.yaml @@ -2,10 +2,4 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: {{ include "operator.fullname" . }}-kafka-broker-clusterrole -rules: - - apiGroups: - - "" - resources: - - services - verbs: - - get +rules: [] diff --git a/deploy/helm/kafka-operator/templates/roles.yaml b/deploy/helm/kafka-operator/templates/roles.yaml index aa366505..52fa9d25 100644 --- a/deploy/helm/kafka-operator/templates/roles.yaml +++ b/deploy/helm/kafka-operator/templates/roles.yaml @@ -113,6 +113,17 @@ rules: - get - list - watch + - apiGroups: + - listeners.stackable.tech + resources: + - listeners + verbs: + - get + - list + - watch + - patch + - create + - delete - apiGroups: - rbac.authorization.k8s.io resources: diff --git a/docs/modules/kafka/examples/getting_started/kafka.yaml b/docs/modules/kafka/examples/getting_started/kafka.yaml index 26ebf007..fad811e1 100644 --- a/docs/modules/kafka/examples/getting_started/kafka.yaml +++ b/docs/modules/kafka/examples/getting_started/kafka.yaml @@ -11,6 +11,9 @@ spec: serverSecretClass: null zookeeperConfigMapName: simple-kafka-znode brokers: + config: + bootstrapListenerClass: external-unstable # This exposes your Stacklet outside of Kubernetes. Remove this property if this is not desired + brokerListenerClass: external-unstable # This exposes your Stacklet outside of Kubernetes. Remove this property if this is not desired roleGroups: default: replicas: 3 diff --git a/docs/modules/kafka/pages/usage-guide/listenerclass.adoc b/docs/modules/kafka/pages/usage-guide/listenerclass.adoc new file mode 100644 index 00000000..b9fbf741 --- /dev/null +++ b/docs/modules/kafka/pages/usage-guide/listenerclass.adoc @@ -0,0 +1,24 @@ += Service exposition with ListenerClasses + +The operator deploys a bootstrap xref:listener-operator:listener.adoc[Listener] for each broker rolegroup, as well as a xref:listener-operator:listener.adoc[Listener] for each broker pod. + +The bootstrap Listener is used to negotiate clients' initial connection to the cluster, after which a connection is made to the relevant broker Listeners. + +NOTE: Every bootstrap xref:listener-operator:listener.adoc[Listener] (regardless of the underlying rolegroup) will direct clients to the broker listeners of all brokers of all rolegroups. + +They both default to only being accessible from within the Kubernetes cluster, but this can be changed by setting `.spec.brokers.config.{bootstrap,broker}ListenerClass`. + +The cluster can be configured to be accessible from outside of Kubernetes like this: + +[source,yaml] +---- +spec: + brokers: + config: + bootstrapListenerClass: external-stable # <1> + brokerListenerClass: external-unstable # <2> +---- +<1> Bootstrap listeners should prioritize having a stable address, since they will be baked into the client configuration. +<2> Broker listeners should prioritize having a direct connection, to minimize network transfer overhead. + +NOTE: All rolegroups should use the same ListenerClass, or at least ones with similar properties. Clients will be unable to access data stored on replicas in rolegroups with inaccessible ListenerClasses. diff --git a/docs/modules/kafka/partials/nav.adoc b/docs/modules/kafka/partials/nav.adoc index fa2deedc..ed7f9352 100644 --- a/docs/modules/kafka/partials/nav.adoc +++ b/docs/modules/kafka/partials/nav.adoc @@ -2,6 +2,7 @@ ** xref:kafka:getting_started/installation.adoc[] ** xref:kafka:getting_started/first_steps.adoc[] * xref:kafka:usage-guide/index.adoc[] +** xref:kafka:usage-guide/listenerclass.adoc[] ** xref:kafka:usage-guide/storage-resources.adoc[] ** xref:kafka:usage-guide/security.adoc[] ** xref:kafka:usage-guide/monitoring.adoc[] diff --git a/rust/crd/src/lib.rs b/rust/crd/src/lib.rs index efe2d8e7..f44338a0 100644 --- a/rust/crd/src/lib.rs +++ b/rust/crd/src/lib.rs @@ -52,7 +52,10 @@ pub const KAFKA_HEAP_OPTS: &str = "KAFKA_HEAP_OPTS"; // server_properties pub const LOG_DIRS_VOLUME_NAME: &str = "log-dirs"; // directories -pub const STACKABLE_TMP_DIR: &str = "/stackable/tmp"; +pub const LISTENER_BROKER_VOLUME_NAME: &str = "listener-broker"; +pub const LISTENER_BOOTSTRAP_VOLUME_NAME: &str = "listener-bootstrap"; +pub const STACKABLE_LISTENER_BROKER_DIR: &str = "/stackable/listener-broker"; +pub const STACKABLE_LISTENER_BOOTSTRAP_DIR: &str = "/stackable/listener-bootstrap"; pub const STACKABLE_DATA_DIR: &str = "/stackable/data"; pub const STACKABLE_CONFIG_DIR: &str = "/stackable/config"; pub const STACKABLE_LOG_CONFIG_DIR: &str = "/stackable/log_config"; @@ -164,8 +167,8 @@ pub struct KafkaClusterConfig { impl KafkaCluster { /// The name of the load-balanced Kubernetes Service providing the bootstrap address. Kafka clients will use this /// to get a list of broker addresses and will use those to transmit data to the correct broker. - pub fn bootstrap_service_name(&self) -> String { - self.name_any() + pub fn bootstrap_service_name(&self, rolegroup: &RoleGroupRef) -> String { + format!("{}-bootstrap", rolegroup.object_name()) } /// Metadata about a broker rolegroup @@ -405,6 +408,12 @@ pub struct KafkaConfig { /// Time period Pods have to gracefully shut down, e.g. `30m`, `1h` or `2d`. Consult the operator documentation for details. #[fragment_attrs(serde(default))] pub graceful_shutdown_timeout: Option, + + /// The ListenerClass used for bootstrapping new clients. Should use a stable ListenerClass to avoid unnecessary client restarts (such as `cluster-internal` or `external-stable`). + pub bootstrap_listener_class: String, + + /// The ListenerClass used for connecting to brokers. Should use a direct connection ListenerClass to minimize cost and minimize performance overhead (such as `cluster-internal` or `external-unstable`). + pub broker_listener_class: String, } impl KafkaConfig { @@ -430,6 +439,8 @@ impl KafkaConfig { }, affinity: get_affinity(cluster_name, role), graceful_shutdown_timeout: Some(DEFAULT_BROKER_GRACEFUL_SHUTDOWN_TIMEOUT), + bootstrap_listener_class: Some("cluster-internal".to_string()), + broker_listener_class: Some("cluster-internal".to_string()), } } } diff --git a/rust/crd/src/listener.rs b/rust/crd/src/listener.rs index b7afe04c..18b36c4b 100644 --- a/rust/crd/src/listener.rs +++ b/rust/crd/src/listener.rs @@ -1,4 +1,4 @@ -use crate::{KafkaCluster, STACKABLE_TMP_DIR}; +use crate::{KafkaCluster, STACKABLE_LISTENER_BROKER_DIR}; use crate::security::KafkaTlsSecurity; use snafu::{OptionExt, Snafu}; @@ -8,7 +8,6 @@ use std::fmt::{Display, Formatter}; use strum::{EnumDiscriminants, EnumString}; const LISTENER_LOCAL_ADDRESS: &str = "0.0.0.0"; -const LISTENER_NODE_ADDRESS: &str = "$NODE"; #[derive(Snafu, Debug, EnumDiscriminants)] pub enum KafkaListenerError { @@ -106,8 +105,11 @@ pub fn get_kafka_listener_config( }); advertised_listeners.push(KafkaListener { name: KafkaListenerName::ClientAuth, - host: LISTENER_NODE_ADDRESS.to_string(), - port: node_port_cmd(STACKABLE_TMP_DIR, kafka_security.client_port_name()), + host: node_address_cmd(STACKABLE_LISTENER_BROKER_DIR), + port: node_port_cmd( + STACKABLE_LISTENER_BROKER_DIR, + kafka_security.client_port_name(), + ), }); listener_security_protocol_map .insert(KafkaListenerName::ClientAuth, KafkaListenerProtocol::Ssl); @@ -120,8 +122,11 @@ pub fn get_kafka_listener_config( }); advertised_listeners.push(KafkaListener { name: KafkaListenerName::Client, - host: LISTENER_NODE_ADDRESS.to_string(), - port: node_port_cmd(STACKABLE_TMP_DIR, kafka_security.client_port_name()), + host: node_address_cmd(STACKABLE_LISTENER_BROKER_DIR), + port: node_port_cmd( + STACKABLE_LISTENER_BROKER_DIR, + kafka_security.client_port_name(), + ), }); listener_security_protocol_map .insert(KafkaListenerName::Client, KafkaListenerProtocol::Ssl); @@ -134,8 +139,11 @@ pub fn get_kafka_listener_config( }); advertised_listeners.push(KafkaListener { name: KafkaListenerName::Client, - host: LISTENER_NODE_ADDRESS.to_string(), - port: node_port_cmd(STACKABLE_TMP_DIR, kafka_security.client_port_name()), + host: node_address_cmd(STACKABLE_LISTENER_BROKER_DIR), + port: node_port_cmd( + STACKABLE_LISTENER_BROKER_DIR, + kafka_security.client_port_name(), + ), }); listener_security_protocol_map .insert(KafkaListenerName::Client, KafkaListenerProtocol::Plaintext); @@ -180,8 +188,12 @@ pub fn get_kafka_listener_config( }) } +fn node_address_cmd(directory: &str) -> String { + format!("$(cat {directory}/default-address/address)") +} + fn node_port_cmd(directory: &str, port_name: &str) -> String { - format!("$(cat {directory}/{port_name}_nodeport)") + format!("$(cat {directory}/default-address/ports/{port_name})") } fn pod_fqdn(kafka: &KafkaCluster, object_name: &str) -> Result { @@ -228,7 +240,6 @@ mod tests { "#; let kafka: KafkaCluster = serde_yaml::from_str(kafka_cluster).expect("illegal test input"); let kafka_security = KafkaTlsSecurity::new( - &kafka, ResolvedAuthenticationClasses::new(vec![AuthenticationClass { metadata: ObjectMetaBuilder::new().name("auth-class").build(), spec: AuthenticationClassSpec { @@ -260,8 +271,11 @@ mod tests { format!( "{name}://{host}:{port},{internal_name}://{internal_host}:{internal_port}", name = KafkaListenerName::ClientAuth, - host = LISTENER_NODE_ADDRESS, - port = node_port_cmd(STACKABLE_TMP_DIR, kafka_security.client_port_name()), + host = node_address_cmd(STACKABLE_LISTENER_BROKER_DIR), + port = node_port_cmd( + STACKABLE_LISTENER_BROKER_DIR, + kafka_security.client_port_name() + ), internal_name = KafkaListenerName::Internal, internal_host = pod_fqdn(&kafka, object_name).unwrap(), internal_port = kafka_security.internal_port(), @@ -295,7 +309,6 @@ mod tests { "#; let kafka: KafkaCluster = serde_yaml::from_str(input).expect("illegal test input"); let kafka_security = KafkaTlsSecurity::new( - &kafka, ResolvedAuthenticationClasses::new(vec![]), "tls".to_string(), Some("tls".to_string()), @@ -320,8 +333,11 @@ mod tests { format!( "{name}://{host}:{port},{internal_name}://{internal_host}:{internal_port}", name = KafkaListenerName::Client, - host = LISTENER_NODE_ADDRESS, - port = node_port_cmd(STACKABLE_TMP_DIR, kafka_security.client_port_name()), + host = node_address_cmd(STACKABLE_LISTENER_BROKER_DIR), + port = node_port_cmd( + STACKABLE_LISTENER_BROKER_DIR, + kafka_security.client_port_name() + ), internal_name = KafkaListenerName::Internal, internal_host = pod_fqdn(&kafka, object_name).unwrap(), internal_port = kafka_security.internal_port(), @@ -357,7 +373,6 @@ mod tests { "#; let kafka: KafkaCluster = serde_yaml::from_str(input).expect("illegal test input"); let kafka_security = KafkaTlsSecurity::new( - &kafka, ResolvedAuthenticationClasses::new(vec![]), "".to_string(), None, @@ -382,8 +397,11 @@ mod tests { format!( "{name}://{host}:{port},{internal_name}://{internal_host}:{internal_port}", name = KafkaListenerName::Client, - host = LISTENER_NODE_ADDRESS, - port = node_port_cmd(STACKABLE_TMP_DIR, kafka_security.client_port_name()), + host = node_address_cmd(STACKABLE_LISTENER_BROKER_DIR), + port = node_port_cmd( + STACKABLE_LISTENER_BROKER_DIR, + kafka_security.client_port_name() + ), internal_name = KafkaListenerName::Internal, internal_host = pod_fqdn(&kafka, object_name).unwrap(), internal_port = kafka_security.internal_port(), diff --git a/rust/crd/src/security.rs b/rust/crd/src/security.rs index 90367aca..48a8d2de 100644 --- a/rust/crd/src/security.rs +++ b/rust/crd/src/security.rs @@ -26,12 +26,13 @@ use stackable_operator::{ utils::COMMON_BASH_TRAP_FUNCTIONS, }; -use crate::STACKABLE_LOG_DIR; use crate::{ authentication::{self, ResolvedAuthenticationClasses}, listener::{self, KafkaListenerConfig}, - tls, KafkaCluster, SERVER_PROPERTIES_FILE, STACKABLE_CONFIG_DIR, STACKABLE_TMP_DIR, + tls, KafkaCluster, LISTENER_BOOTSTRAP_VOLUME_NAME, SERVER_PROPERTIES_FILE, + STACKABLE_CONFIG_DIR, }; +use crate::{LISTENER_BROKER_VOLUME_NAME, STACKABLE_LOG_DIR}; #[derive(Snafu, Debug)] pub enum Error { @@ -53,14 +54,13 @@ pub enum Error { } /// Helper struct combining TLS settings for server and internal with the resolved AuthenticationClasses -pub struct KafkaTlsSecurity<'a> { - kafka: &'a KafkaCluster, +pub struct KafkaTlsSecurity { resolved_authentication_classes: ResolvedAuthenticationClasses, internal_secret_class: String, server_secret_class: Option, } -impl<'a> KafkaTlsSecurity<'a> { +impl KafkaTlsSecurity { // ports pub const CLIENT_PORT_NAME: &'static str = "kafka"; pub const CLIENT_PORT: u16 = 9092; @@ -107,24 +107,20 @@ impl<'a> KafkaTlsSecurity<'a> { const INTER_SSL_TRUSTSTORE_TYPE: &'static str = "listener.name.internal.ssl.truststore.type"; const INTER_SSL_CLIENT_AUTH: &'static str = "listener.name.internal.ssl.client.auth"; // directories - // for kcat container - const STACKABLE_TLS_CERT_SERVER_DIR: &'static str = "/stackable/tls_cert_server_mount"; - const STACKABLE_TLS_CERT_SERVER_DIR_NAME: &'static str = "tls-cert-server-mount"; - // kafka container - const STACKABLE_TLS_KEYSTORE_SERVER_DIR: &'static str = "/stackable/tls_keystore_server"; - const STACKABLE_TLS_KEYSTORE_SERVER_DIR_NAME: &'static str = "tls-keystore-server"; - const STACKABLE_TLS_KEYSTORE_INTERNAL_DIR: &'static str = "/stackable/tls_keystore_internal"; - const STACKABLE_TLS_KEYSTORE_INTERNAL_DIR_NAME: &'static str = "tls-keystore-internal"; + const STACKABLE_TLS_KCAT_DIR: &'static str = "/stackable/tls-kcat"; + const STACKABLE_TLS_KCAT_VOLUME_NAME: &'static str = "tls-kcat"; + const STACKABLE_TLS_KAFKA_SERVER_DIR: &'static str = "/stackable/tls-kafka-server"; + const STACKABLE_TLS_KAFKA_SERVER_VOLUME_NAME: &'static str = "tls-kafka-server"; + const STACKABLE_TLS_KAFKA_INTERNAL_DIR: &'static str = "/stackable/tls-kafka-internal"; + const STACKABLE_TLS_KAFKA_INTERNAL_VOLUME_NAME: &'static str = "tls-kafka-internal"; #[cfg(test)] pub fn new( - kafka: &'a KafkaCluster, resolved_authentication_classes: ResolvedAuthenticationClasses, internal_secret_class: String, server_secret_class: Option, ) -> Self { Self { - kafka, resolved_authentication_classes, internal_secret_class, server_secret_class, @@ -135,10 +131,9 @@ impl<'a> KafkaTlsSecurity<'a> { /// all provided `AuthenticationClass` references. pub async fn new_from_kafka_cluster( client: &Client, - kafka: &'a KafkaCluster, + kafka: &KafkaCluster, ) -> Result { Ok(KafkaTlsSecurity { - kafka, resolved_authentication_classes: ResolvedAuthenticationClasses::from_references( client, &kafka.spec.cluster_config.authentication, @@ -219,13 +214,6 @@ impl<'a> KafkaTlsSecurity<'a> { } } - /// Returns SVC container command to retrieve the node port service port. - pub fn svc_container_commands(&self) -> String { - let port_name = self.client_port_name(); - // Extract the nodeport from the nodeport service - format!("kubectl get service \"$POD_NAME\" -o jsonpath='{{.spec.ports[?(@.name==\"{port_name}\")].nodePort}}' | tee {STACKABLE_TMP_DIR}/{port_name}_nodeport") - } - /// Returns the commands for the kcat readiness probe. pub fn kcat_prober_container_commands(&self) -> Vec { let mut args = vec!["/stackable/kcat".to_string()]; @@ -234,13 +222,11 @@ impl<'a> KafkaTlsSecurity<'a> { if self.tls_client_authentication_class().is_some() { args.push("-b".to_string()); args.push(format!("localhost:{}", port)); - args.extend(Self::kcat_client_auth_ssl( - Self::STACKABLE_TLS_CERT_SERVER_DIR, - )); + args.extend(Self::kcat_client_auth_ssl(Self::STACKABLE_TLS_KCAT_DIR)); } else if self.tls_server_secret_class().is_some() { args.push("-b".to_string()); args.push(format!("localhost:{}", port)); - args.extend(Self::kcat_client_ssl(Self::STACKABLE_TLS_CERT_SERVER_DIR)); + args.extend(Self::kcat_client_ssl(Self::STACKABLE_TLS_KCAT_DIR)); } else { args.push("-b".to_string()); args.push(format!("localhost:{}", port)); @@ -290,30 +276,28 @@ impl<'a> KafkaTlsSecurity<'a> { if let Some(tls_server_secret_class) = self.get_tls_secret_class() { // We have to mount tls pem files for kcat (the mount can be used directly) pod_builder - .add_volume(Self::create_tls_volume( - &self.kafka.bootstrap_service_name(), - Self::STACKABLE_TLS_CERT_SERVER_DIR_NAME, + .add_volume(Self::create_kcat_tls_volume( + Self::STACKABLE_TLS_KCAT_VOLUME_NAME, tls_server_secret_class, )?) .context(AddVolumeSnafu)?; cb_kcat_prober .add_volume_mount( - Self::STACKABLE_TLS_CERT_SERVER_DIR_NAME, - Self::STACKABLE_TLS_CERT_SERVER_DIR, + Self::STACKABLE_TLS_KCAT_VOLUME_NAME, + Self::STACKABLE_TLS_KCAT_DIR, ) .context(AddVolumeMountSnafu)?; // Keystores fore the kafka container pod_builder .add_volume(Self::create_tls_keystore_volume( - &self.kafka.bootstrap_service_name(), - Self::STACKABLE_TLS_KEYSTORE_SERVER_DIR_NAME, + Self::STACKABLE_TLS_KAFKA_SERVER_VOLUME_NAME, tls_server_secret_class, )?) .context(AddVolumeSnafu)?; cb_kafka .add_volume_mount( - Self::STACKABLE_TLS_KEYSTORE_SERVER_DIR_NAME, - Self::STACKABLE_TLS_KEYSTORE_SERVER_DIR, + Self::STACKABLE_TLS_KAFKA_SERVER_VOLUME_NAME, + Self::STACKABLE_TLS_KAFKA_SERVER_DIR, ) .context(AddVolumeMountSnafu)?; } @@ -321,15 +305,14 @@ impl<'a> KafkaTlsSecurity<'a> { if let Some(tls_internal_secret_class) = self.tls_internal_secret_class() { pod_builder .add_volume(Self::create_tls_keystore_volume( - &self.kafka.bootstrap_service_name(), - Self::STACKABLE_TLS_KEYSTORE_INTERNAL_DIR_NAME, + Self::STACKABLE_TLS_KAFKA_INTERNAL_VOLUME_NAME, tls_internal_secret_class, )?) .context(AddVolumeSnafu)?; cb_kafka .add_volume_mount( - Self::STACKABLE_TLS_KEYSTORE_INTERNAL_DIR_NAME, - Self::STACKABLE_TLS_KEYSTORE_INTERNAL_DIR, + Self::STACKABLE_TLS_KAFKA_INTERNAL_VOLUME_NAME, + Self::STACKABLE_TLS_KAFKA_INTERNAL_DIR, ) .context(AddVolumeMountSnafu)?; } @@ -348,7 +331,7 @@ impl<'a> KafkaTlsSecurity<'a> { if self.tls_client_authentication_class().is_some() { config.insert( Self::CLIENT_AUTH_SSL_KEYSTORE_LOCATION.to_string(), - format!("{}/keystore.p12", Self::STACKABLE_TLS_KEYSTORE_SERVER_DIR), + format!("{}/keystore.p12", Self::STACKABLE_TLS_KAFKA_SERVER_DIR), ); config.insert( Self::CLIENT_AUTH_SSL_KEYSTORE_PASSWORD.to_string(), @@ -360,7 +343,7 @@ impl<'a> KafkaTlsSecurity<'a> { ); config.insert( Self::CLIENT_AUTH_SSL_TRUSTSTORE_LOCATION.to_string(), - format!("{}/truststore.p12", Self::STACKABLE_TLS_KEYSTORE_SERVER_DIR), + format!("{}/truststore.p12", Self::STACKABLE_TLS_KAFKA_SERVER_DIR), ); config.insert( Self::CLIENT_AUTH_SSL_TRUSTSTORE_PASSWORD.to_string(), @@ -378,7 +361,7 @@ impl<'a> KafkaTlsSecurity<'a> { } else if self.tls_server_secret_class().is_some() { config.insert( Self::CLIENT_SSL_KEYSTORE_LOCATION.to_string(), - format!("{}/keystore.p12", Self::STACKABLE_TLS_KEYSTORE_SERVER_DIR), + format!("{}/keystore.p12", Self::STACKABLE_TLS_KAFKA_SERVER_DIR), ); config.insert( Self::CLIENT_SSL_KEYSTORE_PASSWORD.to_string(), @@ -390,7 +373,7 @@ impl<'a> KafkaTlsSecurity<'a> { ); config.insert( Self::CLIENT_SSL_TRUSTSTORE_LOCATION.to_string(), - format!("{}/truststore.p12", Self::STACKABLE_TLS_KEYSTORE_SERVER_DIR), + format!("{}/truststore.p12", Self::STACKABLE_TLS_KAFKA_SERVER_DIR), ); config.insert( Self::CLIENT_SSL_TRUSTSTORE_PASSWORD.to_string(), @@ -406,7 +389,7 @@ impl<'a> KafkaTlsSecurity<'a> { if self.tls_internal_secret_class().is_some() { config.insert( Self::INTER_SSL_KEYSTORE_LOCATION.to_string(), - format!("{}/keystore.p12", Self::STACKABLE_TLS_KEYSTORE_INTERNAL_DIR), + format!("{}/keystore.p12", Self::STACKABLE_TLS_KAFKA_INTERNAL_DIR), ); config.insert( Self::INTER_SSL_KEYSTORE_PASSWORD.to_string(), @@ -418,10 +401,7 @@ impl<'a> KafkaTlsSecurity<'a> { ); config.insert( Self::INTER_SSL_TRUSTSTORE_LOCATION.to_string(), - format!( - "{}/truststore.p12", - Self::STACKABLE_TLS_KEYSTORE_INTERNAL_DIR - ), + format!("{}/truststore.p12", Self::STACKABLE_TLS_KAFKA_INTERNAL_DIR), ); config.insert( Self::INTER_SSL_TRUSTSTORE_PASSWORD.to_string(), @@ -457,18 +437,13 @@ impl<'a> KafkaTlsSecurity<'a> { .or(self.server_secret_class.as_ref()) } - /// Creates ephemeral volumes to mount the `SecretClass` into the Pods - fn create_tls_volume( - kafka_bootstrap_service_name: &str, - volume_name: &str, - secret_class_name: &str, - ) -> Result { + /// Creates ephemeral volumes to mount the `SecretClass` into the Pods for kcat client + fn create_kcat_tls_volume(volume_name: &str, secret_class_name: &str) -> Result { Ok(VolumeBuilder::new(volume_name) .ephemeral( SecretOperatorVolumeSourceBuilder::new(secret_class_name) .with_pod_scope() - .with_node_scope() - .with_service_scope(kafka_bootstrap_service_name) + .with_format(SecretFormat::TlsPem) .build() .context(SecretVolumeBuildSnafu)?, ) @@ -477,7 +452,6 @@ impl<'a> KafkaTlsSecurity<'a> { /// Creates ephemeral volumes to mount the `SecretClass` into the Pods as keystores fn create_tls_keystore_volume( - kafka_bootstrap_service_name: &str, volume_name: &str, secret_class_name: &str, ) -> Result { @@ -485,8 +459,8 @@ impl<'a> KafkaTlsSecurity<'a> { .ephemeral( SecretOperatorVolumeSourceBuilder::new(secret_class_name) .with_pod_scope() - .with_node_scope() - .with_service_scope(kafka_bootstrap_service_name) + .with_listener_volume_scope(LISTENER_BROKER_VOLUME_NAME) + .with_listener_volume_scope(LISTENER_BOOTSTRAP_VOLUME_NAME) .with_format(SecretFormat::TlsPkcs12) .build() .context(SecretVolumeBuildSnafu)?, diff --git a/rust/operator-binary/src/discovery.rs b/rust/operator-binary/src/discovery.rs index a61b45a3..218de7ba 100644 --- a/rust/operator-binary/src/discovery.rs +++ b/rust/operator-binary/src/discovery.rs @@ -5,11 +5,11 @@ use snafu::{OptionExt, ResultExt, Snafu}; use stackable_kafka_crd::{security::KafkaTlsSecurity, KafkaCluster, KafkaRole}; use stackable_operator::{ builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder}, - commons::product_image_selection::ResolvedProductImage, - k8s_openapi::api::core::v1::{ConfigMap, Endpoints, Service, ServicePort}, + commons::{listener::Listener, product_image_selection::ResolvedProductImage}, + k8s_openapi::api::core::v1::{ConfigMap, Service}, kube::{runtime::reflector::ObjectRef, Resource, ResourceExt}, }; -use std::{collections::BTreeSet, num::TryFromIntError}; +use std::num::TryFromIntError; #[derive(Snafu, Debug)] pub enum Error { @@ -56,9 +56,8 @@ pub async fn build_discovery_configmaps( kafka: &KafkaCluster, owner: &impl Resource, resolved_product_image: &ResolvedProductImage, - client: &stackable_operator::client::Client, - kafka_security: &KafkaTlsSecurity<'_>, - svc: &Service, + kafka_security: &KafkaTlsSecurity, + listeners: &[Listener], ) -> Result, Error> { let name = owner.name_unchecked(); let port_name = kafka_security.client_port_name(); @@ -68,21 +67,24 @@ pub async fn build_discovery_configmaps( owner, resolved_product_image, &name, - service_hosts(svc, port_name)?, + listener_hosts(listeners, port_name)?, )?, + // backwards compat: nodeport service is now the same as the main service, access type + // is determined by the listenerclass. + // do we want to deprecate/remove this? build_discovery_configmap( kafka, owner, resolved_product_image, - &format!("{}-nodeport", name), - nodeport_hosts(client, svc, port_name).await?, + &format!("{name}-nodeport"), + listener_hosts(listeners, port_name)?, )?, ]) } /// Build a discovery [`ConfigMap`] containing information about how to connect to a certain [`KafkaCluster`] /// -/// `hosts` will usually come from either [`service_hosts`] or [`nodeport_hosts`]. +/// `hosts` will usually come from [`listener_hosts`]. fn build_discovery_configmap( kafka: &KafkaCluster, owner: &impl Resource, @@ -121,64 +123,29 @@ fn build_discovery_configmap( .context(BuildConfigMapSnafu) } -fn find_named_svc_port<'a>(svc: &'a Service, port_name: &str) -> Option<&'a ServicePort> { - svc.spec - .as_ref()? - .ports - .as_ref()? - .iter() - .find(|port| port.name.as_deref() == Some(port_name)) -} - -/// Lists the [`Service`]'s FQDN (fully qualified domain name) -fn service_hosts( - svc: &Service, +fn listener_hosts( + listeners: &[Listener], port_name: &str, ) -> Result, Error> { - let svc_fqdn = format!( - "{}.{}.svc.cluster.local", - svc.metadata.name.as_deref().context(NoNameSnafu)?, - svc.metadata - .namespace - .as_deref() - .context(NoNamespaceSnafu)? - ); - let svc_port = find_named_svc_port(svc, port_name).context(NoServicePortSnafu { port_name })?; - Ok([( - svc_fqdn, - svc_port.port.try_into().context(InvalidNodePortSnafu)?, - )]) -} - -/// Lists all nodes currently hosting Pods participating in the [`Service`] -async fn nodeport_hosts( - client: &stackable_operator::client::Client, - svc: &Service, - port_name: &str, -) -> Result, Error> { - let svc_port = find_named_svc_port(svc, port_name).context(NoServicePortSnafu { port_name })?; - let node_port = svc_port.node_port.context(NoNodePortSnafu { port_name })?; - let endpoints = client - .get::( - svc.metadata.name.as_deref().context(NoNameSnafu)?, - svc.metadata - .namespace - .as_deref() - .context(NoNamespaceSnafu)?, - ) - .await - .with_context(|_| FindEndpointsSnafu { - svc: ObjectRef::from_obj(svc), - })?; - let nodes = endpoints - .subsets - .into_iter() - .flatten() - .flat_map(|subset| subset.addresses) + listeners + .iter() + .flat_map(|listener| { + listener + .status + .as_ref() + .and_then(|s| s.ingress_addresses.as_deref()) + }) .flatten() - .flat_map(|addr| addr.node_name); - let addrs = nodes - .map(|node| Ok((node, node_port.try_into().context(InvalidNodePortSnafu)?))) - .collect::, _>>()?; - Ok(addrs) + .map(|addr| { + Ok(( + addr.address.clone(), + addr.ports + .get(port_name) + .copied() + .context(NoServicePortSnafu { port_name })? + .try_into() + .context(InvalidNodePortSnafu)?, + )) + }) + .collect::, _>>() } diff --git a/rust/operator-binary/src/kafka_controller.rs b/rust/operator-binary/src/kafka_controller.rs index adc1782f..e34b5b23 100644 --- a/rust/operator-binary/src/kafka_controller.rs +++ b/rust/operator-binary/src/kafka_controller.rs @@ -14,9 +14,11 @@ use snafu::{OptionExt, ResultExt, Snafu}; use stackable_kafka_crd::{ listener::get_kafka_listener_config, security::KafkaTlsSecurity, Container, KafkaCluster, KafkaClusterStatus, KafkaConfig, KafkaRole, APP_NAME, DOCKER_IMAGE_BASE_NAME, - JVM_SECURITY_PROPERTIES_FILE, KAFKA_HEAP_OPTS, LOG_DIRS_VOLUME_NAME, METRICS_PORT, - METRICS_PORT_NAME, OPERATOR_NAME, SERVER_PROPERTIES_FILE, STACKABLE_CONFIG_DIR, - STACKABLE_DATA_DIR, STACKABLE_LOG_CONFIG_DIR, STACKABLE_LOG_DIR, STACKABLE_TMP_DIR, + JVM_SECURITY_PROPERTIES_FILE, KAFKA_HEAP_OPTS, LISTENER_BOOTSTRAP_VOLUME_NAME, + LISTENER_BROKER_VOLUME_NAME, LOG_DIRS_VOLUME_NAME, METRICS_PORT, METRICS_PORT_NAME, + OPERATOR_NAME, SERVER_PROPERTIES_FILE, STACKABLE_CONFIG_DIR, STACKABLE_DATA_DIR, + STACKABLE_LISTENER_BOOTSTRAP_DIR, STACKABLE_LISTENER_BROKER_DIR, STACKABLE_LOG_CONFIG_DIR, + STACKABLE_LOG_DIR, }; use stackable_operator::{ builder::{ @@ -24,22 +26,28 @@ use stackable_operator::{ configmap::ConfigMapBuilder, meta::ObjectMetaBuilder, pod::{ - container::ContainerBuilder, resources::ResourceRequirementsBuilder, - security::PodSecurityContextBuilder, volume::VolumeBuilder, PodBuilder, + container::ContainerBuilder, + resources::ResourceRequirementsBuilder, + security::PodSecurityContextBuilder, + volume::{ListenerOperatorVolumeSourceBuilder, ListenerReference, VolumeBuilder}, + PodBuilder, }, }, cluster_resources::{ClusterResourceApplyStrategy, ClusterResources}, commons::{ - authentication::AuthenticationClass, opa::OpaApiVersion, - product_image_selection::ResolvedProductImage, rbac::build_rbac_resources, + authentication::AuthenticationClass, + listener::{Listener, ListenerPort, ListenerSpec}, + opa::OpaApiVersion, + product_image_selection::ResolvedProductImage, + rbac::build_rbac_resources, }, k8s_openapi::{ api::{ apps::v1::{StatefulSet, StatefulSetSpec}, core::v1::{ - ConfigMap, ConfigMapKeySelector, ConfigMapVolumeSource, ContainerPort, - EmptyDirVolumeSource, EnvVar, EnvVarSource, ExecAction, ObjectFieldSelector, - PodSpec, Probe, Service, ServicePort, ServiceSpec, Volume, + ConfigMap, ConfigMapKeySelector, ConfigMapVolumeSource, ContainerPort, EnvVar, + EnvVarSource, ExecAction, ObjectFieldSelector, PodSpec, Probe, Service, + ServiceSpec, Volume, }, }, apimachinery::pkg::apis::meta::v1::LabelSelector, @@ -77,7 +85,6 @@ use crate::{ graceful_shutdown::{add_graceful_shutdown_config, graceful_shutdown_config_properties}, pdb::add_pdbs, }, - pod_svc_controller, product_logging::{ extend_role_group_config_map, resolve_vector_aggregator_address, LOG4J_CONFIG_FILE, MAX_KAFKA_LOG_FILES_SIZE, @@ -208,6 +215,11 @@ pub enum Error { source: stackable_kafka_crd::listener::KafkaListenerError, }, + #[snafu(display("failed to add listener volume"))] + AddListenerVolume { + source: stackable_operator::builder::pod::Error, + }, + #[snafu(display("invalid container name [{name}]"))] InvalidContainerName { name: String, @@ -358,6 +370,7 @@ impl ReconcilerError for Error { .. } => Some(authentication_class.clone().erase()), Error::InvalidKafkaListeners { .. } => None, + Error::AddListenerVolume { .. } => None, Error::InvalidContainerName { .. } => None, Error::DeleteOrphans { .. } => None, Error::FailedToInitializeSecurityContext { .. } => None, @@ -454,14 +467,6 @@ pub async fn reconcile_kafka(kafka: Arc, ctx: Arc) -> Result< None }; - let broker_role_service = - build_bootstrap_service(&kafka, &resolved_product_image, &kafka_security)?; - - let broker_role_service = cluster_resources - .add(client, broker_role_service) - .await - .context(ApplyRoleServiceSnafu)?; - let vector_aggregator_address = resolve_vector_aggregator_address(&kafka, client) .await .context(ResolveVectorAggregatorAddressSnafu)?; @@ -486,6 +491,8 @@ pub async fn reconcile_kafka(kafka: Arc, ctx: Arc) -> Result< .await .context(ApplyRoleBindingSnafu)?; + let mut bootstrap_listeners = Vec::::new(); + for (rolegroup_name, rolegroup_config) in role_broker_config.iter() { let rolegroup_ref = kafka.broker_rolegroup_ref(rolegroup_name); @@ -493,12 +500,8 @@ pub async fn reconcile_kafka(kafka: Arc, ctx: Arc) -> Result< .merged_config(&KafkaRole::Broker, &rolegroup_ref) .context(FailedToResolveConfigSnafu)?; - let rg_service = build_broker_rolegroup_service( - &kafka, - &resolved_product_image, - &kafka_security, - &rolegroup_ref, - )?; + let rg_service = + build_broker_rolegroup_service(&kafka, &resolved_product_image, &rolegroup_ref)?; let rg_configmap = build_broker_rolegroup_config_map( &kafka, &resolved_product_image, @@ -519,6 +522,20 @@ pub async fn reconcile_kafka(kafka: Arc, ctx: Arc) -> Result< &merged_config, &rbac_sa.name_any(), )?; + let rg_bootstrap_listener = build_broker_rolegroup_bootstrap_listener( + &kafka, + &resolved_product_image, + &kafka_security, + &rolegroup_ref, + &merged_config, + )?; + + bootstrap_listeners.push( + cluster_resources + .add(client, rg_bootstrap_listener) + .await + .context(ApplyRoleServiceSnafu)?, + ); cluster_resources .add(client, rg_service) .await @@ -556,9 +573,8 @@ pub async fn reconcile_kafka(kafka: Arc, ctx: Arc) -> Result< &kafka, &*kafka, &resolved_product_image, - client, &kafka_security, - &broker_role_service, + &bootstrap_listeners, ) .await .context(BuildDiscoveryConfigSnafu)? @@ -592,39 +608,35 @@ pub async fn reconcile_kafka(kafka: Arc, ctx: Arc) -> Result< Ok(Action::await_change()) } -/// Kafka clients will use the load-balanced bootstrap service to get a list of broker addresses and will use those to +/// Kafka clients will use the load-balanced bootstrap listener to get a list of broker addresses and will use those to /// transmit data to the correct broker. -pub fn build_bootstrap_service( +pub fn build_broker_rolegroup_bootstrap_listener( kafka: &KafkaCluster, resolved_product_image: &ResolvedProductImage, kafka_security: &KafkaTlsSecurity, -) -> Result { - let role_name = KafkaRole::Broker.to_string(); - Ok(Service { + rolegroup: &RoleGroupRef, + merged_config: &KafkaConfig, +) -> Result { + Ok(Listener { metadata: ObjectMetaBuilder::new() .name_and_namespace(kafka) - .name(kafka.bootstrap_service_name()) + .name(kafka.bootstrap_service_name(rolegroup)) .ownerreference_from_resource(kafka, None, Some(true)) .context(ObjectMissingMetadataForOwnerRefSnafu)? .with_recommended_labels(build_recommended_labels( kafka, KAFKA_CONTROLLER_NAME, &resolved_product_image.app_version_label, - &role_name, - "global", + &rolegroup.role, + &rolegroup.role_group, )) .context(MetadataBuildSnafu)? .build(), - spec: Some(ServiceSpec { - ports: Some(service_ports(kafka_security)), - selector: Some( - Labels::role_selector(kafka, APP_NAME, &role_name) - .context(LabelBuildSnafu)? - .into(), - ), - type_: Some("NodePort".to_string()), - ..ServiceSpec::default() - }), + spec: ListenerSpec { + class_name: Some(merged_config.bootstrap_listener_class.clone()), + ports: Some(listener_ports(kafka_security)), + ..ListenerSpec::default() + }, status: None, }) } @@ -675,7 +687,7 @@ fn build_broker_rolegroup_config_map( KAFKA_CONTROLLER_NAME, &resolved_product_image.app_version_label, &rolegroup.role, - "global", + &rolegroup.role_group, )) .context(MetadataBuildSnafu)? .build(), @@ -720,7 +732,6 @@ fn build_broker_rolegroup_config_map( fn build_broker_rolegroup_service( kafka: &KafkaCluster, resolved_product_image: &ResolvedProductImage, - kafka_security: &KafkaTlsSecurity, rolegroup: &RoleGroupRef, ) -> Result { Ok(Service { @@ -741,7 +752,6 @@ fn build_broker_rolegroup_service( .build(), spec: Some(ServiceSpec { cluster_ip: Some("None".to_string()), - ports: Some(service_ports(kafka_security)), selector: Some( Labels::role_group_selector( kafka, @@ -778,12 +788,25 @@ fn build_broker_rolegroup_statefulset( let rolegroup = kafka .rolegroup(rolegroup_ref) .context(InternalOperatorSnafu)?; - - let get_svc_container_name = Container::GetService.to_string(); - let mut cb_get_svc = - ContainerBuilder::new(&get_svc_container_name).context(InvalidContainerNameSnafu { - name: get_svc_container_name.clone(), - })?; + let recommended_object_labels = build_recommended_labels( + kafka, + KAFKA_CONTROLLER_NAME, + &resolved_product_image.app_version_label, + &rolegroup_ref.role, + &rolegroup_ref.role_group, + ); + let recommended_labels = + Labels::recommended(recommended_object_labels.clone()).context(LabelBuildSnafu)?; + // Used for PVC templates that cannot be modified once they are deployed + let unversioned_recommended_labels = Labels::recommended(build_recommended_labels( + kafka, + KAFKA_CONTROLLER_NAME, + // A version value is required, and we do want to use the "recommended" format for the other desired labels + "none", + &rolegroup_ref.role, + &rolegroup_ref.role_group, + )) + .context(LabelBuildSnafu)?; let kcat_prober_container_name = Container::KcatProber.to_string(); let mut cb_kcat_prober = @@ -804,32 +827,18 @@ fn build_broker_rolegroup_statefulset( .add_volume_and_volume_mounts(&mut pod_builder, &mut cb_kcat_prober, &mut cb_kafka) .context(AddVolumesAndVolumeMountsSnafu)?; - cb_get_svc - .image_from_product_image(resolved_product_image) - .command(vec![ - "/bin/bash".to_string(), - "-x".to_string(), - "-euo".to_string(), - "pipefail".to_string(), - "-c".to_string(), - ]) - .args(vec![kafka_security.svc_container_commands()]) - .add_env_vars(vec![EnvVar { - name: "POD_NAME".to_string(), - value_from: Some(EnvVarSource { - field_ref: Some(ObjectFieldSelector { - api_version: Some("v1".to_string()), - field_path: "metadata.name".to_string(), - }), - ..EnvVarSource::default() - }), - ..EnvVar::default() - }]) - .add_volume_mount("tmp", STACKABLE_TMP_DIR) - .context(AddVolumeMountSnafu)? - .resources(merged_config.resources.clone().into()); + let mut pvcs = merged_config.resources.storage.build_pvcs(); - let pvcs = merged_config.resources.storage.build_pvcs(); + // bootstrap listener should be persistent, + // main broker listener is an ephemeral PVC instead + pvcs.push( + ListenerOperatorVolumeSourceBuilder::new( + &ListenerReference::ListenerName(kafka.bootstrap_service_name(rolegroup_ref)), + &unversioned_recommended_labels, + ) + .and_then(|builder| builder.build_pvc(LISTENER_BOOTSTRAP_VOLUME_NAME)) + .unwrap(), + ); let mut env = broker_config .get(&PropertyNameKind::Env) @@ -873,17 +882,6 @@ fn build_broker_rolegroup_statefulset( ..EnvVar::default() }); - env.push(EnvVar { - name: "NODE".to_string(), - value_from: Some(EnvVarSource { - field_ref: Some(ObjectFieldSelector { - api_version: Some("v1".to_string()), - field_path: "status.hostIP".to_string(), - }), - ..EnvVarSource::default() - }), - ..EnvVar::default() - }); env.push(EnvVar { name: "POD_NAME".to_string(), value_from: Some(EnvVarSource { @@ -926,7 +924,12 @@ fn build_broker_rolegroup_statefulset( .context(AddVolumeMountSnafu)? .add_volume_mount("config", STACKABLE_CONFIG_DIR) .context(AddVolumeMountSnafu)? - .add_volume_mount("tmp", STACKABLE_TMP_DIR) + .add_volume_mount( + LISTENER_BOOTSTRAP_VOLUME_NAME, + STACKABLE_LISTENER_BOOTSTRAP_DIR, + ) + .context(AddVolumeMountSnafu)? + .add_volume_mount(LISTENER_BROKER_VOLUME_NAME, STACKABLE_LISTENER_BROKER_DIR) .context(AddVolumeMountSnafu)? .add_volume_mount("log-config", STACKABLE_LOG_CONFIG_DIR) .context(AddVolumeMountSnafu)? @@ -984,23 +987,13 @@ fn build_broker_rolegroup_statefulset( } let metadata = ObjectMetaBuilder::new() - .with_recommended_labels(build_recommended_labels( - kafka, - KAFKA_CONTROLLER_NAME, - &resolved_product_image.app_version_label, - &rolegroup_ref.role, - &rolegroup_ref.role_group, - )) + .with_recommended_labels(recommended_object_labels) .context(MetadataBuildSnafu)? - .with_label( - Label::try_from((pod_svc_controller::LABEL_ENABLE, "true")).context(LabelBuildSnafu)?, - ) .build(); pod_builder .metadata(metadata) .image_pull_secrets_from_product_image(resolved_product_image) - .add_init_container(cb_get_svc.build()) .add_container(cb_kafka.build()) .add_container(cb_kcat_prober.build()) .affinity(&merged_config.affinity) @@ -1013,12 +1006,13 @@ fn build_broker_rolegroup_statefulset( ..Volume::default() }) .context(AddVolumeSnafu)? - .add_volume(Volume { - name: "tmp".to_string(), - empty_dir: Some(EmptyDirVolumeSource::default()), - ..Volume::default() - }) - .context(AddVolumeSnafu)? + // bootstrap volume is a persistent volume template instead, to keep addresses persistent + .add_listener_volume_by_listener_class( + LISTENER_BROKER_VOLUME_NAME, + &merged_config.broker_listener_class, + &recommended_labels, + ) + .context(AddListenerVolumeSnafu)? .add_empty_dir_volume( "log", Some(product_logging::framework::calculate_log_volume_size_limit( @@ -1110,19 +1104,17 @@ pub fn error_policy(_obj: Arc, _error: &Error, _ctx: Arc) -> } /// We only expose client HTTP / HTTPS and Metrics ports. -fn service_ports(kafka_security: &KafkaTlsSecurity) -> Vec { +fn listener_ports(kafka_security: &KafkaTlsSecurity) -> Vec { vec![ - ServicePort { - name: Some(METRICS_PORT_NAME.to_string()), + ListenerPort { + name: METRICS_PORT_NAME.to_string(), port: METRICS_PORT.into(), protocol: Some("TCP".to_string()), - ..ServicePort::default() }, - ServicePort { - name: Some(kafka_security.client_port_name().to_string()), + ListenerPort { + name: kafka_security.client_port_name().to_string(), port: kafka_security.client_port().into(), protocol: Some("TCP".to_string()), - ..ServicePort::default() }, ] } diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index a846ff0e..2865c626 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -7,9 +7,10 @@ use stackable_kafka_crd::{KafkaCluster, APP_NAME, OPERATOR_NAME}; use stackable_operator::{ cli::{Command, ProductOperatorRun}, client::{self, Client}, + commons::listener::Listener, k8s_openapi::api::{ apps::v1::StatefulSet, - core::v1::{ConfigMap, Pod, Service, ServiceAccount}, + core::v1::{ConfigMap, Service, ServiceAccount}, rbac::v1::RoleBinding, }, kube::runtime::{watcher, Controller}, @@ -18,14 +19,11 @@ use stackable_operator::{ CustomResourceExt, }; -use crate::{ - kafka_controller::KAFKA_CONTROLLER_NAME, pod_svc_controller::POD_SERVICE_CONTROLLER_NAME, -}; +use crate::kafka_controller::KAFKA_CONTROLLER_NAME; mod discovery; mod kafka_controller; mod operations; -mod pod_svc_controller; mod product_logging; mod utils; @@ -109,6 +107,10 @@ pub async fn create_controller( namespace.get_api::(&client), watcher::Config::default(), ) + .owns( + namespace.get_api::(&client), + watcher::Config::default(), + ) .owns( namespace.get_api::(&client), watcher::Config::default(), @@ -138,31 +140,5 @@ pub async fn create_controller( ); }); - let pod_svc_controller = Controller::new( - namespace.get_api::(&client), - watcher::Config::default().labels(&format!("{}=true", pod_svc_controller::LABEL_ENABLE)), - ) - .owns( - namespace.get_api::(&client), - watcher::Config::default(), - ) - .shutdown_on_signal() - .run( - pod_svc_controller::reconcile_pod, - pod_svc_controller::error_policy, - Arc::new(pod_svc_controller::Ctx { - client: client.clone(), - }), - ) - .map(|res| { - report_controller_reconciled( - &client, - &format!("{POD_SERVICE_CONTROLLER_NAME}.{OPERATOR_NAME}"), - &res, - ); - }); - - futures::stream::select(kafka_controller, pod_svc_controller) - .collect::<()>() - .await; + kafka_controller.collect::<()>().await; } diff --git a/rust/operator-binary/src/pod_svc_controller.rs b/rust/operator-binary/src/pod_svc_controller.rs deleted file mode 100644 index 0bd09b42..00000000 --- a/rust/operator-binary/src/pod_svc_controller.rs +++ /dev/null @@ -1,101 +0,0 @@ -use snafu::{OptionExt, ResultExt, Snafu}; -use stackable_kafka_crd::APP_NAME; -use stackable_operator::{ - k8s_openapi::{ - api::core::v1::{Container, Pod, Service, ServicePort, ServiceSpec}, - apimachinery::pkg::apis::meta::v1::OwnerReference, - }, - kube::{core::ObjectMeta, runtime::controller::Action}, - logging::controller::ReconcilerError, - time::Duration, -}; -use std::sync::Arc; -use strum::{EnumDiscriminants, IntoStaticStr}; - -pub const POD_SERVICE_CONTROLLER_NAME: &str = "pod-service"; -pub const LABEL_ENABLE: &str = "kafka.stackable.tech/pod-service"; - -const LABEL_STS_POD_NAME: &str = "statefulset.kubernetes.io/pod-name"; - -pub struct Ctx { - pub client: stackable_operator::client::Client, -} - -#[derive(Snafu, Debug, EnumDiscriminants)] -#[strum_discriminants(derive(IntoStaticStr))] -#[allow(clippy::enum_variant_names)] -pub enum Error { - #[snafu(display("object has no name"))] - ObjectHasNoName, - #[snafu(display("object has no UID"))] - ObjectHasNoUid, - #[snafu(display("failed to apply Service for Pod"))] - ApplyServiceFailed { - source: stackable_operator::client::Error, - }, -} -type Result = std::result::Result; - -impl ReconcilerError for Error { - fn category(&self) -> &'static str { - ErrorDiscriminants::from(self).into() - } -} - -pub async fn reconcile_pod(pod: Arc, ctx: Arc) -> Result { - tracing::info!("Starting reconcile"); - let name = pod.metadata.name.clone().context(ObjectHasNoNameSnafu)?; - let mut ports: Vec = vec![]; - - if let Some(spec) = &pod.spec { - for container in &spec - .containers - .iter() - .filter(|container| container.name == APP_NAME) - .collect::>() - { - if let Some(container_ports) = &container.ports { - for port in container_ports { - ports.push(ServicePort { - name: port.name.clone(), - port: port.container_port, - ..ServicePort::default() - }); - } - } - } - } - - let svc = Service { - metadata: ObjectMeta { - namespace: pod.metadata.namespace.clone(), - name: pod.metadata.name.clone(), - owner_references: Some(vec![OwnerReference { - api_version: "v1".to_string(), - kind: "Pod".to_string(), - name: name.clone(), - uid: pod.metadata.uid.clone().context(ObjectHasNoUidSnafu)?, - ..OwnerReference::default() - }]), - ..ObjectMeta::default() - }, - spec: Some(ServiceSpec { - type_: Some("NodePort".to_string()), - external_traffic_policy: Some("Local".to_string()), - ports: Some(ports), - selector: Some([(LABEL_STS_POD_NAME.to_string(), name)].into()), - publish_not_ready_addresses: Some(true), - ..ServiceSpec::default() - }), - ..Service::default() - }; - ctx.client - .apply_patch(POD_SERVICE_CONTROLLER_NAME, &svc, &svc) - .await - .context(ApplyServiceFailedSnafu)?; - Ok(Action::await_change()) -} - -pub fn error_policy(_obj: Arc, _error: &Error, _ctx: Arc) -> Action { - Action::requeue(*Duration::from_secs(5)) -} diff --git a/tests/templates/kuttl/configuration/20-assert.yaml.j2 b/tests/templates/kuttl/configuration/20-assert.yaml.j2 index e44076dc..f3f09708 100644 --- a/tests/templates/kuttl/configuration/20-assert.yaml.j2 +++ b/tests/templates/kuttl/configuration/20-assert.yaml.j2 @@ -36,3 +36,5 @@ spec: # value set in the role configuration and overridden in # the rolegroup configuration storage: 1Gi + - metadata: + name: listener-bootstrap