From c53b6a278d8c1be8b0c6ac900e1b6b8c135a1c8b Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 16:52:23 +0200 Subject: [PATCH 01/16] chore: Switch stackable-operator to smooth-operator branch Point stackable-operator at the smooth-operator branch (via [patch]) to gain access to the v2:: framework modules, in preparation for removing the product-config dependency. Bump dependencies (cargo update) to satisfy the branch's snafu >=0.9.1 requirement. Co-Authored-By: Claude Opus 4.8 (1M context) --- Cargo.lock | 675 +++++++++++++++++++++++++---------------------------- Cargo.toml | 8 +- 2 files changed, 324 insertions(+), 359 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 840109bc..a018a77d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -47,9 +47,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -62,15 +62,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -103,9 +103,9 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arc-swap" -version = "1.8.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" dependencies = [ "rustversion", ] @@ -163,15 +163,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "axum" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" dependencies = [ "axum-core", "bytes", @@ -265,9 +265,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a" [[package]] name = "block-buffer" @@ -280,9 +280,9 @@ dependencies = [ [[package]] name = "built" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" dependencies = [ "chrono", "git2", @@ -290,9 +290,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byteorder" @@ -308,9 +308,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.56" +version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ "find-msvc-tools", "jobserver", @@ -326,9 +326,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "num-traits", @@ -337,9 +337,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -347,9 +347,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -359,9 +359,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -371,15 +371,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "concurrent-queue" @@ -398,11 +398,12 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -618,9 +619,9 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", @@ -681,9 +682,9 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "elliptic-curve" @@ -793,9 +794,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "ff" @@ -982,15 +983,14 @@ dependencies = [ [[package]] name = "git2" -version = "0.20.4" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" +checksum = "ddddbf932745a6be37109b6112d3ee09696106f848449069d3a57bba937ab82e" dependencies = [ "bitflags", "libc", "libgit2-sys", "log", - "url", ] [[package]] @@ -1018,9 +1018,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" dependencies = [ "atomic-waker", "bytes", @@ -1046,6 +1046,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "heck" version = "0.5.0" @@ -1074,9 +1080,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" dependencies = [ "bytes", "itoa", @@ -1125,9 +1131,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "1.8.1" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", @@ -1140,7 +1146,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1148,9 +1153,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", @@ -1158,7 +1163,6 @@ dependencies = [ "log", "rustls", "rustls-native-certs", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -1226,12 +1230,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1239,9 +1244,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1252,9 +1257,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1266,15 +1271,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1286,15 +1291,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1324,9 +1329,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1334,12 +1339,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.17.1", ] [[package]] @@ -1357,16 +1362,6 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "iri-string" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -1384,9 +1379,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "java-properties" @@ -1401,9 +1396,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.22" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819b44bc7c87d9117eb522f14d46e918add69ff12713c475946b0a29363ed1c2" +checksum = "4603d3033e49e2b0e31229fcab20a5d40089c607d975cd9c80551dc69eed9102" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -1411,14 +1406,14 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde_core", - "windows-sys 0.61.2", + "windows-link", ] [[package]] name = "jiff-static" -version = "0.2.22" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "470252db18ecc35fd766c0891b1e3ec6cbbcd62507e85276c01bf75d8e94d4a1" +checksum = "782d32378dddf207193ac91cefb848ad41abb58195c95168e1291227a0832b47" dependencies = [ "proc-macro2", "quote", @@ -1427,9 +1422,9 @@ dependencies = [ [[package]] name = "jiff-tzdb" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" +checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076" [[package]] name = "jiff-tzdb-platform" @@ -1452,24 +1447,27 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] [[package]] name = "json-patch" -version = "4.1.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f300e415e2134745ef75f04562dd0145405c2f7fd92065db029ac4b16b57fe90" +checksum = "7421438de105a0827e44fadd05377727847d717c80ce29a229f85fd04c427b72" dependencies = [ "jsonptr", + "schemars", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] @@ -1497,9 +1495,9 @@ dependencies = [ [[package]] name = "k8s-openapi" -version = "0.27.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05a6d6f3611ad1d21732adbd7a2e921f598af6c92d71ae6e2620da4b67ee1f0d" +checksum = "51b326f5219dd55872a72c1b6ddd1b830b8334996c667449c29391d657d78d5e" dependencies = [ "base64", "jiff", @@ -1511,13 +1509,28 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "darling", "regex", - "snafu 0.9.0", + "snafu 0.9.1", ] +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "kube" version = "3.1.0" @@ -1611,7 +1624,7 @@ dependencies = [ "backon", "educe", "futures 0.3.32", - "hashbrown", + "hashbrown 0.16.1", "hostname", "json-patch", "k8s-openapi", @@ -1637,15 +1650,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.182" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libgit2-sys" -version = "0.18.3+1.9.2" +version = "0.18.5+1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487" +checksum = "005d6ae6eac1912906073e069f7db60b1fa98e052a68227824afe3e3a1c59ca2" dependencies = [ "cc", "libc", @@ -1661,9 +1674,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libz-sys" -version = "1.1.24" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4735e9cbde5aac84a5ce588f6b23a90b9b0b528f6c5a8db8a4aff300463a0839" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", @@ -1673,9 +1686,9 @@ dependencies = [ [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -1688,9 +1701,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" [[package]] name = "matchers" @@ -1709,9 +1722,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "mime" @@ -1731,9 +1744,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "wasi", @@ -1760,16 +1773,16 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" @@ -1803,9 +1816,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -1821,9 +1834,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "opentelemetry" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" +checksum = "b0142c63252a9e054e68a4c61a5778f7b14f576274d593f8ce883d191a099682" dependencies = [ "futures-core", "futures-sink", @@ -1835,9 +1848,9 @@ dependencies = [ [[package]] name = "opentelemetry-appender-tracing" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6a1ac5ca3accf562b8c306fa8483c85f4390f768185ab775f242f7fe8fdcc2" +checksum = "2c0080f0dc1d7c786f467cd85a4e395fcab11ee852004f39a29a18ab7c25d837" dependencies = [ "opentelemetry", "tracing", @@ -1847,9 +1860,9 @@ dependencies = [ [[package]] name = "opentelemetry-http" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" dependencies = [ "async-trait", "bytes", @@ -1860,9 +1873,9 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2366db2dca4d2ad033cad11e6ee42844fd727007af5ad04a1730f4cb8163bf" +checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" dependencies = [ "http", "opentelemetry", @@ -1874,14 +1887,14 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tonic", - "tracing", + "tonic-types", ] [[package]] name = "opentelemetry-proto" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" +checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -1892,22 +1905,23 @@ dependencies = [ [[package]] name = "opentelemetry-semantic-conventions" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e62e29dfe041afb8ed2a6c9737ab57db4907285d999ef8ad3a59092a36bdc846" +checksum = "6ca2f98a0437b427b4b08f19f1caa3c44db885a202bc12cfea13d6c702243d68" [[package]] name = "opentelemetry_sdk" -version = "0.31.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" +checksum = "9b59f80e1ac4d5ff7a2db8fb6c80badb7f0f3f858211fba08dd9aaec750894f9" dependencies = [ "futures-channel", "futures-executor", "futures-util", "opentelemetry", "percent-encoding", - "rand 0.9.2", + "portable-atomic", + "rand 0.9.4", "thiserror 2.0.18", "tokio", "tokio-stream", @@ -2033,18 +2047,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", @@ -2057,12 +2071,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkcs1" version = "0.7.5" @@ -2086,9 +2094,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "portable-atomic" @@ -2098,18 +2106,18 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -2186,11 +2194,20 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "prost-types" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +dependencies = [ + "prost", +] + [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -2203,9 +2220,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.4", @@ -2213,9 +2230,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -2319,9 +2336,9 @@ checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" -version = "0.12.28" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64", "bytes", @@ -2337,9 +2354,6 @@ dependencies = [ "log", "percent-encoding", "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", "sync_wrapper", "tokio", "tower", @@ -2407,9 +2421,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "log", "once_cell", @@ -2422,9 +2436,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -2434,9 +2448,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "zeroize", ] @@ -2466,9 +2480,9 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -2553,9 +2567,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -2610,9 +2624,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -2690,9 +2704,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" @@ -2716,9 +2730,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "slab" @@ -2753,11 +2767,11 @@ dependencies = [ [[package]] name = "snafu" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1d4bced6a69f90b2056c03dcff2c4737f98d6fb9e0853493996e1d253ca29c6" +checksum = "d1a012328be2e3f5d5f6f3218147ca02588cea4cb865e876849ab6debcf36522" dependencies = [ - "snafu-derive 0.9.0", + "snafu-derive 0.9.1", ] [[package]] @@ -2785,9 +2799,9 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54254b8531cafa275c5e096f62d48c81435d1015405a91198ddb11e967301d40" +checksum = "5f103c50866b8743da9429b8a581d81a27c2d3a9c4ac7df8f8571c1dd7896eda" dependencies = [ "heck", "proc-macro2", @@ -2797,12 +2811,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2830,19 +2844,19 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stackable-certs" version = "0.4.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "const-oid", "ecdsa", "k8s-openapi", "kube", "p256", - "rand 0.9.2", + "rand 0.9.4", "rand_core 0.6.4", "rsa", "sha2", "signature", - "snafu 0.9.0", + "snafu 0.9.1", "stackable-shared", "tokio", "tokio-rustls", @@ -2854,7 +2868,7 @@ dependencies = [ [[package]] name = "stackable-operator" version = "0.111.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "base64", "clap", @@ -2871,14 +2885,14 @@ dependencies = [ "k8s-openapi", "kube", "product-config", - "rand 0.9.2", + "rand 0.9.4", "regex", "schemars", "semver", "serde", "serde_json", "serde_yaml", - "snafu 0.9.0", + "snafu 0.9.1", "stackable-operator-derive", "stackable-shared", "stackable-telemetry", @@ -2890,12 +2904,13 @@ dependencies = [ "tracing-appender", "tracing-subscriber", "url", + "uuid", ] [[package]] name = "stackable-operator-derive" version = "0.3.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "darling", "proc-macro2", @@ -2905,8 +2920,8 @@ dependencies = [ [[package]] name = "stackable-shared" -version = "0.1.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +version = "0.1.1" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "jiff", "k8s-openapi", @@ -2915,15 +2930,15 @@ dependencies = [ "semver", "serde", "serde_yaml", - "snafu 0.9.0", + "snafu 0.9.1", "strum", "time", ] [[package]] name = "stackable-telemetry" -version = "0.6.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +version = "0.6.4" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "axum", "clap", @@ -2934,7 +2949,7 @@ dependencies = [ "opentelemetry-semantic-conventions", "opentelemetry_sdk", "pin-project", - "snafu 0.9.0", + "snafu 0.9.1", "strum", "tokio", "tower", @@ -2947,21 +2962,21 @@ dependencies = [ [[package]] name = "stackable-versioned" version = "0.10.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "kube", "schemars", "serde", "serde_json", "serde_yaml", - "snafu 0.9.0", + "snafu 0.9.1", "stackable-versioned-macros", ] [[package]] name = "stackable-versioned-macros" version = "0.10.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "convert_case", "convert_case_extras", @@ -2979,7 +2994,7 @@ dependencies = [ [[package]] name = "stackable-webhook" version = "0.9.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#7a5f0c3fbcd091340214a23f0607fcd4b4fcc152" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" dependencies = [ "arc-swap", "async-trait", @@ -2992,10 +3007,10 @@ dependencies = [ "kube", "opentelemetry", "opentelemetry-semantic-conventions", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_json", - "snafu 0.9.0", + "snafu 0.9.1", "stackable-certs", "stackable-shared", "stackable-telemetry", @@ -3025,7 +3040,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "snafu 0.9.0", + "snafu 0.9.1", "stackable-operator", "strum", "tokio", @@ -3066,6 +3081,12 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + [[package]] name = "syn" version = "1.0.109" @@ -3190,9 +3211,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -3221,9 +3242,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.50.0" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -3238,9 +3259,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -3300,9 +3321,9 @@ dependencies = [ [[package]] name = "tonic" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", "base64", @@ -3327,15 +3348,26 @@ dependencies = [ [[package]] name = "tonic-prost" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" dependencies = [ "bytes", "prost", "tonic", ] +[[package]] +name = "tonic-types" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab1b02061f83d519bba3caa167f88f261ef05720ab8ebc954ade70de3348e8" +dependencies = [ + "prost", + "prost-types", + "tonic", +] + [[package]] name = "tower" version = "0.5.3" @@ -3357,9 +3389,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "base64", "bitflags", @@ -3367,13 +3399,13 @@ dependencies = [ "futures-util", "http", "http-body", - "iri-string", "mime", "pin-project-lite", "tower", "tower-layer", "tower-service", "tracing", + "url", ] [[package]] @@ -3402,11 +3434,12 @@ dependencies = [ [[package]] name = "tracing-appender" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" +checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" dependencies = [ "crossbeam-channel", + "symlink", "thiserror 2.0.18", "time", "tracing-subscriber", @@ -3446,9 +3479,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.32.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac28f2d093c6c477eaa76b23525478f38de514fa9aeb1285738d4b97a9552fc" +checksum = "adbc64cba7137545b8044cb1fe9814f7aacf3c6b5f9b45be8bb5db538befdb26" dependencies = [ "js-sys", "opentelemetry", @@ -3472,9 +3505,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -3499,9 +3532,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -3517,9 +3550,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-xid" @@ -3564,6 +3597,16 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" @@ -3599,18 +3642,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" dependencies = [ "cfg-if", "once_cell", @@ -3621,23 +3664,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3645,9 +3684,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" dependencies = [ "bumpalo", "proc-macro2", @@ -3658,18 +3697,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" dependencies = [ "js-sys", "wasm-bindgen", @@ -3750,16 +3789,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -3777,31 +3807,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -3810,107 +3823,59 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "wit-bindgen" -version = "0.51.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "x509-cert" @@ -3928,15 +3893,15 @@ dependencies = [ [[package]] name = "xml" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8aa498d22c9bbaf482329839bc5620c46be275a19a812e9a22a2b07529a642a" +checksum = "636f85e5ca6488e96401b61eb7de54f4e44755c988af0f52cf90230c312a1a89" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -3945,9 +3910,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -3957,18 +3922,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.40" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" +checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.40" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" +checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" dependencies = [ "proc-macro2", "quote", @@ -3977,18 +3942,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -4018,9 +3983,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -4029,9 +3994,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -4040,9 +4005,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 7793db17..1bc99559 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", anyhow = "1.0" built = { version = "0.8", features = ["chrono", "git2"] } -clap = "4.5" +clap = "4.6" const_format = "0.2" fnv = "1.0" futures = { version = "0.3", features = ["compat"] } @@ -27,12 +27,12 @@ serde_json = "1.0" serde_yaml = "0.9" snafu = "0.9" strum = { version = "0.28", features = ["derive"] } -tokio = { version = "1.40", features = ["full"] } +tokio = { version = "1.52", features = ["full"] } tokio-zookeeper = "0.4" tracing = "0.1" -[patch."https://github.com/stackabletech/operator-rs"] -# stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "main" } +[patch."https://github.com/stackabletech/operator-rs.git"] +stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "smooth-operator" } # stackable-operator = { path = "../operator-rs/crates/stackable-operator" } [patch.crates-io] From ccc3873f7636ca78a2739a16ae90db864ca4db01 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 16:57:41 +0200 Subject: [PATCH 02/16] refactor: Vendor Java properties writer into framework module Add a vendored framework module (mirroring stackable_operator::v2) and move the Java .properties writer into framework/writer.rs, backed by the same java-properties crate as product_config::writer so the rendered output is byte-identical. Swap the zoo.cfg / security.properties rendering in zk_controller from product_config::writer to the local writer. This removes the first product-config touch point. Properties only; the Hadoop XML writer from the hdfs-operator source is not needed here. Co-Authored-By: Claude Opus 4.8 (1M context) --- Cargo.lock | 1 + Cargo.toml | 1 + rust/operator-binary/Cargo.toml | 1 + rust/operator-binary/src/framework.rs | 10 +++ rust/operator-binary/src/framework/writer.rs | 81 ++++++++++++++++++++ rust/operator-binary/src/main.rs | 1 + rust/operator-binary/src/zk_controller.rs | 7 +- 7 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 rust/operator-binary/src/framework.rs create mode 100644 rust/operator-binary/src/framework/writer.rs diff --git a/Cargo.lock b/Cargo.lock index a018a77d..e33242c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3034,6 +3034,7 @@ dependencies = [ "fnv", "futures 0.3.32", "indoc", + "java-properties", "pin-project", "product-config", "semver", diff --git a/Cargo.toml b/Cargo.toml index 1bc99559..a3e0fcd0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ const_format = "0.2" fnv = "1.0" futures = { version = "0.3", features = ["compat"] } indoc = "2.0" +java-properties = "2.0" pin-project = "1.1" semver = "1.0" serde = { version = "1.0", features = ["derive"] } diff --git a/rust/operator-binary/Cargo.toml b/rust/operator-binary/Cargo.toml index efafbb3b..db67f85e 100644 --- a/rust/operator-binary/Cargo.toml +++ b/rust/operator-binary/Cargo.toml @@ -19,6 +19,7 @@ const_format.workspace = true fnv.workspace = true futures.workspace = true indoc.workspace = true +java-properties.workspace = true pin-project.workspace = true semver.workspace = true serde.workspace = true diff --git a/rust/operator-binary/src/framework.rs b/rust/operator-binary/src/framework.rs new file mode 100644 index 00000000..8f64b0f7 --- /dev/null +++ b/rust/operator-binary/src/framework.rs @@ -0,0 +1,10 @@ +//! Vendored framework code shared between Stackable operators. +//! +//! This module mirrors `stackable_operator::v2` (currently only available on the +//! `smooth-operator` branch of operator-rs). It is vendored here so the +//! zookeeper-operator can act as a second consumer that validates whether the +//! abstractions generalize, before they are promoted into operator-rs proper. +//! Once the upstream `v2` API has stabilized, these modules should be replaced +//! by direct usage of `stackable_operator::v2`. + +pub mod writer; diff --git a/rust/operator-binary/src/framework/writer.rs b/rust/operator-binary/src/framework/writer.rs new file mode 100644 index 00000000..7204ece6 --- /dev/null +++ b/rust/operator-binary/src/framework/writer.rs @@ -0,0 +1,81 @@ +//! Writer for Java `.properties` files (e.g. ZooKeeper's `zoo.cfg` and +//! `security.properties`). +//! +//! Vendored from the `product-config` crate's `writer` module so the operator no +//! longer depends on `product-config` for rendering. Backed by the same +//! `java-properties` crate, so the rendered output is byte-identical to the +//! previous `product_config::writer::to_java_properties_string`. + +use std::io::Write; + +use java_properties::{PropertiesError, PropertiesWriter}; +use snafu::{ResultExt, Snafu}; + +#[derive(Debug, Snafu)] +pub enum PropertiesWriterError { + #[snafu(display("failed to create properties file"))] + Properties { source: PropertiesError }, + + #[snafu(display("failed to convert properties file byte array to UTF-8"))] + FromUtf8 { source: std::string::FromUtf8Error }, +} + +/// Creates a common Java properties file string in the format: +/// `property_1=value_1\nproperty_2=value_2\n`. +pub fn to_java_properties_string<'a, T>(properties: T) -> Result +where + T: Iterator)>, +{ + let mut output = Vec::new(); + write_java_properties(&mut output, properties)?; + String::from_utf8(output).context(FromUtf8Snafu) +} + +/// Writes Java properties to the given writer. A `None` value is written as an +/// empty value (`key=`). +fn write_java_properties<'a, W, T>(writer: W, properties: T) -> Result<(), PropertiesWriterError> +where + W: Write, + T: Iterator)>, +{ + let mut writer = PropertiesWriter::new(writer); + for (k, v) in properties { + let property_value = v.as_deref().unwrap_or_default(); + writer.write(k, property_value).context(PropertiesSnafu)?; + } + writer.flush().context(PropertiesSnafu)?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeMap; + + use super::*; + + fn props(pairs: &[(&str, Option<&str>)]) -> String { + let map: BTreeMap> = pairs + .iter() + .map(|(k, v)| (k.to_string(), v.map(str::to_string))) + .collect(); + to_java_properties_string(map.iter()).unwrap() + } + + #[test] + fn java_properties_renders_key_value() { + assert_eq!(props(&[("a", Some("1")), ("b", Some("2"))]), "a=1\nb=2\n"); + } + + #[test] + fn java_properties_renders_none_as_empty() { + assert_eq!(props(&[("none", None)]), "none=\n"); + } + + #[test] + fn java_properties_escapes_colon_in_value() { + assert_eq!( + props(&[("url", Some("file://this/location/file.abc"))]), + "url=file\\://this/location/file.abc\n" + ); + } +} diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index c0adf5ff..bf0d646c 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -43,6 +43,7 @@ mod command; mod config; pub mod crd; mod discovery; +mod framework; mod listener; mod operations; mod product_logging; diff --git a/rust/operator-binary/src/zk_controller.rs b/rust/operator-binary/src/zk_controller.rs index 5983a4c9..3f6c3598 100644 --- a/rust/operator-binary/src/zk_controller.rs +++ b/rust/operator-binary/src/zk_controller.rs @@ -10,11 +10,7 @@ use std::{ use const_format::concatcp; use fnv::FnvHasher; use indoc::formatdoc; -use product_config::{ - ProductConfigManager, - types::PropertyNameKind, - writer::{PropertiesWriterError, to_java_properties_string}, -}; +use product_config::{ProductConfigManager, types::PropertyNameKind}; use snafu::{OptionExt, ResultExt, Snafu}; use stackable_operator::{ builder::{ @@ -87,6 +83,7 @@ use crate::{ v1alpha1::{self, ZookeeperServerRoleConfig}, }, discovery::{self, build_discovery_configmap}, + framework::writer::{PropertiesWriterError, to_java_properties_string}, listener::{build_role_listener, role_listener_name}, operations::{graceful_shutdown::add_graceful_shutdown_config, pdb::add_pdbs}, product_logging::extend_role_group_config_map, From ceac76c95c1dccc3cec13df2a0c4bdc18ce72fac Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 17:03:54 +0200 Subject: [PATCH 03/16] refactor: Vendor role_utils framework module Add framework/role_utils.rs mirroring stackable_operator::v2::role_utils from the smooth-operator branch (as trino-operator does): RoleGroupConfig plus with_validated_config, which merges default <- role <- rolegroup config fragments and validates them via FromFragment. Gated with allow(dead_code) until the reconciler is switched to produce a ValidatedCluster in the following commit. Co-Authored-By: Claude Opus 4.8 (1M context) --- rust/operator-binary/src/framework.rs | 3 + .../src/framework/role_utils.rs | 155 ++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 rust/operator-binary/src/framework/role_utils.rs diff --git a/rust/operator-binary/src/framework.rs b/rust/operator-binary/src/framework.rs index 8f64b0f7..3453b11a 100644 --- a/rust/operator-binary/src/framework.rs +++ b/rust/operator-binary/src/framework.rs @@ -7,4 +7,7 @@ //! Once the upstream `v2` API has stabilized, these modules should be replaced //! by direct usage of `stackable_operator::v2`. +// Wired into the reconciler in a follow-up commit (validate -> ValidatedCluster). +#[allow(dead_code)] +pub mod role_utils; pub mod writer; diff --git a/rust/operator-binary/src/framework/role_utils.rs b/rust/operator-binary/src/framework/role_utils.rs new file mode 100644 index 00000000..084a2fc3 --- /dev/null +++ b/rust/operator-binary/src/framework/role_utils.rs @@ -0,0 +1,155 @@ +//! Vendored variant of `stackable_operator::v2::role_utils` from the +//! `smooth-operator` branch, with simplifications appropriate for +//! zookeeper-operator. +//! +//! Differences from upstream: +//! - `env_overrides` is `BTreeMap` instead of `EnvVarSet`. +//! - No `cli_overrides_to_vec` helper, `ResourceNames`, or service-account helpers. +//! - The `CommonConfig` (a.k.a. `product_specific_common_config`) does NOT need to +//! implement `Merge`. ZooKeeper uses `JavaCommonConfig`, which intentionally does +//! not implement `Merge` because its inner `JvmArgumentOverrides::try_merge` is +//! fallible (regex validation). The `RoleGroupConfig::product_specific_common_config` +//! field here simply carries the role-group level value through. +//! +//! Replace with `stackable_operator::v2::role_utils::*` once upstream publishes +//! the module. + +use std::collections::BTreeMap; + +use serde::Serialize; +use stackable_operator::{ + config::{ + fragment::{self, FromFragment}, + merge::{Merge, merge}, + }, + k8s_openapi::{DeepMerge, api::core::v1::PodTemplateSpec}, + role_utils::{Role, RoleGroup}, + schemars::JsonSchema, +}; + +/// A validated, merged view of a `RoleGroup`. +/// +/// Mirrors `stackable_operator::v2::role_utils::RoleGroupConfig` on the +/// `smooth-operator` branch, with `env_overrides: BTreeMap` +/// instead of the upstream `EnvVarSet`. +#[derive(Clone, Debug, PartialEq)] +pub struct RoleGroupConfig { + pub replicas: u16, + pub config: Config, + pub config_overrides: ConfigOverrides, + pub env_overrides: BTreeMap, + pub cli_overrides: BTreeMap, + pub pod_overrides: PodTemplateSpec, + pub product_specific_common_config: CommonConfig, +} + +/// Merges and validates the `RoleGroup` with the given `role` and `default_config`, +/// returning a `RoleGroupConfig`. +/// +/// Merge order matches `with_validated_config` on `smooth-operator`: +/// - `Config` (Fragment): `default_config <- role.config <- rg.config` via `Merge::merge`, +/// then validated to `ValidatedConfig` via `FromFragment`. +/// - `ConfigOverrides`: `role.config_overrides <- rg.config_overrides` via `Merge::merge`. +/// - `env_overrides` / `cli_overrides`: `extend` (rg keys overwrite role keys). +/// - `pod_overrides`: `DeepMerge::merge_from` (rg overrides role). +/// - `product_specific_common_config`: passes through the role-group level value +/// (see module docs for rationale). +pub fn with_validated_config( + role_group: &RoleGroup, + role: &Role, + default_config: &Config, +) -> Result< + RoleGroupConfig, + fragment::ValidationError, +> +where + ValidatedConfig: FromFragment, + CommonConfig: Clone + Default + JsonSchema + Serialize, + Config: Clone + Merge, + RoleConfig: Default + JsonSchema + Serialize, + ConfigOverrides: Clone + Default + JsonSchema + Merge + Serialize, +{ + let validated_config = validate_config(role_group, role, default_config)?; + Ok(RoleGroupConfig { + replicas: role_group.replicas.unwrap_or(1), + config: validated_config, + config_overrides: merged_config_overrides( + &role.config.config_overrides, + role_group.config.config_overrides.clone(), + ), + env_overrides: merged_env_overrides( + role.config + .env_overrides + .iter() + .map(|(k, v)| (k.clone(), v.clone())) + .collect(), + role_group + .config + .env_overrides + .iter() + .map(|(k, v)| (k.clone(), v.clone())) + .collect(), + ), + cli_overrides: merged_cli_overrides( + role.config.cli_overrides.clone(), + role_group.config.cli_overrides.clone(), + ), + pod_overrides: merged_pod_overrides( + role.config.pod_overrides.clone(), + role_group.config.pod_overrides.clone(), + ), + product_specific_common_config: role_group.config.product_specific_common_config.clone(), + }) +} + +fn validate_config( + role_group: &RoleGroup, + role: &Role, + default_config: &Config, +) -> Result +where + ValidatedConfig: FromFragment, + CommonConfig: Default + JsonSchema + Serialize, + Config: Clone + Merge, + RoleConfig: Default + JsonSchema + Serialize, + ConfigOverrides: Default + JsonSchema + Serialize, +{ + role_group.validate_config(role, default_config) +} + +fn merged_config_overrides( + role_config_overrides: &ConfigOverrides, + role_group_config_overrides: ConfigOverrides, +) -> ConfigOverrides +where + ConfigOverrides: Merge, +{ + merge(role_group_config_overrides, role_config_overrides) +} + +fn merged_env_overrides( + role_env_overrides: BTreeMap, + role_group_env_overrides: BTreeMap, +) -> BTreeMap { + let mut merged = role_env_overrides; + merged.extend(role_group_env_overrides); + merged +} + +fn merged_cli_overrides( + role_cli_overrides: BTreeMap, + role_group_cli_overrides: BTreeMap, +) -> BTreeMap { + let mut merged = role_cli_overrides; + merged.extend(role_group_cli_overrides); + merged +} + +fn merged_pod_overrides( + role_pod_overrides: PodTemplateSpec, + role_group_pod_overrides: PodTemplateSpec, +) -> PodTemplateSpec { + let mut merged = role_pod_overrides; + merged.merge_from(role_group_pod_overrides); + merged +} From 37e7d4e517a4b50ab167c23936a64802faedcfda Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 18:29:35 +0200 Subject: [PATCH 04/16] refactor: Remove product-config, build config from typed ValidatedCluster Replace the product-config-based validation pipeline with a typed, framework- based one mirroring trino-operator: - validate() now produces a ValidatedCluster { name, image, cluster_config, role_group_configs } via framework::role_utils::with_validated_config, instead of the product-config PropertyNameKind map. server. quorum entries are precomputed into cluster_config so the build step never needs the CRD. - Add zk_controller/build/config_map.rs which builds zoo.cfg and security.properties directly from the typed config, referencing the ZookeeperCluster only for the owner reference. The operator defaults that product-config used to inject from deploy/config-spec/properties.yaml (admin.serverPort, clientPort, dataDir, initLimit, syncLimit, tickTime, metricsProvider.*, networkaddress.cache.*) are now seeded here, byte-identical to before (pinned by the kuttl ConfigMap snapshot). - Drop the product_config Configuration impl from the CRD; add a manual Merge impl for ZookeeperConfigOverrides (CRD schema unchanged) and Ord for ZookeeperRole. - Minimal consumer changes: the StatefulSet derives MYID_OFFSET/ZOOCFGDIR from the merged config plus envOverrides; the metrics Service takes a resolved port. - Remove ProductConfigManager from main.rs/Ctx and the product-config dependency from both Cargo.toml. It remains only as a transitive dependency of stackable-operator itself. Unit tests now exercise the product-config-free path and assert the seeded defaults and security.properties byte-for-byte. The generated CRD is unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) --- Cargo.lock | 1 - Cargo.toml | 1 - rust/operator-binary/Cargo.toml | 1 - rust/operator-binary/src/crd/mod.rs | 116 ++--- rust/operator-binary/src/main.rs | 8 +- rust/operator-binary/src/service.rs | 48 +- rust/operator-binary/src/zk_controller.rs | 440 ++++++++---------- .../src/zk_controller/build.rs | 8 + .../src/zk_controller/build/config_map.rs | 259 +++++++++++ .../src/zk_controller/validate.rs | 169 ++++--- 10 files changed, 604 insertions(+), 447 deletions(-) create mode 100644 rust/operator-binary/src/zk_controller/build.rs create mode 100644 rust/operator-binary/src/zk_controller/build/config_map.rs diff --git a/Cargo.lock b/Cargo.lock index e33242c2..25ea8d0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3036,7 +3036,6 @@ dependencies = [ "indoc", "java-properties", "pin-project", - "product-config", "semver", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index a3e0fcd0..3fc0dd93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,6 @@ edition = "2024" repository = "https://github.com/stackabletech/zookeeper-operator" [workspace.dependencies] -product-config = { git = "https://github.com/stackabletech/product-config.git", tag = "0.8.0" } stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.111.1", features = ["webhook"] } anyhow = "1.0" diff --git a/rust/operator-binary/Cargo.toml b/rust/operator-binary/Cargo.toml index db67f85e..7a707257 100644 --- a/rust/operator-binary/Cargo.toml +++ b/rust/operator-binary/Cargo.toml @@ -10,7 +10,6 @@ publish = false build = "build.rs" [dependencies] -product-config.workspace = true stackable-operator.workspace = true anyhow.workspace = true diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index ca4d74d1..b707bc32 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -25,7 +25,6 @@ use stackable_operator::{ }, kube::{CustomResource, ResourceExt, runtime::reflector::ObjectRef}, memory::{BinaryMultiple, MemoryQuantity}, - product_config_utils::{self, Configuration}, product_logging::{self, spec::Logging}, role_utils::{GenericRoleConfig, JavaCommonConfig, Role, RoleGroup, RoleGroupRef}, schemars::{self, JsonSchema}, @@ -346,6 +345,34 @@ pub mod versioned { } } +impl Merge for v1alpha1::ZookeeperConfigOverrides { + /// Merges `defaults` (role level) into `self` (role-group level). Keys present + /// in `self` win; keys only in `defaults` are added. Mirrors how the previous + /// product-config pipeline merged role and role-group `configOverrides`. + fn merge(&mut self, defaults: &Self) { + merge_key_value_overrides(&mut self.zoo_cfg, &defaults.zoo_cfg); + merge_key_value_overrides(&mut self.security_properties, &defaults.security_properties); + } +} + +/// Merges two optional [`KeyValueConfigOverrides`], with `this` taking precedence. +fn merge_key_value_overrides( + this: &mut Option, + defaults: &Option, +) { + match (this.as_mut(), defaults) { + (Some(this), Some(defaults)) => { + for (key, value) in &defaults.overrides { + this.overrides + .entry(key.clone()) + .or_insert_with(|| value.clone()); + } + } + (None, Some(defaults)) => *this = Some(defaults.clone()), + (Some(_), None) | (None, None) => {} + } +} + impl KeyValueOverridesProvider for v1alpha1::ZookeeperConfigOverrides { fn get_key_value_overrides(&self, file: &str) -> BTreeMap> { let field = match file { @@ -368,7 +395,9 @@ impl KeyValueOverridesProvider for v1alpha1::ZookeeperConfigOverrides { Eq, Hash, JsonSchema, + Ord, PartialEq, + PartialOrd, Serialize, EnumString, )] @@ -417,7 +446,7 @@ impl v1alpha1::ZookeeperConfig { pub const SYNC_LIMIT: &'static str = "syncLimit"; pub const TICK_TIME: &'static str = "tickTime"; - fn default_server_config( + pub(crate) fn default_server_config( cluster_name: &str, role: &ZookeeperRole, ) -> v1alpha1::ZookeeperConfigFragment { @@ -451,89 +480,6 @@ impl v1alpha1::ZookeeperConfig { } } -impl Configuration for v1alpha1::ZookeeperConfigFragment { - type Configurable = v1alpha1::ZookeeperCluster; - - fn compute_env( - &self, - resource: &Self::Configurable, - _role_name: &str, - ) -> Result>, product_config_utils::Error> { - Ok([ - ( - v1alpha1::ZookeeperConfig::MYID_OFFSET.to_string(), - self.myid_offset - .or(v1alpha1::ZookeeperConfig::default_server_config( - &resource.name_any(), - &ZookeeperRole::Server, - ) - .myid_offset) - .map(|myid_offset| myid_offset.to_string()), - ), - // This is used by zkEnv.sh and for the shell scripts in bin/ - // If unset it tries to find the conf directory automatically and that fails - ( - "ZOOCFGDIR".to_string(), - Some(STACKABLE_RW_CONFIG_DIR.to_string()), - ), - ] - .into()) - } - - fn compute_cli( - &self, - _resource: &Self::Configurable, - _role_name: &str, - ) -> Result>, product_config_utils::Error> { - Ok(BTreeMap::new()) - } - - fn compute_files( - &self, - _resource: &Self::Configurable, - _role_name: &str, - file: &str, - ) -> Result>, product_config_utils::Error> { - let mut result = BTreeMap::new(); - if file == ZOOKEEPER_PROPERTIES_FILE { - if let Some(init_limit) = self.init_limit { - result.insert( - v1alpha1::ZookeeperConfig::INIT_LIMIT.to_string(), - Some(init_limit.to_string()), - ); - } - if let Some(sync_limit) = self.sync_limit { - result.insert( - v1alpha1::ZookeeperConfig::SYNC_LIMIT.to_string(), - Some(sync_limit.to_string()), - ); - } - if let Some(tick_time) = self.tick_time { - result.insert( - v1alpha1::ZookeeperConfig::TICK_TIME.to_string(), - Some(tick_time.to_string()), - ); - } - result.insert( - v1alpha1::ZookeeperConfig::DATA_DIR.to_string(), - Some(STACKABLE_DATA_DIR.to_string()), - ); - result.insert( - "metricsProvider.className".to_string(), - Some( - "org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider".to_string(), - ), - ); - result.insert( - METRICS_PROVIDER_HTTP_PORT_KEY.to_string(), - Some(METRICS_PROVIDER_HTTP_PORT.to_string()), - ); - } - - Ok(result) - } -} - impl ZookeeperRole { pub fn roles() -> Vec { let mut roles = vec![]; diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index bf0d646c..2259d398 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -77,7 +77,7 @@ async fn main() -> anyhow::Result<()> { Command::Run(RunArguments { operator_environment, watch_namespace, - product_config, + product_config: _, maintenance, common, }) => { @@ -124,11 +124,6 @@ async fn main() -> anyhow::Result<()> { .run(sigterm_watcher.handle()) .map_err(|err| anyhow!(err).context("failed to run webhook server")); - let product_config = product_config.load(&[ - "deploy/config-spec/properties.yaml", - "/etc/stackable/zookeeper-operator/config-spec/properties.yaml", - ])?; - let zk_controller = Controller::new( watch_namespace.get_api::>(&client), watcher::Config::default(), @@ -161,7 +156,6 @@ async fn main() -> anyhow::Result<()> { Arc::new(zk_controller::Ctx { operator_environment: operator_environment.clone(), client: client.clone(), - product_config, }), ) // We can let the reporting happen in the background diff --git a/rust/operator-binary/src/service.rs b/rust/operator-binary/src/service.rs index b79cac39..e7aaa984 100644 --- a/rust/operator-binary/src/service.rs +++ b/rust/operator-binary/src/service.rs @@ -1,10 +1,4 @@ -use std::{ - collections::{BTreeMap, HashMap}, - str::FromStr, -}; - -use product_config::types::PropertyNameKind; -use snafu::{OptionExt, ResultExt, Snafu}; +use snafu::{ResultExt, Snafu}; use stackable_operator::{ builder::meta::ObjectMetaBuilder, commons::product_image_selection::ResolvedProductImage, @@ -15,10 +9,9 @@ use stackable_operator::{ use crate::{ crd::{ - APP_NAME, JMX_METRICS_PORT, JMX_METRICS_PORT_NAME, METRICS_PROVIDER_HTTP_PORT, - METRICS_PROVIDER_HTTP_PORT_KEY, METRICS_PROVIDER_HTTP_PORT_NAME, ZOOKEEPER_ELECTION_PORT, - ZOOKEEPER_ELECTION_PORT_NAME, ZOOKEEPER_LEADER_PORT, ZOOKEEPER_LEADER_PORT_NAME, - ZOOKEEPER_PROPERTIES_FILE, v1alpha1, + APP_NAME, JMX_METRICS_PORT, JMX_METRICS_PORT_NAME, METRICS_PROVIDER_HTTP_PORT_NAME, + ZOOKEEPER_ELECTION_PORT, ZOOKEEPER_ELECTION_PORT_NAME, ZOOKEEPER_LEADER_PORT, + ZOOKEEPER_LEADER_PORT_NAME, v1alpha1, }, utils::build_recommended_labels, zk_controller::ZK_CONTROLLER_NAME, @@ -40,12 +33,6 @@ pub enum Error { BuildLabel { source: stackable_operator::kvp::LabelError, }, - - #[snafu(display("missing zookeeper properties file {ZOOKEEPER_PROPERTIES_FILE} in config"))] - MissingPropertiesFile, - - #[snafu(display("missing provider http port key {METRICS_PROVIDER_HTTP_PORT_KEY} in config"))] - MissingProviderHttpPortKey, } /// The rolegroup [`Service`] is a headless service that allows internal access to the instances of a certain rolegroup @@ -110,10 +97,8 @@ pub(crate) fn build_server_rolegroup_metrics_service( zk: &v1alpha1::ZookeeperCluster, rolegroup: &RoleGroupRef, resolved_product_image: &ResolvedProductImage, - rolegroup_config: &HashMap>, + metrics_port: u16, ) -> Result { - let metrics_port = metrics_port_from_rolegroup_config(rolegroup_config)?; - let metadata = ObjectMetaBuilder::new() .name_and_namespace(zk) .name(rolegroup.rolegroup_metrics_service_name()) @@ -166,29 +151,6 @@ pub(crate) fn build_server_rolegroup_metrics_service( }) } -pub(crate) fn metrics_port_from_rolegroup_config( - rolegroup_config: &HashMap>, -) -> Result { - let metrics_port = rolegroup_config - .get(&PropertyNameKind::File( - ZOOKEEPER_PROPERTIES_FILE.to_string(), - )) - .context(MissingPropertiesFileSnafu)? - .get(METRICS_PROVIDER_HTTP_PORT_KEY) - .context(MissingProviderHttpPortKeySnafu)?; - - let port = match u16::from_str(metrics_port) { - Ok(port) => port, - Err(err) => { - tracing::error!("{err}"); - tracing::info!("Defaulting to using {METRICS_PROVIDER_HTTP_PORT} as metrics port."); - METRICS_PROVIDER_HTTP_PORT - } - }; - - Ok(port) -} - /// Common labels for Prometheus fn prometheus_labels() -> Labels { Labels::try_from([("prometheus.io/scrape", "true")]).expect("should be a valid label") diff --git a/rust/operator-binary/src/zk_controller.rs b/rust/operator-binary/src/zk_controller.rs index 3f6c3598..3ed08e64 100644 --- a/rust/operator-binary/src/zk_controller.rs +++ b/rust/operator-binary/src/zk_controller.rs @@ -1,21 +1,13 @@ //! Ensures that `Pod`s are configured and running for each [`v1alpha1::ZookeeperCluster`] -use std::{ - borrow::Cow, - collections::{BTreeMap, HashMap}, - hash::Hasher, - str::FromStr, - sync::Arc, -}; +use std::{collections::BTreeMap, hash::Hasher, sync::Arc}; use const_format::concatcp; use fnv::FnvHasher; use indoc::formatdoc; -use product_config::{ProductConfigManager, types::PropertyNameKind}; use snafu::{OptionExt, ResultExt, Snafu}; use stackable_operator::{ builder::{ self, - configmap::ConfigMapBuilder, meta::ObjectMetaBuilder, pod::{ PodBuilder, @@ -33,8 +25,8 @@ use stackable_operator::{ api::{ apps::v1::{StatefulSet, StatefulSetSpec}, core::v1::{ - ConfigMap, ConfigMapVolumeSource, EmptyDirVolumeSource, EnvVar, EnvVarSource, - ExecAction, ObjectFieldSelector, PersistentVolumeClaim, PodSecurityContext, Probe, + ConfigMapVolumeSource, EmptyDirVolumeSource, EnvVar, EnvVarSource, ExecAction, + ObjectFieldSelector, PersistentVolumeClaim, PodSecurityContext, Probe, ServiceAccount, Volume, }, }, @@ -64,7 +56,7 @@ use stackable_operator::{ compute_conditions, operations::ClusterOperationsConditionBuilder, statefulset::StatefulSetConditionBuilder, }, - utils::{COMMON_BASH_TRAP_FUNCTIONS, cluster_info::KubernetesClusterInfo}, + utils::COMMON_BASH_TRAP_FUNCTIONS, }; use strum::{EnumDiscriminants, IntoStaticStr}; @@ -73,27 +65,24 @@ use crate::{ command::create_init_container_command_args, config::jvm::{construct_non_heap_jvm_args, construct_zk_server_heap_env}, crd::{ - JMX_METRICS_PORT_NAME, JVM_SECURITY_PROPERTIES_FILE, MAX_PREPARE_LOG_FILE_SIZE, - MAX_ZK_LOG_FILES_SIZE, METRICS_PROVIDER_HTTP_PORT_NAME, STACKABLE_CONFIG_DIR, - STACKABLE_DATA_DIR, STACKABLE_LOG_CONFIG_DIR, STACKABLE_LOG_DIR, STACKABLE_RW_CONFIG_DIR, + JMX_METRICS_PORT_NAME, MAX_PREPARE_LOG_FILE_SIZE, MAX_ZK_LOG_FILES_SIZE, + METRICS_PROVIDER_HTTP_PORT_NAME, STACKABLE_CONFIG_DIR, STACKABLE_DATA_DIR, + STACKABLE_LOG_CONFIG_DIR, STACKABLE_LOG_DIR, STACKABLE_RW_CONFIG_DIR, ZOOKEEPER_ELECTION_PORT, ZOOKEEPER_ELECTION_PORT_NAME, ZOOKEEPER_LEADER_PORT, - ZOOKEEPER_LEADER_PORT_NAME, ZOOKEEPER_PROPERTIES_FILE, ZOOKEEPER_SERVER_PORT_NAME, - ZookeeperRole, + ZOOKEEPER_LEADER_PORT_NAME, ZOOKEEPER_SERVER_PORT_NAME, ZookeeperRole, security::{self, ZookeeperSecurity}, v1alpha1::{self, ZookeeperServerRoleConfig}, }, discovery::{self, build_discovery_configmap}, - framework::writer::{PropertiesWriterError, to_java_properties_string}, listener::{build_role_listener, role_listener_name}, operations::{graceful_shutdown::add_graceful_shutdown_config, pdb::add_pdbs}, - product_logging::extend_role_group_config_map, service::{ self, build_server_rolegroup_headless_service, build_server_rolegroup_metrics_service, - metrics_port_from_rolegroup_config, }, utils::build_recommended_labels, }; +mod build; mod dereference; mod validate; @@ -104,7 +93,6 @@ pub const LISTENER_VOLUME_DIR: &str = "/stackable/listener"; pub struct Ctx { pub client: stackable_operator::client::Client, - pub product_config: ProductConfigManager, pub operator_environment: OperatorEnvironmentOptions, } @@ -131,12 +119,6 @@ pub enum Error { #[snafu(display("crd validation failure"))] CrdValidationFailure { source: crate::crd::Error }, - #[snafu(display("could not parse role [{role}]"))] - RoleParseFailure { - source: strum::ParseError, - role: String, - }, - #[snafu(display("internal operator failure"))] InternalOperatorFailure { source: crate::crd::Error }, @@ -147,8 +129,8 @@ pub enum Error { }, #[snafu(display("failed to build ConfigMap for {}", rolegroup))] - BuildRoleGroupConfig { - source: stackable_operator::builder::configmap::Error, + BuildRoleGroupConfigMap { + source: build::config_map::Error, rolegroup: RoleGroupRef, }, @@ -164,12 +146,6 @@ pub enum Error { rolegroup: RoleGroupRef, }, - #[snafu(display("failed to serialize [{ZOOKEEPER_PROPERTIES_FILE}] for {}", rolegroup))] - SerializeZooCfg { - source: PropertiesWriterError, - rolegroup: RoleGroupRef, - }, - #[snafu(display("object is missing metadata to build owner reference"))] ObjectMissingMetadataForOwnerRef { source: stackable_operator::builder::meta::Error, @@ -211,15 +187,6 @@ pub enum Error { #[snafu(display("vector agent is enabled but vector aggregator ConfigMap is missing"))] VectorAggregatorConfigMapMissing, - #[snafu(display("failed to add the logging configuration to the ConfigMap {cm_name}"))] - InvalidLoggingConfig { - source: crate::product_logging::Error, - cm_name: String, - }, - - #[snafu(display("failed to resolve and merge config for role and role group"))] - FailedToResolveConfig { source: crate::crd::Error }, - #[snafu(display("failed to create PodDisruptionBudget"))] FailedToCreatePdb { source: crate::operations::pdb::Error, @@ -278,8 +245,6 @@ pub enum Error { #[snafu(display("failed to build service"))] BuildService { source: service::Error }, - #[snafu(display("failed to retrieve metrics port from config"))] - RetrieveMetricsPortFromConfig { source: service::Error }, } impl ReconcilerError for Error { @@ -294,13 +259,11 @@ impl ReconcilerError for Error { Error::Dereference { .. } => None, Error::ValidateCluster { .. } => None, Error::CrdValidationFailure { .. } => None, - Error::RoleParseFailure { .. } => None, Error::InternalOperatorFailure { .. } => None, Error::ApplyRoleGroupService { .. } => None, - Error::BuildRoleGroupConfig { .. } => None, + Error::BuildRoleGroupConfigMap { .. } => None, Error::ApplyRoleGroupConfig { .. } => None, Error::ApplyRoleGroupStatefulSet { .. } => None, - Error::SerializeZooCfg { .. } => None, Error::ObjectMissingMetadataForOwnerRef { .. } => None, Error::BuildDiscoveryConfig { .. } => None, Error::ApplyDiscoveryConfig { .. } => None, @@ -310,8 +273,6 @@ impl ReconcilerError for Error { Error::BuildRbacResources { .. } => None, Error::DeleteOrphans { .. } => None, Error::VectorAggregatorConfigMapMissing => None, - Error::InvalidLoggingConfig { .. } => None, - Error::FailedToResolveConfig { .. } => None, Error::FailedToCreatePdb { .. } => None, Error::GracefulShutdown { .. } => None, Error::BuildLabel { .. } => None, @@ -326,7 +287,6 @@ impl ReconcilerError for Error { Error::BuildListenerPersistentVolume { .. } => None, Error::ListenerConfiguration { .. } => None, Error::BuildService { .. } => None, - Error::RetrieveMetricsPortFromConfig { .. } => None, } } } @@ -348,17 +308,15 @@ pub async fn reconcile_zk( .context(DereferenceSnafu)?; // validate (no client required) - let validate::ValidatedInputs { - resolved_product_image, - zookeeper_security, - validated_role_config, - } = validate::validate( + let validated_cluster = validate::validate( zk, &dereferenced_objects, &ctx.operator_environment, - &ctx.product_config, + &client.kubernetes_cluster_info, ) .context(ValidateClusterSnafu)?; + let resolved_product_image = &validated_cluster.image; + let zookeeper_security = &validated_cluster.cluster_config.zookeeper_security; let mut cluster_resources = ClusterResources::new( APP_NAME, @@ -370,11 +328,6 @@ pub async fn reconcile_zk( ) .context(CreateClusterResourcesSnafu)?; - let role_server_config = validated_role_config - .get(&ZookeeperRole::Server.to_string()) - .map(Cow::Borrowed) - .unwrap_or_default(); - let (rbac_sa, rbac_rolebinding) = build_rbac_resources( zk, APP_NAME, @@ -397,38 +350,45 @@ pub async fn reconcile_zk( let mut ss_cond_builder = StatefulSetConditionBuilder::default(); let zk_role = ZookeeperRole::Server; - for (rolegroup_name, rolegroup_config) in role_server_config.iter() { + let server_role_group_configs = validated_cluster + .role_group_configs + .get(&zk_role) + .into_iter() + .flatten(); + for (rolegroup_name, rolegroup_config) in server_role_group_configs { let rolegroup = zk.server_rolegroup_ref(rolegroup_name); - let merged_config = zk - .merged_config(&ZookeeperRole::Server, &rolegroup) - .context(FailedToResolveConfigSnafu)?; + let merged_config = &rolegroup_config.config; + let metrics_port = build::config_map::metrics_http_port(&validated_cluster, rolegroup_config); let rg_headless_service = - build_server_rolegroup_headless_service(zk, &rolegroup, &resolved_product_image) + build_server_rolegroup_headless_service(zk, &rolegroup, resolved_product_image) .context(BuildServiceSnafu)?; let rg_metrics_service = build_server_rolegroup_metrics_service( zk, &rolegroup, - &resolved_product_image, - rolegroup_config, + resolved_product_image, + metrics_port, ) .context(BuildServiceSnafu)?; - let rg_configmap = build_server_rolegroup_config_map( - zk, + let rg_configmap = build::config_map::build_server_rolegroup_config_map( + &validated_cluster, + &zk_role, &rolegroup, rolegroup_config, - &resolved_product_image, - &zookeeper_security, - &client.kubernetes_cluster_info, - )?; + zk, + ) + .context(BuildRoleGroupConfigMapSnafu { + rolegroup: rolegroup.clone(), + })?; let rg_statefulset = build_server_rolegroup_statefulset( zk, &zk_role, &rolegroup, - rolegroup_config, - &zookeeper_security, - &resolved_product_image, - &merged_config, + &rolegroup_config.env_overrides, + zookeeper_security, + resolved_product_image, + merged_config, + metrics_port, &rbac_sa, )?; @@ -477,7 +437,7 @@ pub async fn reconcile_zk( .context(FailedToCreatePdbSnafu)?; } - let listener = build_role_listener(zk, &zk_role, &resolved_product_image, &zookeeper_security) + let listener = build_role_listener(zk, &zk_role, resolved_product_image, zookeeper_security) .context(ListenerConfigurationSnafu)?; let applied_listener = cluster_resources .add(client, listener) @@ -493,8 +453,8 @@ pub async fn reconcile_zk( ZK_CONTROLLER_NAME, applied_listener, None, - &resolved_product_image, - &zookeeper_security, + resolved_product_image, + zookeeper_security, ) .context(BuildDiscoveryConfigSnafu)?; @@ -528,112 +488,6 @@ pub async fn reconcile_zk( Ok(controller::Action::await_change()) } -/// The rolegroup [`ConfigMap`] configures the rolegroup based on the configuration given by the administrator -fn build_server_rolegroup_config_map( - zk: &v1alpha1::ZookeeperCluster, - rolegroup: &RoleGroupRef, - server_config: &HashMap>, - resolved_product_image: &ResolvedProductImage, - zookeeper_security: &ZookeeperSecurity, - cluster_info: &KubernetesClusterInfo, -) -> Result { - let mut zoo_cfg: BTreeMap<_, _> = zk - .pods() - .into_iter() - .flatten() - .map(|pod| { - ( - format!("server.{id}", id = pod.zookeeper_myid), - format!( - "{internal_fqdn}:{ZOOKEEPER_LEADER_PORT}:{ZOOKEEPER_ELECTION_PORT};{client_port}", - internal_fqdn = pod.internal_fqdn(cluster_info), - client_port = zookeeper_security.client_port() - ), - ) - }) - .collect(); - - zoo_cfg.extend(zookeeper_security.config_settings()); - - let jvm_sec_props: BTreeMap> = server_config - .get(&PropertyNameKind::File( - JVM_SECURITY_PROPERTIES_FILE.to_string(), - )) - .cloned() - .unwrap_or_default() - .into_iter() - .map(|(k, v)| (k, Some(v))) - .collect(); - - let role = - ZookeeperRole::from_str(&rolegroup.role).with_context(|_| RoleParseFailureSnafu { - role: rolegroup.role.to_string(), - })?; - - // configOverrides need to go last - zoo_cfg.extend( - server_config - .get(&PropertyNameKind::File( - ZOOKEEPER_PROPERTIES_FILE.to_string(), - )) - .cloned() - .unwrap_or_default(), - ); - - let zk_data: BTreeMap> = - zoo_cfg.into_iter().map(|(k, v)| (k, Some(v))).collect(); - - let mut cm_builder = ConfigMapBuilder::new(); - cm_builder - .metadata( - ObjectMetaBuilder::new() - .name_and_namespace(zk) - .name(rolegroup.object_name()) - .ownerreference_from_resource(zk, None, Some(true)) - .context(ObjectMissingMetadataForOwnerRefSnafu)? - .with_recommended_labels(&build_recommended_labels( - zk, - ZK_CONTROLLER_NAME, - &resolved_product_image.app_version_label_value, - &rolegroup.role, - &rolegroup.role_group, - )) - .context(ObjectMetaSnafu)? - .build(), - ) - .add_data( - JVM_SECURITY_PROPERTIES_FILE, - to_java_properties_string(jvm_sec_props.iter()).with_context(|_| { - SerializeZooCfgSnafu { - rolegroup: rolegroup.clone(), - } - })?, - ) - .add_data( - ZOOKEEPER_PROPERTIES_FILE, - to_java_properties_string(zk_data.iter()).with_context(|_| SerializeZooCfgSnafu { - rolegroup: rolegroup.clone(), - })?, - ); - - extend_role_group_config_map( - zk, - role, - rolegroup, - &mut cm_builder, - &resolved_product_image.product_version, - ) - .context(InvalidLoggingConfigSnafu { - cm_name: rolegroup.object_name(), - })?; - - cm_builder - .build() - .with_context(|_| BuildRoleGroupConfigSnafu { - rolegroup: rolegroup.clone(), - }) -} - pub fn build_role_listener_pvc( group_listener_name: &str, unversioned_recommended_labels: &Labels, @@ -654,10 +508,11 @@ fn build_server_rolegroup_statefulset( zk: &v1alpha1::ZookeeperCluster, zk_role: &ZookeeperRole, rolegroup_ref: &RoleGroupRef, - server_config: &HashMap>, + env_overrides: &BTreeMap, zookeeper_security: &ZookeeperSecurity, resolved_product_image: &ResolvedProductImage, merged_config: &v1alpha1::ZookeeperConfig, + metrics_port: u16, service_account: &ServiceAccount, ) -> Result { let role = zk.role(zk_role).context(InternalOperatorFailureSnafu)?; @@ -669,13 +524,23 @@ fn build_server_rolegroup_statefulset( .logging(zk_role, rolegroup_ref) .context(CrdValidationFailureSnafu)?; - let env_vars = server_config - .get(&PropertyNameKind::Env) + // The operator-injected environment variables (formerly produced by the + // product-config `Configuration::compute_env` implementation) plus the + // user-provided `envOverrides` (which win on conflict). + let mut env_map: BTreeMap = BTreeMap::new(); + env_map.insert( + v1alpha1::ZookeeperConfig::MYID_OFFSET.to_string(), + merged_config.myid_offset.to_string(), + ); + // Used by zkEnv.sh and the shell scripts in bin/. If unset it tries to find the + // conf directory automatically and that fails. + env_map.insert("ZOOCFGDIR".to_string(), STACKABLE_RW_CONFIG_DIR.to_string()); + env_map.extend(env_overrides.clone()); + let env_vars = env_map .into_iter() - .flatten() - .map(|(k, v)| EnvVar { - name: k.clone(), - value: Some(v.clone()), + .map(|(name, value)| EnvVar { + name, + value: Some(value), ..EnvVar::default() }) .collect::>(); @@ -846,12 +711,7 @@ fn build_server_rolegroup_statefulset( .add_container_port(ZOOKEEPER_LEADER_PORT_NAME, ZOOKEEPER_LEADER_PORT as i32) .add_container_port(ZOOKEEPER_ELECTION_PORT_NAME, ZOOKEEPER_ELECTION_PORT as i32) .add_container_port(JMX_METRICS_PORT_NAME, 9505) - .add_container_port( - METRICS_PROVIDER_HTTP_PORT_NAME, - metrics_port_from_rolegroup_config(server_config) - .context(RetrieveMetricsPortFromConfigSnafu)? - .into(), - ) + .add_container_port(METRICS_PROVIDER_HTTP_PORT_NAME, metrics_port.into()) .add_volume_mount("data", STACKABLE_DATA_DIR) .context(AddVolumeMountSnafu)? .add_volume_mount("config", STACKABLE_CONFIG_DIR) @@ -1032,13 +892,17 @@ pub fn error_policy( mod tests { use stackable_operator::{ commons::networking::DomainName, - product_config_utils::{ - transform_all_roles_to_config, validate_all_roles_and_groups_config, - }, + k8s_openapi::api::core::v1::ConfigMap, + role_utils::JavaCommonConfig, + utils::cluster_info::KubernetesClusterInfo, }; use super::*; - use crate::crd::CONTAINER_IMAGE_BASE_NAME; + use crate::{ + crd::CONTAINER_IMAGE_BASE_NAME, + framework::role_utils::with_validated_config, + zk_controller::validate::{ValidatedCluster, ValidatedClusterConfig}, + }; #[test] fn test_default_config() { @@ -1109,66 +973,144 @@ mod tests { assert!(cm.contains_key("security.properties")); } + #[test] + fn test_seeded_operator_defaults() { + // These values used to be injected by product-config from + // `deploy/config-spec/properties.yaml`. They are now seeded directly by the + // ConfigMap builder and must stay byte-identical (pinned by the kuttl + // snapshot `tests/templates/kuttl/smoke/14-assert.yaml.j2`). + let zookeeper_yaml = r#" + apiVersion: zookeeper.stackable.tech/v1alpha1 + kind: ZookeeperCluster + metadata: + name: simple-zookeeper + spec: + image: + productVersion: "3.9.5" + servers: + roleGroups: + default: + replicas: 3 + "#; + let cm = build_config_map(zookeeper_yaml).data.unwrap(); + + // `security.properties` is fully operator-injected; assert it byte-for-byte. + assert_eq!( + cm.get("security.properties").unwrap(), + "networkaddress.cache.negative.ttl=0\nnetworkaddress.cache.ttl=5\n" + ); + + let zoo_cfg = cm.get("zoo.cfg").unwrap(); + for expected in [ + "admin.serverPort=8080", + // new_for_tests() enables server TLS, so the secure client port is used. + "clientPort=2282", + "dataDir=/stackable/data", + "initLimit=5", + "syncLimit=2", + "tickTime=3000", + "metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider", + "metricsProvider.httpPort=7000", + ] { + assert!(zoo_cfg.contains(expected), "missing {expected:?} in:\n{zoo_cfg}"); + } + } + + #[test] + fn test_user_config_overrides_seeded_default() { + // A value set on the typed config must win over the seeded default. + let zookeeper_yaml = r#" + apiVersion: zookeeper.stackable.tech/v1alpha1 + kind: ZookeeperCluster + metadata: + name: simple-zookeeper + spec: + image: + productVersion: "3.9.5" + servers: + roleGroups: + default: + replicas: 3 + config: + tickTime: 4000 + initLimit: 7 + "#; + let cm = build_config_map(zookeeper_yaml).data.unwrap(); + let zoo_cfg = cm.get("zoo.cfg").unwrap(); + assert!(zoo_cfg.contains("tickTime=4000"), "{zoo_cfg}"); + assert!(zoo_cfg.contains("initLimit=7"), "{zoo_cfg}"); + // Untouched default stays. + assert!(zoo_cfg.contains("syncLimit=2"), "{zoo_cfg}"); + } + fn build_config_map(zookeeper_yaml: &str) -> ConfigMap { let mut zookeeper: v1alpha1::ZookeeperCluster = serde_yaml::from_str(zookeeper_yaml).expect("illegal test input"); zookeeper.metadata.uid = Some("42".to_owned()); + zookeeper.metadata.namespace = Some("default".to_owned()); let cluster_info = KubernetesClusterInfo { cluster_domain: DomainName::try_from("cluster.local").unwrap(), }; - let resolved_product_image = zookeeper + let image = zookeeper .spec .image .resolve(CONTAINER_IMAGE_BASE_NAME, "oci.example.org", "0.0.0-dev") .expect("test resolved product image is always valid"); + let zookeeper_security = ZookeeperSecurity::new_for_tests(); - let validated_config = validate_all_roles_and_groups_config( - &resolved_product_image.product_version, - &transform_all_roles_to_config( - &zookeeper, - &[( - ZookeeperRole::Server.to_string(), - ( - vec![ - PropertyNameKind::Env, - PropertyNameKind::File(ZOOKEEPER_PROPERTIES_FILE.to_string()), - PropertyNameKind::File(JVM_SECURITY_PROPERTIES_FILE.to_string()), - ], - zookeeper.spec.servers.clone().unwrap(), + let zk_role = ZookeeperRole::Server; + let role = zookeeper.role(&zk_role).unwrap(); + let default_config = + v1alpha1::ZookeeperConfig::default_server_config(&zookeeper.name_any(), &zk_role); + let mut groups = BTreeMap::new(); + for (rg_name, rg) in &role.role_groups { + let validated_rg = with_validated_config::< + v1alpha1::ZookeeperConfig, + JavaCommonConfig, + v1alpha1::ZookeeperConfigFragment, + _, + v1alpha1::ZookeeperConfigOverrides, + >(rg, role, &default_config) + .unwrap(); + groups.insert(rg_name.clone(), validated_rg); + } + let mut role_group_configs = BTreeMap::new(); + role_group_configs.insert(zk_role.clone(), groups); + + let server_addresses = zookeeper + .pods() + .unwrap() + .map(|pod| { + ( + format!("server.{id}", id = pod.zookeeper_myid), + format!( + "{fqdn}:{ZOOKEEPER_LEADER_PORT}:{ZOOKEEPER_ELECTION_PORT};{client_port}", + fqdn = pod.internal_fqdn(&cluster_info), + client_port = zookeeper_security.client_port() ), - )] - .into(), - ) - .unwrap(), - // Using this instead of ProductConfigManager::from_yaml_file, as that did not find the file - &ProductConfigManager::from_str(include_str!( - "../../../deploy/config-spec/properties.yaml" - )) - .unwrap(), - false, - false, - ) - .unwrap(); - - let rolegroup_ref = RoleGroupRef { - cluster: ObjectRef::from_obj(&zookeeper), - role: ZookeeperRole::Server.to_string(), - role_group: "default".to_string(), + ) + }) + .collect(); + + let validated_cluster = ValidatedCluster { + name: zookeeper.name_any(), + image, + cluster_config: ValidatedClusterConfig { + zookeeper_security, + server_addresses, + }, + role_group_configs, }; - let zookeeper_security = ZookeeperSecurity::new_for_tests(); + let rolegroup_ref = zookeeper.server_rolegroup_ref("default"); + let rolegroup_config = &validated_cluster.role_group_configs[&zk_role]["default"]; - build_server_rolegroup_config_map( - &zookeeper, + build::config_map::build_server_rolegroup_config_map( + &validated_cluster, + &zk_role, &rolegroup_ref, - validated_config - .get("server") - .unwrap() - .get("default") - .unwrap(), - &resolved_product_image, - &zookeeper_security, - &cluster_info, + rolegroup_config, + &zookeeper, ) .unwrap() } diff --git a/rust/operator-binary/src/zk_controller/build.rs b/rust/operator-binary/src/zk_controller/build.rs new file mode 100644 index 00000000..34ae61d7 --- /dev/null +++ b/rust/operator-binary/src/zk_controller/build.rs @@ -0,0 +1,8 @@ +//! Build steps for the ZookeeperCluster controller. +//! +//! Each submodule turns the [`ValidatedCluster`](super::validate::ValidatedCluster) +//! into a Kubernetes resource. The [`v1alpha1::ZookeeperCluster`](crate::crd::v1alpha1::ZookeeperCluster) +//! is only used for the owner reference and object metadata, never for +//! configuration. + +pub mod config_map; diff --git a/rust/operator-binary/src/zk_controller/build/config_map.rs b/rust/operator-binary/src/zk_controller/build/config_map.rs new file mode 100644 index 00000000..2ebb3f4e --- /dev/null +++ b/rust/operator-binary/src/zk_controller/build/config_map.rs @@ -0,0 +1,259 @@ +//! Builds the rolegroup `ConfigMap` (`zoo.cfg` + `security.properties`) from the +//! [`ValidatedCluster`], without reaching into the +//! [`v1alpha1::ZookeeperCluster`] except for the owner reference and metadata. +//! +//! The operator-injected defaults seeded here used to live in +//! `deploy/config-spec/properties.yaml` and were injected by the `product-config` +//! crate during validation. They are reproduced here so the rendered config is +//! byte-identical to the previous implementation. + +use std::collections::BTreeMap; + +use snafu::{ResultExt, Snafu}; +use stackable_operator::{ + builder::{ + configmap::ConfigMapBuilder, + meta::ObjectMetaBuilder, + }, + config_overrides::KeyValueOverridesProvider, + k8s_openapi::api::core::v1::ConfigMap, + role_utils::RoleGroupRef, +}; + +use crate::{ + crd::{ + JVM_SECURITY_PROPERTIES_FILE, METRICS_PROVIDER_HTTP_PORT, METRICS_PROVIDER_HTTP_PORT_KEY, + STACKABLE_DATA_DIR, ZOOKEEPER_PROPERTIES_FILE, ZookeeperRole, + security::ZookeeperSecurity, + v1alpha1::{self, ZookeeperConfig}, + }, + framework::writer::{PropertiesWriterError, to_java_properties_string}, + product_logging::extend_role_group_config_map, + utils::build_recommended_labels, + zk_controller::{ + ZK_CONTROLLER_NAME, + validate::{ValidatedCluster, ZookeeperRoleGroupConfig}, + }, +}; + +#[derive(Snafu, Debug)] +pub enum Error { + #[snafu(display("failed to serialize [{file}] for {rolegroup}"))] + SerializeProperties { + source: PropertiesWriterError, + file: String, + rolegroup: RoleGroupRef, + }, + + #[snafu(display("object is missing metadata to build owner reference"))] + ObjectMissingMetadataForOwnerRef { + source: stackable_operator::builder::meta::Error, + }, + + #[snafu(display("failed to build object meta data"))] + ObjectMeta { + source: stackable_operator::builder::meta::Error, + }, + + #[snafu(display("failed to add the logging configuration to the ConfigMap [{cm_name}]"))] + InvalidLoggingConfig { + source: crate::product_logging::Error, + cm_name: String, + }, + + #[snafu(display("failed to build ConfigMap for {rolegroup}"))] + BuildConfigMap { + source: stackable_operator::builder::configmap::Error, + rolegroup: RoleGroupRef, + }, +} + +type Result = std::result::Result; + +/// Builds the rolegroup [`ConfigMap`]. +/// +/// `owner` is the [`v1alpha1::ZookeeperCluster`] and is used solely for the owner +/// reference and object metadata (name, namespace, labels). +pub fn build_server_rolegroup_config_map( + cluster: &ValidatedCluster, + role: &ZookeeperRole, + rolegroup_ref: &RoleGroupRef, + rolegroup_config: &ZookeeperRoleGroupConfig, + owner: &v1alpha1::ZookeeperCluster, +) -> Result { + let zoo_cfg = build_zoo_cfg(cluster, rolegroup_config); + let security_properties = build_security_properties(rolegroup_config); + + let zoo_cfg_data = into_optional_values(zoo_cfg); + let security_properties_data = into_optional_values(security_properties); + + let mut cm_builder = ConfigMapBuilder::new(); + cm_builder + .metadata( + ObjectMetaBuilder::new() + .name_and_namespace(owner) + .name(rolegroup_ref.object_name()) + .ownerreference_from_resource(owner, None, Some(true)) + .context(ObjectMissingMetadataForOwnerRefSnafu)? + .with_recommended_labels(&build_recommended_labels( + owner, + ZK_CONTROLLER_NAME, + &cluster.image.app_version_label_value, + &rolegroup_ref.role, + &rolegroup_ref.role_group, + )) + .context(ObjectMetaSnafu)? + .build(), + ) + .add_data( + JVM_SECURITY_PROPERTIES_FILE, + to_java_properties_string(security_properties_data.iter()).with_context(|_| { + SerializePropertiesSnafu { + file: JVM_SECURITY_PROPERTIES_FILE.to_string(), + rolegroup: rolegroup_ref.clone(), + } + })?, + ) + .add_data( + ZOOKEEPER_PROPERTIES_FILE, + to_java_properties_string(zoo_cfg_data.iter()).with_context(|_| { + SerializePropertiesSnafu { + file: ZOOKEEPER_PROPERTIES_FILE.to_string(), + rolegroup: rolegroup_ref.clone(), + } + })?, + ); + + extend_role_group_config_map( + owner, + role.clone(), + rolegroup_ref, + &mut cm_builder, + &cluster.image.product_version, + ) + .context(InvalidLoggingConfigSnafu { + cm_name: rolegroup_ref.object_name(), + })?; + + cm_builder.build().context(BuildConfigMapSnafu { + rolegroup: rolegroup_ref.clone(), + }) +} + +/// Builds the `zoo.cfg` contents for a role group. +/// +/// Precedence (lowest to highest): +/// 1. `server.` quorum entries (precomputed in validate) +/// 2. operator-injected defaults (formerly `product-config` `properties.yaml`) +/// 3. TLS / quorum settings from [`ZookeeperSecurity`] +/// 4. user-set merged config (`initLimit` / `syncLimit` / `tickTime`) +/// 5. `configOverrides` for `zoo.cfg` +pub fn build_zoo_cfg( + cluster: &ValidatedCluster, + rolegroup_config: &ZookeeperRoleGroupConfig, +) -> BTreeMap { + let security = &cluster.cluster_config.zookeeper_security; + let config = &rolegroup_config.config; + + let mut zoo_cfg = cluster.cluster_config.server_addresses.clone(); + + // Operator-injected defaults (former properties.yaml recommended/default values + // and the `Configuration::compute_files` output). + zoo_cfg.insert("admin.serverPort".to_string(), "8080".to_string()); + zoo_cfg.insert( + ZookeeperSecurity::CLIENT_PORT_NAME.to_string(), + security.client_port().to_string(), + ); + zoo_cfg.insert( + ZookeeperConfig::DATA_DIR.to_string(), + STACKABLE_DATA_DIR.to_string(), + ); + zoo_cfg.insert(ZookeeperConfig::INIT_LIMIT.to_string(), "5".to_string()); + zoo_cfg.insert(ZookeeperConfig::SYNC_LIMIT.to_string(), "2".to_string()); + zoo_cfg.insert(ZookeeperConfig::TICK_TIME.to_string(), "3000".to_string()); + zoo_cfg.insert( + "metricsProvider.className".to_string(), + "org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider".to_string(), + ); + zoo_cfg.insert( + METRICS_PROVIDER_HTTP_PORT_KEY.to_string(), + METRICS_PROVIDER_HTTP_PORT.to_string(), + ); + + // TLS / quorum settings. + zoo_cfg.extend(security.config_settings()); + + // User-set merged config overrides the seeded defaults above. + if let Some(init_limit) = config.init_limit { + zoo_cfg.insert(ZookeeperConfig::INIT_LIMIT.to_string(), init_limit.to_string()); + } + if let Some(sync_limit) = config.sync_limit { + zoo_cfg.insert(ZookeeperConfig::SYNC_LIMIT.to_string(), sync_limit.to_string()); + } + if let Some(tick_time) = config.tick_time { + zoo_cfg.insert(ZookeeperConfig::TICK_TIME.to_string(), tick_time.to_string()); + } + + // configOverrides go last so they win. + apply_overrides( + &mut zoo_cfg, + rolegroup_config + .config_overrides + .get_key_value_overrides(ZOOKEEPER_PROPERTIES_FILE), + ); + + zoo_cfg +} + +/// Builds the `security.properties` contents for a role group. +pub fn build_security_properties( + rolegroup_config: &ZookeeperRoleGroupConfig, +) -> BTreeMap { + let mut security_properties = BTreeMap::new(); + + // Operator-injected defaults (former properties.yaml recommended values). + security_properties.insert("networkaddress.cache.ttl".to_string(), "5".to_string()); + security_properties.insert( + "networkaddress.cache.negative.ttl".to_string(), + "0".to_string(), + ); + + apply_overrides( + &mut security_properties, + rolegroup_config + .config_overrides + .get_key_value_overrides(JVM_SECURITY_PROPERTIES_FILE), + ); + + security_properties +} + +/// Resolves the metrics HTTP port for a role group, honoring a +/// `metricsProvider.httpPort` `configOverride` if present. +pub fn metrics_http_port( + cluster: &ValidatedCluster, + rolegroup_config: &ZookeeperRoleGroupConfig, +) -> u16 { + build_zoo_cfg(cluster, rolegroup_config) + .get(METRICS_PROVIDER_HTTP_PORT_KEY) + .and_then(|port| port.parse().ok()) + .unwrap_or(METRICS_PROVIDER_HTTP_PORT) +} + +/// Applies key-value overrides: `Some(value)` sets the key, `None` removes it. +fn apply_overrides(target: &mut BTreeMap, overrides: BTreeMap>) { + for (key, value) in overrides { + match value { + Some(value) => { + target.insert(key, value); + } + None => { + target.remove(&key); + } + } + } +} + +fn into_optional_values(map: BTreeMap) -> BTreeMap> { + map.into_iter().map(|(k, v)| (k, Some(v))).collect() +} diff --git a/rust/operator-binary/src/zk_controller/validate.rs b/rust/operator-binary/src/zk_controller/validate.rs index e58841f5..dd8234ec 100644 --- a/rust/operator-binary/src/zk_controller/validate.rs +++ b/rust/operator-binary/src/zk_controller/validate.rs @@ -1,24 +1,33 @@ //! The validate step in the ZookeeperCluster controller. //! -//! Synchronously validates inputs that don't require a Kubernetes client. Produces -//! [`ValidatedInputs`], consumed by the rest of `reconcile_zk`. +//! Synchronously validates and merges the cluster spec together with the +//! dereferenced inputs into a [`ValidatedCluster`], which is the single input +//! consumed by the build steps (e.g. the ConfigMap builder). After this step +//! the rest of `reconcile_zk` no longer needs to reach into the +//! [`v1alpha1::ZookeeperCluster`] for configuration (only for the owner +//! reference). -use product_config::{ProductConfigManager, types::PropertyNameKind}; -use snafu::{OptionExt, ResultExt, Snafu}; +use std::collections::BTreeMap; + +use snafu::{ResultExt, Snafu}; use stackable_operator::{ cli::OperatorEnvironmentOptions, commons::product_image_selection::{self, ResolvedProductImage}, - product_config_utils::{ - ValidatedRoleConfigByPropertyKind, transform_all_roles_to_config, - validate_all_roles_and_groups_config, - }, + config::fragment, + kube::ResourceExt, + role_utils::JavaCommonConfig, + utils::cluster_info::KubernetesClusterInfo, }; +use strum::IntoEnumIterator; use crate::{ crd::{ - CONTAINER_IMAGE_BASE_NAME, JVM_SECURITY_PROPERTIES_FILE, ZOOKEEPER_PROPERTIES_FILE, - ZookeeperRole, authentication, security::ZookeeperSecurity, v1alpha1, + CONTAINER_IMAGE_BASE_NAME, ZOOKEEPER_ELECTION_PORT, ZOOKEEPER_LEADER_PORT, ZookeeperRole, + authentication, + security::ZookeeperSecurity, + v1alpha1::{self, ZookeeperConfig, ZookeeperConfigOverrides}, }, + framework::role_utils::{self, with_validated_config}, zk_controller::dereference::DereferencedObjects, }; @@ -35,24 +44,49 @@ pub enum Error { #[snafu(display("object defines no server role"))] NoServerRole, - #[snafu(display("failed to generate product config"))] - GenerateProductConfig { - source: stackable_operator::product_config_utils::Error, + #[snafu(display("failed to retrieve role {role:?}"))] + MissingRole { + source: crate::crd::Error, + role: String, }, - #[snafu(display("invalid product config"))] - InvalidProductConfig { - source: stackable_operator::product_config_utils::Error, + #[snafu(display("failed to list expected pods"))] + ListPods { source: crate::crd::Error }, + + #[snafu(display("invalid config fragment for role group {role_group:?}"))] + InvalidConfigFragment { + source: fragment::ValidationError, + role_group: String, }, } type Result = std::result::Result; -/// Synchronous inputs the rest of `reconcile_zk` needs after dereferencing. -pub struct ValidatedInputs { - pub resolved_product_image: ResolvedProductImage, +/// A validated, merged view of a single ZooKeeper server role group. +pub type ZookeeperRoleGroupConfig = + role_utils::RoleGroupConfig; + +/// The validated [`v1alpha1::ZookeeperCluster`]. Output of the validate step and +/// the single input to the build steps. +pub struct ValidatedCluster { + /// The cluster name. Part of the `ValidatedCluster` contract (mirrors + /// trino-operator); consumed by the statefulset/service build steps that move + /// off the raw CRD in the follow-up PR. + #[allow(dead_code)] + pub name: String, + pub image: ResolvedProductImage, + pub cluster_config: ValidatedClusterConfig, + pub role_group_configs: BTreeMap>, +} + +/// Cluster-wide validated configuration that the build steps need without +/// reaching back into the [`v1alpha1::ZookeeperCluster`]. +pub struct ValidatedClusterConfig { pub zookeeper_security: ZookeeperSecurity, - pub validated_role_config: ValidatedRoleConfigByPropertyKind, + + /// The `server.` entries for `zoo.cfg`, precomputed from the expected + /// pods so the ConfigMap builder does not need the cluster object. + pub server_addresses: BTreeMap, } /// Validates the cluster spec and the dereferenced inputs. @@ -60,9 +94,9 @@ pub fn validate( zk: &v1alpha1::ZookeeperCluster, dereferenced_objects: &DereferencedObjects, operator_environment: &OperatorEnvironmentOptions, - product_config: &ProductConfigManager, -) -> Result { - let resolved_product_image = zk + cluster_info: &KubernetesClusterInfo, +) -> Result { + let image = zk .spec .image .resolve( @@ -79,46 +113,61 @@ pub fn validate( let zookeeper_security = ZookeeperSecurity::new(zk, resolved_authentication_classes); - let validated_role_config = - validated_product_config(zk, &resolved_product_image.product_version, product_config)?; - - Ok(ValidatedInputs { - resolved_product_image, - zookeeper_security, - validated_role_config, + let server_addresses = server_addresses(zk, &zookeeper_security, cluster_info)?; + + let mut role_group_configs = BTreeMap::new(); + for zk_role in ZookeeperRole::iter() { + let role = zk.role(&zk_role).with_context(|_| MissingRoleSnafu { + role: zk_role.to_string(), + })?; + let default_config = ZookeeperConfig::default_server_config(&zk.name_any(), &zk_role); + + let mut groups = BTreeMap::new(); + for (rg_name, rg) in &role.role_groups { + let validated_rg = with_validated_config::< + ZookeeperConfig, + JavaCommonConfig, + v1alpha1::ZookeeperConfigFragment, + _, + ZookeeperConfigOverrides, + >(rg, role, &default_config) + .with_context(|_| InvalidConfigFragmentSnafu { + role_group: rg_name.clone(), + })?; + groups.insert(rg_name.clone(), validated_rg); + } + role_group_configs.insert(zk_role, groups); + } + + Ok(ValidatedCluster { + name: zk.name_any(), + image, + cluster_config: ValidatedClusterConfig { + zookeeper_security, + server_addresses, + }, + role_group_configs, }) } -fn validated_product_config( +/// Builds the `server.` quorum entries for `zoo.cfg` from the expected pods. +fn server_addresses( zk: &v1alpha1::ZookeeperCluster, - product_version: &str, - product_config: &ProductConfigManager, -) -> Result { - let server_role = zk.spec.servers.clone().context(NoServerRoleSnafu)?; - - let role_config = transform_all_roles_to_config( - zk, - &[( - ZookeeperRole::Server.to_string(), + zookeeper_security: &ZookeeperSecurity, + cluster_info: &KubernetesClusterInfo, +) -> Result> { + Ok(zk + .pods() + .context(ListPodsSnafu)? + .map(|pod| { ( - vec![ - PropertyNameKind::Env, - PropertyNameKind::File(ZOOKEEPER_PROPERTIES_FILE.to_string()), - PropertyNameKind::File(JVM_SECURITY_PROPERTIES_FILE.to_string()), - ], - server_role, - ), - )] - .into(), - ) - .context(GenerateProductConfigSnafu)?; - - validate_all_roles_and_groups_config( - product_version, - &role_config, - product_config, - false, - false, - ) - .context(InvalidProductConfigSnafu) + format!("server.{id}", id = pod.zookeeper_myid), + format!( + "{internal_fqdn}:{ZOOKEEPER_LEADER_PORT}:{ZOOKEEPER_ELECTION_PORT};{client_port}", + internal_fqdn = pod.internal_fqdn(cluster_info), + client_port = zookeeper_security.client_port() + ), + ) + }) + .collect()) } From 6a1f7774f5c40484bc635b64a07882bf4cceacfb Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 18:31:38 +0200 Subject: [PATCH 05/16] chore: Empty out config-spec/properties.yaml product-config no longer reads this file, but it is kept (empty) because the build/packaging process still expects it (it is COPYd into the operator image). Mirrors trino-operator. To be removed entirely in a later cleanup. Co-Authored-By: Claude Opus 4.8 (1M context) --- deploy/config-spec/properties.yaml | 440 +---------------------------- 1 file changed, 3 insertions(+), 437 deletions(-) diff --git a/deploy/config-spec/properties.yaml b/deploy/config-spec/properties.yaml index 7b7de333..9bd8c3b2 100644 --- a/deploy/config-spec/properties.yaml +++ b/deploy/config-spec/properties.yaml @@ -1,439 +1,5 @@ +--- version: 0.1.0 spec: - units: - - unit: &unitDirectory - name: "directory" - regex: "^/|(/[\\w-]+)+$" - examples: - - "/tmp/xyz" - - unit: &unitPort - name: "port" - regex: "^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$" - -properties: - - property: &jvmDnsCacheTtl - propertyNames: - - name: "networkaddress.cache.ttl" - kind: - type: "file" - file: "security.properties" - datatype: - type: "integer" - min: "0" - recommendedValues: - - fromVersion: "0.0.0" - value: "5" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "TTL for successfully resolved domain names." - description: "TTL for successfully resolved domain names." - - - property: &jvmDnsCacheNegativeTtl - propertyNames: - - name: "networkaddress.cache.negative.ttl" - kind: - type: "file" - file: "security.properties" - datatype: - type: "integer" - min: "0" - recommendedValues: - - fromVersion: "0.0.0" - value: "0" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "TTL for domain names that cannot be resolved." - description: "TTL for domain names that cannot be resolved." - - - property: &tickTime - propertyNames: - - name: "tickTime" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - min: "1" - recommendedValues: - - fromVersion: "0.0.0" - value: "3000" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "ZK only checks whether the value is 0, all other values (including negative ones) are considered valid, we disallow negative values here, see QuorumPeerConfig.java" - description: "The basic time unit in milliseconds used by ZooKeeper. It is used to do heartbeats and the minimum session timeout will be twice the tickTime." - - - property: &dataDir - propertyNames: - - name: "dataDir" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/tmp/zookeeper" - recommendedValues: - - value: "/stackable/data" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "See QuorumPeerConfig.java" - description: "The location where ZooKeeper will store the in-memory database snapshots and, unless specified otherwise, the transaction log of updates to the database. Note: Be careful where you put the transaction log. A dedicated transaction log device is key to consistent good performance. Putting the log on a busy device will adversely affect performance." - - # Role required "true" is only correct if more than one zookeeper instances is used. - - property: &initLimit - propertyNames: - - name: "initLimit" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - min: "1" - recommendedValues: - - value: "5" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "ZK only checks whether the value is 0, all other values (including negative ones) are considered valid, we disallow negative values here, see QuorumPeerConfig.java" - description: "Amount of time, in ticks (see `tickTime`), to allow followers to connect and sync to a leader. Increased this value as needed, if the amount of data managed by ZooKeeper is large." - - # Role required "true" is only correct if more than one zookeeper instances is used. - - property: &syncLimit - propertyNames: - - name: "syncLimit" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - min: "1" - recommendedValues: - - value: "2" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "ZK only checks whether the value is 0, all other values (including negative ones) are considered valid, we disallow negative values here, see QuorumPeerConfig.java" - description: "Amount of time, in ticks (see `tickTime`), to allow followers to sync with ZooKeeper. If followers fall too far behind a leader, they will be dropped. In other words: The number of ticks that can pass between sending a request and getting an acknowledgment before a follower is dropped." - - ########################## - # Ports - ########################## - - property: &clientPort - propertyNames: - - name: "clientPort" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - unit: *unitPort - min: "1024" - max: "65535" - defaultValues: - - value: "2181" - roles: - - name: "server" - required: false - asOfVersion: "0.0.0" - description: "The plaintext port to listen on for client connections." - - - property: &secureClientPort - propertyNames: - - name: "secureClientPort" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - unit: *unitPort - min: "1024" - max: "65535" - roles: - - name: "server" - required: false - asOfVersion: "0.0.0" - description: "The secure port to listen on for secure client connections using TLS/SSL." - - - property: &adminServerPort - propertyNames: - - name: "admin.serverPort" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - unit: *unitPort - min: "1024" - max: "65535" - defaultValues: - - value: "8080" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - description: "The port the embedded Jetty server listens on." - - ########################## - # Quorum TLS - ########################## - - property: &sslQuorum - propertyNames: - - name: "sslQuorum" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "bool" - defaultValues: - - value: "false" - recommendedValues: - - value: "true" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Enables encrypted quorum communication." - - - property: &sslQuorumClientAuth - propertyNames: - - name: "ssl.quorum.clientAuth" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - allowedValues: - - "none" - - "want" - - "need" - defaultValues: - - value: "need" - recommendedValues: - - value: "need" - roles: - - name: "server" - required: false - asOfVersion: "3.5.7" - description: "Specifies options to authenticate ssl connections from other quorum members." - - - property: &sslQuorumHostNameVerification - propertyNames: - - name: "ssl.quorum.hostnameVerification" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "bool" - recommendedValues: - - value: "true" - roles: - - name: "server" - required: false - asOfVersion: "3.5.7" - description: "Specifies whether the hostname verification is enabled in quorum TLS negotiation process. Disabling it only recommended for testing purposes." - - - property: &sslQuorumKeyStoreLocation - propertyNames: - - name: "ssl.quorum.keyStore.location" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/stackable/tls/quorum" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Specifies the file path to a Java keystore containing the local credentials to be used for quorum TLS connections." - - - property: &sslQuorumKeyStorePassword - propertyNames: - - name: "ssl.quorum.keyStore.password" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "The password to unlock the quorum keystore." - - - property: &sslQuorumTrustStoreLocation - propertyNames: - - name: "ssl.quorum.trustStore.location" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/stackable/tls/quorum" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Specifies the file path to a Java truststore containing the local credentials to be used for quorum TLS connections." - - - property: &sslQuorumTrustStorePassword - propertyNames: - - name: "ssl.quorum.trustStore.password" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "The password to unlock the quorum truststore." - - ########################## - # Client TLS - ########################## - - property: &sslClientAuth - propertyNames: - - name: "ssl.clientAuth" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - allowedValues: - - "none" - - "want" - - "need" - defaultValues: - - value: "need" - recommendedValues: - - value: "need" - roles: - - name: "server" - required: false - asOfVersion: "3.5.7" - description: "Specifies options to authenticate ssl connections from clients." - - - property: &sslHostNameVerification - propertyNames: - - name: "ssl.hostnameVerification" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "bool" - recommendedValues: - - value: "true" - roles: - - name: "server" - required: false - asOfVersion: "3.5.7" - description: "Specifies whether the hostname verification is enabled in client TLS negotiation process. Disabling it only recommended for testing purposes." - - - property: &sslKeyStoreLocation - propertyNames: - - name: "ssl.keyStore.location" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/stackable/tls/client" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Specifies the file path to a Java keystore containing the local credentials to be used for client TLS connections." - - - property: &sslKeyStorePassword - propertyNames: - - name: "ssl.keyStore.password" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "The password to unlock the client keystore." - - - property: &sslTrustStoreLocation - propertyNames: - - name: "ssl.trustStore.location" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/stackable/tls/client" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Specifies the file path to a Java truststore containing the remote credentials to be used for client TLS connections." - - - property: &sslTrustStorePassword - propertyNames: - - name: "ssl.trustStore.password" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "The password to unlock the client truststore." - ########################## - # Common TLS - ########################## - - property: &authProviderX509 - propertyNames: - - name: "authProvider.x509" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "0.0.0" - description: "Used for secure client authentication." - - - property: &serverCnxnFactory - propertyNames: - - name: "serverCnxnFactory" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "0.0.0" - description: "This should be set to NettyServerCnxnFactory in order to use TLS based server communication." + units: [] +properties: [] From c2a2bab713c250d276cfd122c60e1d8e8c496da7 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 18:32:59 +0200 Subject: [PATCH 06/16] docs: remove product config references from cli & env --- .../reference/commandline-parameters.adoc | 13 ---------- .../reference/environment-variables.adoc | 26 ------------------- 2 files changed, 39 deletions(-) diff --git a/docs/modules/zookeeper/pages/reference/commandline-parameters.adoc b/docs/modules/zookeeper/pages/reference/commandline-parameters.adoc index c0f4323b..4e27f328 100644 --- a/docs/modules/zookeeper/pages/reference/commandline-parameters.adoc +++ b/docs/modules/zookeeper/pages/reference/commandline-parameters.adoc @@ -2,19 +2,6 @@ This operator accepts the following command line parameters: -== product-config - -*Default value*: `/etc/stackable/zookeeper-operator/config-spec/properties.yaml` - -*Required*: false - -*Multiple values:* false - -[source] ----- -cargo run -- run --product-config /foo/bar/properties.yaml ----- - == watch-namespace *Default value*: All namespaces diff --git a/docs/modules/zookeeper/pages/reference/environment-variables.adoc b/docs/modules/zookeeper/pages/reference/environment-variables.adoc index 282d63d9..c36ec4ac 100644 --- a/docs/modules/zookeeper/pages/reference/environment-variables.adoc +++ b/docs/modules/zookeeper/pages/reference/environment-variables.adoc @@ -33,32 +33,6 @@ docker run \ oci.stackable.tech/sdp/zookeeper-operator:0.0.0-dev ---- -== PRODUCT_CONFIG - -*Default value*: `/etc/stackable/zookeeper-operator/config-spec/properties.yaml` - -*Required*: false - -*Multiple values*: false - -[source] ----- -export PRODUCT_CONFIG=/foo/bar/properties.yaml -cargo run -- run ----- - -or via docker: - ----- -docker run \ - --name zookeeper-operator \ - --network host \ - --env KUBECONFIG=/home/stackable/.kube/config \ - --env PRODUCT_CONFIG=/my/product/config.yaml \ - --mount type=bind,source="$HOME/.kube/config",target="/home/stackable/.kube/config" \ - oci.stackable.tech/sdp/zookeeper-operator:0.0.0-dev ----- - == WATCH_NAMESPACE *Default value*: All namespaces From b8d6046b149d76b8cf386ce55b72bd42f88c2af8 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 18:51:13 +0200 Subject: [PATCH 07/16] refactor: Split config_map into per-file property builders Restructure zk_controller/build to mirror trino-operator and hdfs-operator: - build/properties/mod.rs holds the ConfigFileName enum and shared helpers (apply_overrides, into_optional_values). - build/properties/zoo_cfg.rs and security_properties.rs each render one file; metrics_http_port moves alongside the zoo.cfg builder. - build/properties/logging.rs takes over the logback/log4j and vector.yaml rendering, replacing the top-level product_logging.rs module (now removed). - build/config_map.rs becomes a thin orchestrator that assembles the data map via ConfigFileName and the property/logging builders, then .data(data).build(). Pure restructuring: no behavior change. The generated CRD is unchanged and all 16 unit tests (which render the full ConfigMap) still pass. Co-Authored-By: Claude Opus 4.8 (1M context) --- rust/operator-binary/src/main.rs | 1 - rust/operator-binary/src/zk_controller.rs | 3 +- .../src/zk_controller/build.rs | 1 + .../src/zk_controller/build/config_map.rs | 235 +++++------------- .../build/properties/logging.rs} | 55 ++-- .../src/zk_controller/build/properties/mod.rs | 47 ++++ .../build/properties/security_properties.rs | 43 ++++ .../zk_controller/build/properties/zoo_cfg.rs | 125 ++++++++++ 8 files changed, 312 insertions(+), 198 deletions(-) rename rust/operator-binary/src/{product_logging.rs => zk_controller/build/properties/logging.rs} (64%) create mode 100644 rust/operator-binary/src/zk_controller/build/properties/mod.rs create mode 100644 rust/operator-binary/src/zk_controller/build/properties/security_properties.rs create mode 100644 rust/operator-binary/src/zk_controller/build/properties/zoo_cfg.rs diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index 2259d398..96764b77 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -46,7 +46,6 @@ mod discovery; mod framework; mod listener; mod operations; -mod product_logging; mod service; mod utils; mod webhooks; diff --git a/rust/operator-binary/src/zk_controller.rs b/rust/operator-binary/src/zk_controller.rs index 3ed08e64..173d679b 100644 --- a/rust/operator-binary/src/zk_controller.rs +++ b/rust/operator-binary/src/zk_controller.rs @@ -358,7 +358,8 @@ pub async fn reconcile_zk( for (rolegroup_name, rolegroup_config) in server_role_group_configs { let rolegroup = zk.server_rolegroup_ref(rolegroup_name); let merged_config = &rolegroup_config.config; - let metrics_port = build::config_map::metrics_http_port(&validated_cluster, rolegroup_config); + let metrics_port = + build::properties::zoo_cfg::metrics_http_port(&validated_cluster, rolegroup_config); let rg_headless_service = build_server_rolegroup_headless_service(zk, &rolegroup, resolved_product_image) diff --git a/rust/operator-binary/src/zk_controller/build.rs b/rust/operator-binary/src/zk_controller/build.rs index 34ae61d7..71528b85 100644 --- a/rust/operator-binary/src/zk_controller/build.rs +++ b/rust/operator-binary/src/zk_controller/build.rs @@ -6,3 +6,4 @@ //! configuration. pub mod config_map; +pub mod properties; diff --git a/rust/operator-binary/src/zk_controller/build/config_map.rs b/rust/operator-binary/src/zk_controller/build/config_map.rs index 2ebb3f4e..f7a06bbd 100644 --- a/rust/operator-binary/src/zk_controller/build/config_map.rs +++ b/rust/operator-binary/src/zk_controller/build/config_map.rs @@ -1,37 +1,28 @@ -//! Builds the rolegroup `ConfigMap` (`zoo.cfg` + `security.properties`) from the -//! [`ValidatedCluster`], without reaching into the -//! [`v1alpha1::ZookeeperCluster`] except for the owner reference and metadata. +//! Assembles the per-rolegroup `ConfigMap` from the [`ValidatedCluster`], +//! without reaching into the [`v1alpha1::ZookeeperCluster`] except for the owner +//! reference and object metadata. //! -//! The operator-injected defaults seeded here used to live in -//! `deploy/config-spec/properties.yaml` and were injected by the `product-config` -//! crate during validation. They are reproduced here so the rendered config is -//! byte-identical to the previous implementation. +//! The individual files are rendered by the [`properties`](super::properties) +//! submodules; this module only orchestrates them into the ConfigMap. use std::collections::BTreeMap; use snafu::{ResultExt, Snafu}; use stackable_operator::{ - builder::{ - configmap::ConfigMapBuilder, - meta::ObjectMetaBuilder, - }, - config_overrides::KeyValueOverridesProvider, + builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder}, k8s_openapi::api::core::v1::ConfigMap, role_utils::RoleGroupRef, }; use crate::{ - crd::{ - JVM_SECURITY_PROPERTIES_FILE, METRICS_PROVIDER_HTTP_PORT, METRICS_PROVIDER_HTTP_PORT_KEY, - STACKABLE_DATA_DIR, ZOOKEEPER_PROPERTIES_FILE, ZookeeperRole, - security::ZookeeperSecurity, - v1alpha1::{self, ZookeeperConfig}, - }, + crd::{ZookeeperRole, v1alpha1}, framework::writer::{PropertiesWriterError, to_java_properties_string}, - product_logging::extend_role_group_config_map, utils::build_recommended_labels, zk_controller::{ ZK_CONTROLLER_NAME, + build::properties::{ + ConfigFileName, into_optional_values, logging, security_properties, zoo_cfg, + }, validate::{ValidatedCluster, ZookeeperRoleGroupConfig}, }, }; @@ -57,7 +48,7 @@ pub enum Error { #[snafu(display("failed to add the logging configuration to the ConfigMap [{cm_name}]"))] InvalidLoggingConfig { - source: crate::product_logging::Error, + source: logging::Error, cm_name: String, }, @@ -81,14 +72,42 @@ pub fn build_server_rolegroup_config_map( rolegroup_config: &ZookeeperRoleGroupConfig, owner: &v1alpha1::ZookeeperCluster, ) -> Result { - let zoo_cfg = build_zoo_cfg(cluster, rolegroup_config); - let security_properties = build_security_properties(rolegroup_config); + let mut data: BTreeMap = BTreeMap::new(); + + // zoo.cfg + data.insert( + ConfigFileName::ZooCfg.to_string(), + render( + ConfigFileName::ZooCfg, + zoo_cfg::build(cluster, rolegroup_config), + rolegroup_ref, + )?, + ); - let zoo_cfg_data = into_optional_values(zoo_cfg); - let security_properties_data = into_optional_values(security_properties); + // security.properties + data.insert( + ConfigFileName::SecurityProperties.to_string(), + render( + ConfigFileName::SecurityProperties, + security_properties::build(rolegroup_config), + rolegroup_ref, + )?, + ); - let mut cm_builder = ConfigMapBuilder::new(); - cm_builder + // logback.xml / log4j.properties and vector.yaml + data.extend( + logging::build( + owner, + role.clone(), + rolegroup_ref, + &cluster.image.product_version, + ) + .context(InvalidLoggingConfigSnafu { + cm_name: rolegroup_ref.object_name(), + })?, + ); + + ConfigMapBuilder::new() .metadata( ObjectMetaBuilder::new() .name_and_namespace(owner) @@ -105,155 +124,23 @@ pub fn build_server_rolegroup_config_map( .context(ObjectMetaSnafu)? .build(), ) - .add_data( - JVM_SECURITY_PROPERTIES_FILE, - to_java_properties_string(security_properties_data.iter()).with_context(|_| { - SerializePropertiesSnafu { - file: JVM_SECURITY_PROPERTIES_FILE.to_string(), - rolegroup: rolegroup_ref.clone(), - } - })?, - ) - .add_data( - ZOOKEEPER_PROPERTIES_FILE, - to_java_properties_string(zoo_cfg_data.iter()).with_context(|_| { - SerializePropertiesSnafu { - file: ZOOKEEPER_PROPERTIES_FILE.to_string(), - rolegroup: rolegroup_ref.clone(), - } - })?, - ); - - extend_role_group_config_map( - owner, - role.clone(), - rolegroup_ref, - &mut cm_builder, - &cluster.image.product_version, - ) - .context(InvalidLoggingConfigSnafu { - cm_name: rolegroup_ref.object_name(), - })?; - - cm_builder.build().context(BuildConfigMapSnafu { - rolegroup: rolegroup_ref.clone(), - }) + .data(data) + .build() + .context(BuildConfigMapSnafu { + rolegroup: rolegroup_ref.clone(), + }) } -/// Builds the `zoo.cfg` contents for a role group. -/// -/// Precedence (lowest to highest): -/// 1. `server.` quorum entries (precomputed in validate) -/// 2. operator-injected defaults (formerly `product-config` `properties.yaml`) -/// 3. TLS / quorum settings from [`ZookeeperSecurity`] -/// 4. user-set merged config (`initLimit` / `syncLimit` / `tickTime`) -/// 5. `configOverrides` for `zoo.cfg` -pub fn build_zoo_cfg( - cluster: &ValidatedCluster, - rolegroup_config: &ZookeeperRoleGroupConfig, -) -> BTreeMap { - let security = &cluster.cluster_config.zookeeper_security; - let config = &rolegroup_config.config; - - let mut zoo_cfg = cluster.cluster_config.server_addresses.clone(); - - // Operator-injected defaults (former properties.yaml recommended/default values - // and the `Configuration::compute_files` output). - zoo_cfg.insert("admin.serverPort".to_string(), "8080".to_string()); - zoo_cfg.insert( - ZookeeperSecurity::CLIENT_PORT_NAME.to_string(), - security.client_port().to_string(), - ); - zoo_cfg.insert( - ZookeeperConfig::DATA_DIR.to_string(), - STACKABLE_DATA_DIR.to_string(), - ); - zoo_cfg.insert(ZookeeperConfig::INIT_LIMIT.to_string(), "5".to_string()); - zoo_cfg.insert(ZookeeperConfig::SYNC_LIMIT.to_string(), "2".to_string()); - zoo_cfg.insert(ZookeeperConfig::TICK_TIME.to_string(), "3000".to_string()); - zoo_cfg.insert( - "metricsProvider.className".to_string(), - "org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider".to_string(), - ); - zoo_cfg.insert( - METRICS_PROVIDER_HTTP_PORT_KEY.to_string(), - METRICS_PROVIDER_HTTP_PORT.to_string(), - ); - - // TLS / quorum settings. - zoo_cfg.extend(security.config_settings()); - - // User-set merged config overrides the seeded defaults above. - if let Some(init_limit) = config.init_limit { - zoo_cfg.insert(ZookeeperConfig::INIT_LIMIT.to_string(), init_limit.to_string()); - } - if let Some(sync_limit) = config.sync_limit { - zoo_cfg.insert(ZookeeperConfig::SYNC_LIMIT.to_string(), sync_limit.to_string()); - } - if let Some(tick_time) = config.tick_time { - zoo_cfg.insert(ZookeeperConfig::TICK_TIME.to_string(), tick_time.to_string()); - } - - // configOverrides go last so they win. - apply_overrides( - &mut zoo_cfg, - rolegroup_config - .config_overrides - .get_key_value_overrides(ZOOKEEPER_PROPERTIES_FILE), - ); - - zoo_cfg -} - -/// Builds the `security.properties` contents for a role group. -pub fn build_security_properties( - rolegroup_config: &ZookeeperRoleGroupConfig, -) -> BTreeMap { - let mut security_properties = BTreeMap::new(); - - // Operator-injected defaults (former properties.yaml recommended values). - security_properties.insert("networkaddress.cache.ttl".to_string(), "5".to_string()); - security_properties.insert( - "networkaddress.cache.negative.ttl".to_string(), - "0".to_string(), - ); - - apply_overrides( - &mut security_properties, - rolegroup_config - .config_overrides - .get_key_value_overrides(JVM_SECURITY_PROPERTIES_FILE), - ); - - security_properties -} - -/// Resolves the metrics HTTP port for a role group, honoring a -/// `metricsProvider.httpPort` `configOverride` if present. -pub fn metrics_http_port( - cluster: &ValidatedCluster, - rolegroup_config: &ZookeeperRoleGroupConfig, -) -> u16 { - build_zoo_cfg(cluster, rolegroup_config) - .get(METRICS_PROVIDER_HTTP_PORT_KEY) - .and_then(|port| port.parse().ok()) - .unwrap_or(METRICS_PROVIDER_HTTP_PORT) -} - -/// Applies key-value overrides: `Some(value)` sets the key, `None` removes it. -fn apply_overrides(target: &mut BTreeMap, overrides: BTreeMap>) { - for (key, value) in overrides { - match value { - Some(value) => { - target.insert(key, value); - } - None => { - target.remove(&key); - } +/// Serializes a property map to its Java-properties on-wire representation. +fn render( + file: ConfigFileName, + properties: BTreeMap, + rolegroup_ref: &RoleGroupRef, +) -> Result { + to_java_properties_string(into_optional_values(properties).iter()).with_context(|_| { + SerializePropertiesSnafu { + file: file.to_string(), + rolegroup: rolegroup_ref.clone(), } - } -} - -fn into_optional_values(map: BTreeMap) -> BTreeMap> { - map.into_iter().map(|(k, v)| (k, Some(v))).collect() + }) } diff --git a/rust/operator-binary/src/product_logging.rs b/rust/operator-binary/src/zk_controller/build/properties/logging.rs similarity index 64% rename from rust/operator-binary/src/product_logging.rs rename to rust/operator-binary/src/zk_controller/build/properties/logging.rs index a9e54346..16c8567e 100644 --- a/rust/operator-binary/src/product_logging.rs +++ b/rust/operator-binary/src/zk_controller/build/properties/logging.rs @@ -1,6 +1,15 @@ +//! Builders for the logging-related files in the rolegroup ConfigMap: the +//! product log config (`logback.xml` / `log4j.properties`) and the Vector agent +//! config (`vector.yaml`). +//! +//! Moved from the former top-level `product_logging` module so that all ConfigMap +//! contributions live under `zk_controller/build` (mirrors trino-operator and +//! hdfs-operator). + +use std::collections::BTreeMap; + use snafu::{ResultExt, Snafu}; use stackable_operator::{ - builder::configmap::ConfigMapBuilder, memory::BinaryMultiple, product_logging::{ self, @@ -24,14 +33,16 @@ type Result = std::result::Result; const CONSOLE_CONVERSION_PATTERN: &str = "%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n"; -/// Extend the role group ConfigMap with logging and Vector configurations -pub fn extend_role_group_config_map( +/// Builds the logging-related ConfigMap entries (product log config and the +/// Vector agent config) for a role group. +pub fn build( zk: &v1alpha1::ZookeeperCluster, role: ZookeeperRole, rolegroup: &RoleGroupRef, - cm_builder: &mut ConfigMapBuilder, product_version: &str, -) -> Result<()> { +) -> Result> { + let mut data = BTreeMap::new(); + let logging = zk .logging(&role, rolegroup) .context(CrdValidationFailureSnafu)?; @@ -40,32 +51,32 @@ pub fn extend_role_group_config_map( choice: Some(ContainerLogConfigChoice::Automatic(log_config)), }) = logging.containers.get(&v1alpha1::Container::Zookeeper) { + let log_dir = format!("{STACKABLE_LOG_DIR}/zookeeper"); + let max_log_file_size_mib = MAX_ZK_LOG_FILES_SIZE + .scale_to(BinaryMultiple::Mebi) + .floor() + .value as u32; + match zk.logging_framework(product_version) { LoggingFramework::LOG4J => { - cm_builder.add_data( - LOG4J_CONFIG_FILE, + data.insert( + LOG4J_CONFIG_FILE.to_string(), product_logging::framework::create_log4j_config( - &format!("{STACKABLE_LOG_DIR}/zookeeper"), + &log_dir, ZOOKEEPER_LOG_FILE, - MAX_ZK_LOG_FILES_SIZE - .scale_to(BinaryMultiple::Mebi) - .floor() - .value as u32, + max_log_file_size_mib, CONSOLE_CONVERSION_PATTERN, log_config, ), ); } LoggingFramework::LOGBACK => { - cm_builder.add_data( - LOGBACK_CONFIG_FILE, + data.insert( + LOGBACK_CONFIG_FILE.to_string(), product_logging::framework::create_logback_config( - &format!("{STACKABLE_LOG_DIR}/zookeeper"), + &log_dir, ZOOKEEPER_LOG_FILE, - MAX_ZK_LOG_FILES_SIZE - .scale_to(BinaryMultiple::Mebi) - .floor() - .value as u32, + max_log_file_size_mib, CONSOLE_CONVERSION_PATTERN, log_config, None, @@ -85,11 +96,11 @@ pub fn extend_role_group_config_map( }; if logging.enable_vector_agent { - cm_builder.add_data( - product_logging::framework::VECTOR_CONFIG_FILE, + data.insert( + product_logging::framework::VECTOR_CONFIG_FILE.to_string(), product_logging::framework::create_vector_config(rolegroup, vector_log_config), ); } - Ok(()) + Ok(data) } diff --git a/rust/operator-binary/src/zk_controller/build/properties/mod.rs b/rust/operator-binary/src/zk_controller/build/properties/mod.rs new file mode 100644 index 00000000..8c9ed824 --- /dev/null +++ b/rust/operator-binary/src/zk_controller/build/properties/mod.rs @@ -0,0 +1,47 @@ +//! Per-file builders for the ZooKeeper config files. +//! +//! Each submodule renders the key/value pairs (or file contents) for one file +//! that ends up in the rolegroup ConfigMap. The shared +//! [`writer`](crate::framework::writer) module serializes property maps to the +//! Java-properties on-wire format. + +use std::collections::BTreeMap; + +pub mod logging; +pub mod security_properties; +pub mod zoo_cfg; + +/// The names of the config files assembled into the rolegroup ConfigMap. +#[derive(Clone, Copy, Debug, strum::Display)] +pub enum ConfigFileName { + #[strum(serialize = "zoo.cfg")] + ZooCfg, + #[strum(serialize = "security.properties")] + SecurityProperties, +} + +/// Applies user-provided key-value overrides to a property map: `Some(value)` +/// sets the key, `None` removes it. +pub(crate) fn apply_overrides( + target: &mut BTreeMap, + overrides: BTreeMap>, +) { + for (key, value) in overrides { + match value { + Some(value) => { + target.insert(key, value); + } + None => { + target.remove(&key); + } + } + } +} + +/// Converts a `key -> value` map into the `key -> Some(value)` shape expected by +/// [`to_java_properties_string`](crate::framework::writer::to_java_properties_string). +pub(crate) fn into_optional_values( + map: BTreeMap, +) -> BTreeMap> { + map.into_iter().map(|(k, v)| (k, Some(v))).collect() +} diff --git a/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs b/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs new file mode 100644 index 00000000..c7109548 --- /dev/null +++ b/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs @@ -0,0 +1,43 @@ +//! Builder for `security.properties` (ZooKeeper's JVM security properties file). + +use std::collections::BTreeMap; + +use stackable_operator::config_overrides::KeyValueOverridesProvider; + +use crate::{crd::JVM_SECURITY_PROPERTIES_FILE, zk_controller::validate::ZookeeperRoleGroupConfig}; + +use super::apply_overrides; + +const NETWORKADDRESS_CACHE_TTL: &str = "networkaddress.cache.ttl"; +const NETWORKADDRESS_CACHE_NEGATIVE_TTL: &str = "networkaddress.cache.negative.ttl"; + +const DEFAULT_NETWORKADDRESS_CACHE_TTL: &str = "5"; +const DEFAULT_NETWORKADDRESS_CACHE_NEGATIVE_TTL: &str = "0"; + +/// Builds the `security.properties` key/value pairs for a role group. +/// +/// The entire file is operator-injected (the values formerly came from +/// `product-config`'s `properties.yaml`), plus any user `configOverrides`. +pub fn build(rolegroup_config: &ZookeeperRoleGroupConfig) -> BTreeMap { + let mut security_properties = BTreeMap::new(); + + // Operator-injected defaults (former properties.yaml recommended values). + security_properties.insert( + NETWORKADDRESS_CACHE_TTL.to_string(), + DEFAULT_NETWORKADDRESS_CACHE_TTL.to_string(), + ); + security_properties.insert( + NETWORKADDRESS_CACHE_NEGATIVE_TTL.to_string(), + DEFAULT_NETWORKADDRESS_CACHE_NEGATIVE_TTL.to_string(), + ); + + // configOverrides go last so they win. + apply_overrides( + &mut security_properties, + rolegroup_config + .config_overrides + .get_key_value_overrides(JVM_SECURITY_PROPERTIES_FILE), + ); + + security_properties +} diff --git a/rust/operator-binary/src/zk_controller/build/properties/zoo_cfg.rs b/rust/operator-binary/src/zk_controller/build/properties/zoo_cfg.rs new file mode 100644 index 00000000..00596ad1 --- /dev/null +++ b/rust/operator-binary/src/zk_controller/build/properties/zoo_cfg.rs @@ -0,0 +1,125 @@ +//! Builder for `zoo.cfg` (the main ZooKeeper properties file). +//! +//! The operator-injected defaults seeded here used to live in +//! `deploy/config-spec/properties.yaml` and were injected by the `product-config` +//! crate during validation. They are reproduced here so the rendered config is +//! byte-identical to the previous implementation. + +use std::collections::BTreeMap; + +use stackable_operator::config_overrides::KeyValueOverridesProvider; + +use crate::{ + crd::{ + METRICS_PROVIDER_HTTP_PORT, METRICS_PROVIDER_HTTP_PORT_KEY, STACKABLE_DATA_DIR, + ZOOKEEPER_PROPERTIES_FILE, security::ZookeeperSecurity, v1alpha1::ZookeeperConfig, + }, + zk_controller::validate::{ValidatedCluster, ZookeeperRoleGroupConfig}, +}; + +use super::apply_overrides; + +const ADMIN_SERVER_PORT_KEY: &str = "admin.serverPort"; +const DEFAULT_ADMIN_SERVER_PORT: &str = "8080"; +const METRICS_PROVIDER_CLASS_NAME_KEY: &str = "metricsProvider.className"; +const PROMETHEUS_METRICS_PROVIDER: &str = + "org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider"; +const DEFAULT_INIT_LIMIT: &str = "5"; +const DEFAULT_SYNC_LIMIT: &str = "2"; +const DEFAULT_TICK_TIME: &str = "3000"; + +/// Builds the `zoo.cfg` key/value pairs for a role group. +/// +/// Precedence (lowest to highest): +/// 1. `server.` quorum entries (precomputed in validate) +/// 2. operator-injected defaults (formerly `product-config` `properties.yaml`) +/// 3. TLS / quorum settings from [`ZookeeperSecurity`] +/// 4. user-set merged config (`initLimit` / `syncLimit` / `tickTime`) +/// 5. `configOverrides` for `zoo.cfg` +pub fn build( + cluster: &ValidatedCluster, + rolegroup_config: &ZookeeperRoleGroupConfig, +) -> BTreeMap { + let security = &cluster.cluster_config.zookeeper_security; + let config = &rolegroup_config.config; + + // 1. server. quorum entries. + let mut zoo_cfg = cluster.cluster_config.server_addresses.clone(); + + // 2. Operator-injected defaults (former properties.yaml recommended/default + // values and the `Configuration::compute_files` output). + zoo_cfg.insert( + ADMIN_SERVER_PORT_KEY.to_string(), + DEFAULT_ADMIN_SERVER_PORT.to_string(), + ); + zoo_cfg.insert( + ZookeeperSecurity::CLIENT_PORT_NAME.to_string(), + security.client_port().to_string(), + ); + zoo_cfg.insert( + ZookeeperConfig::DATA_DIR.to_string(), + STACKABLE_DATA_DIR.to_string(), + ); + zoo_cfg.insert( + ZookeeperConfig::INIT_LIMIT.to_string(), + DEFAULT_INIT_LIMIT.to_string(), + ); + zoo_cfg.insert( + ZookeeperConfig::SYNC_LIMIT.to_string(), + DEFAULT_SYNC_LIMIT.to_string(), + ); + zoo_cfg.insert( + ZookeeperConfig::TICK_TIME.to_string(), + DEFAULT_TICK_TIME.to_string(), + ); + zoo_cfg.insert( + METRICS_PROVIDER_CLASS_NAME_KEY.to_string(), + PROMETHEUS_METRICS_PROVIDER.to_string(), + ); + zoo_cfg.insert( + METRICS_PROVIDER_HTTP_PORT_KEY.to_string(), + METRICS_PROVIDER_HTTP_PORT.to_string(), + ); + + // 3. TLS / quorum settings. + zoo_cfg.extend(security.config_settings()); + + // 4. User-set merged config overrides the seeded defaults above. + if let Some(init_limit) = config.init_limit { + zoo_cfg.insert( + ZookeeperConfig::INIT_LIMIT.to_string(), + init_limit.to_string(), + ); + } + if let Some(sync_limit) = config.sync_limit { + zoo_cfg.insert( + ZookeeperConfig::SYNC_LIMIT.to_string(), + sync_limit.to_string(), + ); + } + if let Some(tick_time) = config.tick_time { + zoo_cfg.insert(ZookeeperConfig::TICK_TIME.to_string(), tick_time.to_string()); + } + + // 5. configOverrides go last so they win. + apply_overrides( + &mut zoo_cfg, + rolegroup_config + .config_overrides + .get_key_value_overrides(ZOOKEEPER_PROPERTIES_FILE), + ); + + zoo_cfg +} + +/// Resolves the metrics HTTP port for a role group, honoring a +/// `metricsProvider.httpPort` `configOverride` if present. +pub fn metrics_http_port( + cluster: &ValidatedCluster, + rolegroup_config: &ZookeeperRoleGroupConfig, +) -> u16 { + build(cluster, rolegroup_config) + .get(METRICS_PROVIDER_HTTP_PORT_KEY) + .and_then(|port| port.parse().ok()) + .unwrap_or(METRICS_PROVIDER_HTTP_PORT) +} From 497882044a94ba2f97e99d19522b30ab87a793bc Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 19:05:48 +0200 Subject: [PATCH 08/16] refactor: Non-optional config overrides + ConfigFileName for file names Mirror trino-operator and hdfs-operator: - Switch ZookeeperConfigOverrides to stackable_operator::v2::config_overrides:: KeyValueConfigOverrides with non-optional fields and a derived Merge impl, replacing the manual Merge impl and the KeyValueOverridesProvider/ get_key_value_overrides indirection. The zoo.cfg/security.properties builders now read rg.config_overrides. directly and resolve via resolved_overrides (None values are dropped). - Drop the hard-coded ZOOKEEPER_PROPERTIES_FILE / JVM_SECURITY_PROPERTIES_FILE crd constants. The ConfigMap file names now come solely from the ConfigFileName enum; jvm.rs keeps a local security.properties const for the JVM system property (as trino does). CRD regenerated: the configOverrides fields become non-nullable objects (default {}) with nullable string values, matching trino/hdfs. Backwards- compatible for existing string-valued overrides. All 16 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) --- extra/crds.yaml | 12 ++-- rust/operator-binary/src/config/jvm.rs | 8 ++- rust/operator-binary/src/crd/mod.rs | 59 ++----------------- .../src/zk_controller/build/properties/mod.rs | 28 ++++----- .../build/properties/security_properties.rs | 15 ++--- .../zk_controller/build/properties/zoo_cfg.rs | 15 ++--- 6 files changed, 42 insertions(+), 95 deletions(-) diff --git a/extra/crds.yaml b/extra/crds.yaml index a5e67469..1ecd669b 100644 --- a/extra/crds.yaml +++ b/extra/crds.yaml @@ -653,23 +653,25 @@ spec: properties: security.properties: additionalProperties: + nullable: true type: string + default: {} description: |- Flat key-value overrides for `*.properties`, Hadoop XML, etc. This is backwards-compatible with the existing flat key-value YAML format used by `HashMap`. - nullable: true type: object zoo.cfg: additionalProperties: + nullable: true type: string + default: {} description: |- Flat key-value overrides for `*.properties`, Hadoop XML, etc. This is backwards-compatible with the existing flat key-value YAML format used by `HashMap`. - nullable: true type: object type: object envOverrides: @@ -1208,23 +1210,25 @@ spec: properties: security.properties: additionalProperties: + nullable: true type: string + default: {} description: |- Flat key-value overrides for `*.properties`, Hadoop XML, etc. This is backwards-compatible with the existing flat key-value YAML format used by `HashMap`. - nullable: true type: object zoo.cfg: additionalProperties: + nullable: true type: string + default: {} description: |- Flat key-value overrides for `*.properties`, Hadoop XML, etc. This is backwards-compatible with the existing flat key-value YAML format used by `HashMap`. - nullable: true type: object type: object envOverrides: diff --git a/rust/operator-binary/src/config/jvm.rs b/rust/operator-binary/src/config/jvm.rs index dcc7b63d..fa772fa7 100644 --- a/rust/operator-binary/src/config/jvm.rs +++ b/rust/operator-binary/src/config/jvm.rs @@ -5,13 +5,17 @@ use stackable_operator::{ }; use crate::crd::{ - JMX_METRICS_PORT, JVM_SECURITY_PROPERTIES_FILE, LOG4J_CONFIG_FILE, LOGBACK_CONFIG_FILE, - LoggingFramework, STACKABLE_CONFIG_DIR, STACKABLE_LOG_CONFIG_DIR, ZookeeperServerRoleType, + JMX_METRICS_PORT, LOG4J_CONFIG_FILE, LOGBACK_CONFIG_FILE, LoggingFramework, + STACKABLE_CONFIG_DIR, STACKABLE_LOG_CONFIG_DIR, ZookeeperServerRoleType, v1alpha1::{ZookeeperCluster, ZookeeperConfig}, }; const JAVA_HEAP_FACTOR: f32 = 0.8; +/// The JVM security properties file the operator writes into the rolegroup +/// ConfigMap (see `zk_controller::build::properties::ConfigFileName`). +const JVM_SECURITY_PROPERTIES_FILE: &str = "security.properties"; + #[derive(Snafu, Debug)] pub enum Error { #[snafu(display("invalid memory resource configuration - missing default or value in crd?"))] diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index b707bc32..5d28b9b8 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -16,7 +16,6 @@ use stackable_operator::{ fragment::{self, Fragment, ValidationError}, merge::Merge, }, - config_overrides::{KeyValueConfigOverrides, KeyValueOverridesProvider}, crd::ClusterRef, deep_merger::ObjectOverrides, k8s_openapi::{ @@ -31,6 +30,7 @@ use stackable_operator::{ shared::time::Duration, status::condition::{ClusterCondition, HasStatusCondition}, utils::cluster_info::KubernetesClusterInfo, + v2::config_overrides::KeyValueConfigOverrides, versioned::versioned, }; use strum::{Display, EnumIter, EnumString, IntoEnumIterator}; @@ -49,8 +49,6 @@ pub const APP_NAME: &str = "zookeeper"; pub const OPERATOR_NAME: &str = "zookeeper.stackable.tech"; pub const FIELD_MANAGER: &str = "zookeeper-operator"; -pub const ZOOKEEPER_PROPERTIES_FILE: &str = "zoo.cfg"; -pub const JVM_SECURITY_PROPERTIES_FILE: &str = "security.properties"; pub const ZOOKEEPER_SERVER_PORT_NAME: &str = "zk"; pub const ZOOKEEPER_LEADER_PORT_NAME: &str = "zk-leader"; @@ -281,17 +279,13 @@ pub mod versioned { Zookeeper, } - #[derive(Clone, Debug, Default, Deserialize, JsonSchema, PartialEq, Serialize)] + #[derive(Clone, Debug, Default, Deserialize, Merge, JsonSchema, PartialEq, Serialize)] pub struct ZookeeperConfigOverrides { - #[serde(default, rename = "zoo.cfg", skip_serializing_if = "Option::is_none")] - pub zoo_cfg: Option, + #[serde(default, rename = "zoo.cfg")] + pub zoo_cfg: KeyValueConfigOverrides, - #[serde( - default, - rename = "security.properties", - skip_serializing_if = "Option::is_none" - )] - pub security_properties: Option, + #[serde(default, rename = "security.properties")] + pub security_properties: KeyValueConfigOverrides, } #[derive(Clone, Default, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] @@ -345,47 +339,6 @@ pub mod versioned { } } -impl Merge for v1alpha1::ZookeeperConfigOverrides { - /// Merges `defaults` (role level) into `self` (role-group level). Keys present - /// in `self` win; keys only in `defaults` are added. Mirrors how the previous - /// product-config pipeline merged role and role-group `configOverrides`. - fn merge(&mut self, defaults: &Self) { - merge_key_value_overrides(&mut self.zoo_cfg, &defaults.zoo_cfg); - merge_key_value_overrides(&mut self.security_properties, &defaults.security_properties); - } -} - -/// Merges two optional [`KeyValueConfigOverrides`], with `this` taking precedence. -fn merge_key_value_overrides( - this: &mut Option, - defaults: &Option, -) { - match (this.as_mut(), defaults) { - (Some(this), Some(defaults)) => { - for (key, value) in &defaults.overrides { - this.overrides - .entry(key.clone()) - .or_insert_with(|| value.clone()); - } - } - (None, Some(defaults)) => *this = Some(defaults.clone()), - (Some(_), None) | (None, None) => {} - } -} - -impl KeyValueOverridesProvider for v1alpha1::ZookeeperConfigOverrides { - fn get_key_value_overrides(&self, file: &str) -> BTreeMap> { - let field = match file { - ZOOKEEPER_PROPERTIES_FILE => self.zoo_cfg.as_ref(), - JVM_SECURITY_PROPERTIES_FILE => self.security_properties.as_ref(), - _ => None, - }; - field - .map(KeyValueConfigOverrides::as_product_config_overrides) - .unwrap_or_default() - } -} - #[derive( Clone, Debug, diff --git a/rust/operator-binary/src/zk_controller/build/properties/mod.rs b/rust/operator-binary/src/zk_controller/build/properties/mod.rs index 8c9ed824..501b9c2b 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/mod.rs +++ b/rust/operator-binary/src/zk_controller/build/properties/mod.rs @@ -7,6 +7,8 @@ use std::collections::BTreeMap; +use stackable_operator::v2::config_overrides::KeyValueConfigOverrides; + pub mod logging; pub mod security_properties; pub mod zoo_cfg; @@ -20,22 +22,16 @@ pub enum ConfigFileName { SecurityProperties, } -/// Applies user-provided key-value overrides to a property map: `Some(value)` -/// sets the key, `None` removes it. -pub(crate) fn apply_overrides( - target: &mut BTreeMap, - overrides: BTreeMap>, -) { - for (key, value) in overrides { - match value { - Some(value) => { - target.insert(key, value); - } - None => { - target.remove(&key); - } - } - } +/// Resolves user-provided [`KeyValueConfigOverrides`] into the `(key, value)` +/// pairs to merge into a config file, dropping entries whose value is unset +/// (`None`). +pub(crate) fn resolved_overrides( + overrides: KeyValueConfigOverrides, +) -> impl Iterator { + overrides + .overrides + .into_iter() + .filter_map(|(key, value)| value.map(|value| (key, value))) } /// Converts a `key -> value` map into the `key -> Some(value)` shape expected by diff --git a/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs b/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs index c7109548..5fd3ca8f 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs +++ b/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs @@ -2,11 +2,9 @@ use std::collections::BTreeMap; -use stackable_operator::config_overrides::KeyValueOverridesProvider; +use crate::zk_controller::validate::ZookeeperRoleGroupConfig; -use crate::{crd::JVM_SECURITY_PROPERTIES_FILE, zk_controller::validate::ZookeeperRoleGroupConfig}; - -use super::apply_overrides; +use super::resolved_overrides; const NETWORKADDRESS_CACHE_TTL: &str = "networkaddress.cache.ttl"; const NETWORKADDRESS_CACHE_NEGATIVE_TTL: &str = "networkaddress.cache.negative.ttl"; @@ -32,12 +30,9 @@ pub fn build(rolegroup_config: &ZookeeperRoleGroupConfig) -> BTreeMap Date: Thu, 4 Jun 2026 19:07:49 +0200 Subject: [PATCH 09/16] fix: run linters & regenerate --- Cargo.nix | 1694 +++++++---------- crate-hashes.json | 18 +- .../configs/properties.yaml | 440 +---- rust/operator-binary/src/crd/mod.rs | 1 - rust/operator-binary/src/zk_controller.rs | 12 +- .../build/properties/security_properties.rs | 8 +- .../zk_controller/build/properties/zoo_cfg.rs | 8 +- 7 files changed, 756 insertions(+), 1425 deletions(-) diff --git a/Cargo.nix b/Cargo.nix index 9d6a1d33..6a0e868f 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -216,9 +216,9 @@ rec { }; "anstream" = rec { crateName = "anstream"; - version = "0.6.21"; + version = "1.0.0"; edition = "2021"; - sha256 = "0jjgixms4qjj58dzr846h2s29p8w7ynwr9b9x6246m1pwy0v5ma3"; + sha256 = "13d2bj0xfg012s4rmq44zc8zgy1q8k9yp7yhvfnarscnmwpj2jl2"; dependencies = [ { name = "anstyle"; @@ -261,9 +261,9 @@ rec { }; "anstyle" = rec { crateName = "anstyle"; - version = "1.0.13"; + version = "1.0.14"; edition = "2021"; - sha256 = "0y2ynjqajpny6q0amvfzzgw0gfw3l47z85km4gvx87vg02lcr4ji"; + sha256 = "0030szmgj51fxkic1hpakxxgappxzwm6m154a3gfml83lq63l2wl"; features = { "default" = [ "std" ]; }; @@ -271,9 +271,9 @@ rec { }; "anstyle-parse" = rec { crateName = "anstyle-parse"; - version = "0.2.7"; + version = "1.0.0"; edition = "2021"; - sha256 = "1hhmkkfr95d462b3zf6yl2vfzdqfy5726ya572wwg8ha9y148xjf"; + sha256 = "03hkv2690s0crssbnmfkr76kw1k7ah2i6s5amdy9yca2n8w7zkjj"; libName = "anstyle_parse"; dependencies = [ { @@ -345,9 +345,9 @@ rec { }; "arc-swap" = rec { crateName = "arc-swap"; - version = "1.8.2"; + version = "1.9.1"; edition = "2018"; - sha256 = "19aas8y3kz0v6jr6yijvw6cad9grpl3lw1a25k0cws2m2iy69wzr"; + sha256 = "01xjlahcya8igdalxmda375lnlhjqwjz0cdqhy0bc1jkyzb1yfka"; libName = "arc_swap"; authors = [ "Michal 'vorner' Vaner " @@ -489,9 +489,9 @@ rec { }; "autocfg" = rec { crateName = "autocfg"; - version = "1.5.0"; + version = "1.5.1"; edition = "2015"; - sha256 = "1s77f98id9l4af4alklmzq46f21c980v13z2r1pcxx6bqgw0d1n0"; + sha256 = "0lqasy5i30flcgih1b50kvsk6z32g09r1q4ql7q81pj6228jy0zj"; authors = [ "Josh Stone " ]; @@ -499,9 +499,9 @@ rec { }; "axum" = rec { crateName = "axum"; - version = "0.8.8"; + version = "0.8.9"; edition = "2021"; - sha256 = "1f4p0m04mgwpn8b40i9r5mgqxk6w11sv4yri6xfqk305nhyayllb"; + sha256 = "146df5x8dhczm1sp939gr3839220wl6rxc1k65bzc450z72ridii"; dependencies = [ { name = "axum-core"; @@ -866,9 +866,9 @@ rec { }; "bitflags" = rec { crateName = "bitflags"; - version = "2.11.0"; + version = "2.12.1"; edition = "2021"; - sha256 = "1bwjibwry5nfwsfm9kjg2dqx5n5nja9xymwbfl6svnn8jsz6ff44"; + sha256 = "02phhjm7w380zdh8928zf13cfi1bw2qz2ay36ml2jmwmmv8cxmw4"; authors = [ "The Rust Project Developers" ]; @@ -898,9 +898,9 @@ rec { }; "built" = rec { crateName = "built"; - version = "0.8.0"; - edition = "2021"; - sha256 = "0r5f08lpjsr6j5ajkbmd0ymfmajpq8ddbfvi8ji8rx48y88qzbgl"; + version = "0.8.1"; + edition = "2024"; + sha256 = "1saq332pd6g3svvc9ah8myjpfvgqlzl2ksb1ypp3976kjcfm63jw"; authors = [ "Lukas Lueg " ]; @@ -924,15 +924,16 @@ rec { "chrono" = [ "dep:chrono" ]; "dependency-tree" = [ "cargo-lock/dependency-tree" ]; "git2" = [ "dep:git2" ]; + "gix" = [ "dep:gix" ]; "semver" = [ "dep:semver" ]; }; resolvedDefaultFeatures = [ "chrono" "git2" ]; }; "bumpalo" = rec { crateName = "bumpalo"; - version = "3.20.2"; + version = "3.20.3"; edition = "2021"; - sha256 = "1jrgxlff76k9glam0akhwpil2fr1w32gbjdf5hpipc7ld2c7h82x"; + sha256 = "0jc6va3nwcqikm7chnpdv1s87my3gs2j7g1sc7g3k91brg3arxbj"; authors = [ "Nick Fitzgerald " ]; @@ -974,9 +975,9 @@ rec { }; "cc" = rec { crateName = "cc"; - version = "1.2.56"; + version = "1.2.63"; edition = "2018"; - sha256 = "1chvh9g2izhqad7vzy4cc7xpdljdvqpsr6x6hv1hmyqv3mlkbgxf"; + sha256 = "0zy2bqc4nvj6bv2cipx4h4bn65wf1zqf1fw1hsh64mmvg1hh2vjm"; authors = [ "Alex Crichton " ]; @@ -1024,9 +1025,9 @@ rec { }; "chrono" = rec { crateName = "chrono"; - version = "0.4.44"; + version = "0.4.45"; edition = "2021"; - sha256 = "1c64mk9a235271j5g3v4zrzqqmd43vp9vki7vqfllpqf5rd0fwy6"; + sha256 = "09rkcgk6is2sdhqs9142zv8xqnj8ryx8m9hknllqwyv9wxi9x9qs"; dependencies = [ { name = "iana-time-zone"; @@ -1073,10 +1074,10 @@ rec { }; "clap" = rec { crateName = "clap"; - version = "4.5.60"; - edition = "2021"; + version = "4.6.1"; + edition = "2024"; crateBin = []; - sha256 = "02h3nzznssjgp815nnbzk0r62y2iw03kdli75c233kirld6z75r7"; + sha256 = "0lcf88l7vlg796rrqr7wipbbmfa5sgsgx4211b7xmxxv8dz13nqx"; dependencies = [ { name = "clap_builder"; @@ -1115,9 +1116,9 @@ rec { }; "clap_builder" = rec { crateName = "clap_builder"; - version = "4.5.60"; - edition = "2021"; - sha256 = "0xk8mdizvmmn6w5ij5cwhy5pbgyac4w9pfvl6nqmjl7a5hql38i4"; + version = "4.6.0"; + edition = "2024"; + sha256 = "17q6np22yxhh5y5v53y4l31ps3hlaz45mvz2n2nicr7n3c056jki"; dependencies = [ { name = "anstream"; @@ -1154,9 +1155,9 @@ rec { }; "clap_derive" = rec { crateName = "clap_derive"; - version = "4.5.55"; - edition = "2021"; - sha256 = "1r949xis3jmhzh387smd70vc8a3b9734ck3g5ahg59a63bd969x9"; + version = "4.6.1"; + edition = "2024"; + sha256 = "1acpz49hi00iv9jkapixjzcv7s51x8qkfaqscjm36rqgf428dkpj"; procMacro = true; dependencies = [ { @@ -1186,16 +1187,16 @@ rec { }; "clap_lex" = rec { crateName = "clap_lex"; - version = "1.0.0"; - edition = "2021"; - sha256 = "0c8888qi1l9sayqlv666h8s0yxn2qc6jr88v1zagk43mpjjjx0is"; + version = "1.1.0"; + edition = "2024"; + sha256 = "1ycqkpygnlqnndghhcxjb44lzl0nmgsia64x9581030yifxs7m68"; }; "colorchoice" = rec { crateName = "colorchoice"; - version = "1.0.4"; + version = "1.0.5"; edition = "2021"; - sha256 = "0x8ymkz1xr77rcj1cfanhf416pc4v681gmkc9dzb3jqja7f62nxh"; + sha256 = "0w75k89hw39p0mnnhlrwr23q50rza1yjki44qvh2mgrnj065a1qx"; }; "concurrent-queue" = rec { @@ -1239,9 +1240,9 @@ rec { }; "const_format" = rec { crateName = "const_format"; - version = "0.2.35"; + version = "0.2.36"; edition = "2021"; - sha256 = "1b9h03z3k76ail1ldqxcqmsc4raa7dwgwwqwrjf6wmism5lp9akz"; + sha256 = "07ncczs8yndga2f8p4386c827l4fxwzl0pbwp7ijnhcsmlbsd0a4"; authors = [ "rodrimati1992 " ]; @@ -1250,6 +1251,12 @@ rec { name = "const_format_proc_macros"; packageId = "const_format_proc_macros"; } + { + name = "konst"; + packageId = "konst"; + usesDefaultFeatures = false; + features = [ "rust_1_64" ]; + } ]; features = { "__debug" = [ "const_format_proc_macros/debug" ]; @@ -1263,10 +1270,9 @@ rec { "constant_time_as_str" = [ "fmt" ]; "derive" = [ "fmt" "const_format_proc_macros/derive" ]; "fmt" = [ "rust_1_83" ]; - "konst" = [ "dep:konst" ]; "more_str_macros" = [ "rust_1_64" ]; "nightly_const_generics" = [ "const_generics" ]; - "rust_1_64" = [ "rust_1_51" "konst" "konst/rust_1_64" ]; + "rust_1_64" = [ "rust_1_51" ]; "rust_1_83" = [ "rust_1_64" ]; }; resolvedDefaultFeatures = [ "default" ]; @@ -1914,9 +1920,9 @@ rec { }; "displaydoc" = rec { crateName = "displaydoc"; - version = "0.2.5"; + version = "0.2.6"; edition = "2021"; - sha256 = "1q0alair462j21iiqwrr21iabkfnb13d6x5w95lkdg21q2xrqdlp"; + sha256 = "0kyxwfbdmagd8afzb2pzja7wj8dhah7smxdsgw00iq8pa2jhmiqs"; procMacro = true; authors = [ "Jane Lusby " @@ -2116,12 +2122,9 @@ rec { }; "either" = rec { crateName = "either"; - version = "1.15.0"; + version = "1.16.0"; edition = "2021"; - sha256 = "069p1fknsmzn9llaizh77kip0pqmcwpdsykv2x30xpjyija5gis8"; - authors = [ - "bluss" - ]; + sha256 = "17k7jfbdz7k440h6lws9baz8p9zlxgb41sig3w81h80nwzsjyqli"; features = { "default" = [ "std" ]; "serde" = [ "dep:serde" ]; @@ -2465,9 +2468,9 @@ rec { }; "fastrand" = rec { crateName = "fastrand"; - version = "2.3.0"; + version = "2.4.1"; edition = "2018"; - sha256 = "1ghiahsw1jd68df895cy5h3gzwk30hndidn3b682zmshpgmrx41p"; + sha256 = "1mnqxxnxvd69ma9mczabpbbsgwlhd6l78yv3vd681453a9s247wz"; authors = [ "Stjepan Glavina " ]; @@ -3083,9 +3086,9 @@ rec { }; "git2" = rec { crateName = "git2"; - version = "0.20.4"; - edition = "2018"; - sha256 = "0azykjpk3j6s354z23jkyq3r3pbmlw9ha1zsxkw5cnnpi1h2b23v"; + version = "0.21.0"; + edition = "2021"; + sha256 = "0bmqga9vlyx5sdlr0i28z0362s89xv9i4qcv20vvx9j54y9vzpfx"; authors = [ "Josh Triplett " "Alex Crichton " @@ -3107,17 +3110,14 @@ rec { name = "log"; packageId = "log"; } - { - name = "url"; - packageId = "url"; - } ]; features = { - "default" = [ "ssh" "https" ]; - "https" = [ "libgit2-sys/https" "openssl-sys" "openssl-probe" ]; + "cred" = [ "dep:url" ]; + "https" = [ "libgit2-sys/https" "openssl-sys" "openssl-probe" "cred" ]; "openssl-probe" = [ "dep:openssl-probe" ]; "openssl-sys" = [ "dep:openssl-sys" ]; - "ssh" = [ "libgit2-sys/ssh" ]; + "ssh" = [ "libgit2-sys/ssh" "cred" ]; + "unstable-sha256" = [ "libgit2-sys/unstable-sha256" ]; "vendored-libgit2" = [ "libgit2-sys/vendored" ]; "vendored-openssl" = [ "openssl-sys/vendored" "libgit2-sys/vendored-openssl" ]; "zlib-ng-compat" = [ "libgit2-sys/zlib-ng-compat" ]; @@ -3197,9 +3197,9 @@ rec { }; "h2" = rec { crateName = "h2"; - version = "0.4.13"; + version = "0.4.14"; edition = "2021"; - sha256 = "0m6w5gg0n0m1m5915bxrv8n4rlazhx5icknkslz719jhh4xdli1g"; + sha256 = "0cw7jk7kn2vn6f8w8ssh6gis1mljnfjxd606gvi4sjpyjayfy7qp"; authors = [ "Carl Lerche " "Sean McArthur " @@ -3267,7 +3267,7 @@ rec { features = { }; }; - "hashbrown" = rec { + "hashbrown 0.16.1" = rec { crateName = "hashbrown"; version = "0.16.1"; edition = "2021"; @@ -3310,6 +3310,24 @@ rec { }; resolvedDefaultFeatures = [ "allocator-api2" "default" "default-hasher" "equivalent" "inline-more" "raw-entry" ]; }; + "hashbrown 0.17.1" = rec { + crateName = "hashbrown"; + version = "0.17.1"; + edition = "2024"; + sha256 = "0jmqz7i4yl6cm7rbn0i2ffkfrmwi6xkmzkaldr2v8bcsx2v0jngd"; + features = { + "alloc" = [ "dep:alloc" ]; + "allocator-api2" = [ "dep:allocator-api2" ]; + "core" = [ "dep:core" ]; + "default" = [ "default-hasher" "inline-more" "allocator-api2" "equivalent" "raw-entry" ]; + "default-hasher" = [ "dep:foldhash" ]; + "equivalent" = [ "dep:equivalent" ]; + "nightly" = [ "foldhash?/nightly" "bumpalo/allocator_api" ]; + "rayon" = [ "dep:rayon" ]; + "rustc-dep-of-std" = [ "nightly" "core" "alloc" "rustc-internal-api" ]; + "serde" = [ "dep:serde_core" "dep:serde" ]; + }; + }; "heck" = rec { crateName = "heck"; version = "0.5.0"; @@ -3371,9 +3389,9 @@ rec { }; "http" = rec { crateName = "http"; - version = "1.4.0"; + version = "1.4.1"; edition = "2021"; - sha256 = "06iind4cwsj1d6q8c2xgq8i2wka4ps74kmws24gsi1bzdlw2mfp3"; + sha256 = "1l7k2ia57z3q7q3ka497krzps795kd3fymm2k12lr623y4nldrwb"; authors = [ "Alex Crichton " "Carl Lerche " @@ -3490,9 +3508,9 @@ rec { }; "hyper" = rec { crateName = "hyper"; - version = "1.8.1"; + version = "1.10.1"; edition = "2021"; - sha256 = "04cxr8j5y86bhxxlyqb8xkxjskpajk7cxwfzzk4v3my3a3rd9cia"; + sha256 = "1624nwrh1ci34psqcl3q8q266kha8kd6fmqjj14qck49l59iqa2m"; authors = [ "Sean McArthur " ]; @@ -3549,11 +3567,6 @@ rec { packageId = "pin-project-lite"; optional = true; } - { - name = "pin-utils"; - packageId = "pin-utils"; - optional = true; - } { name = "smallvec"; packageId = "smallvec"; @@ -3591,7 +3604,7 @@ rec { "client" = [ "dep:want" "dep:pin-project-lite" "dep:smallvec" ]; "ffi" = [ "dep:http-body-util" "dep:futures-util" ]; "full" = [ "client" "http1" "http2" "server" ]; - "http1" = [ "dep:atomic-waker" "dep:futures-channel" "dep:futures-core" "dep:httparse" "dep:itoa" "dep:pin-utils" ]; + "http1" = [ "dep:atomic-waker" "dep:futures-channel" "dep:futures-core" "dep:httparse" "dep:itoa" ]; "http2" = [ "dep:futures-channel" "dep:futures-core" "dep:h2" ]; "server" = [ "dep:httpdate" "dep:pin-project-lite" "dep:smallvec" ]; "tracing" = [ "dep:tracing" ]; @@ -3600,9 +3613,9 @@ rec { }; "hyper-rustls" = rec { crateName = "hyper-rustls"; - version = "0.27.7"; + version = "0.27.9"; edition = "2021"; - sha256 = "0n6g8998szbzhnvcs1b7ibn745grxiqmlpg53xz206v826v3xjg3"; + sha256 = "03vfnsm873wsp1dk0q85nxvk7w6syp8c2m5bcdjcyfgg4786ijik"; libName = "hyper_rustls"; dependencies = [ { @@ -3635,11 +3648,6 @@ rec { packageId = "rustls-native-certs"; optional = true; } - { - name = "rustls-pki-types"; - packageId = "rustls-pki-types"; - rename = "pki-types"; - } { name = "tokio"; packageId = "tokio"; @@ -3939,9 +3947,9 @@ rec { }; "icu_collections" = rec { crateName = "icu_collections"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "0hsblchsdl64q21qwrs4hvc2672jrf466zivbj1bwyv606bn8ssc"; + sha256 = "070r7xd0pynm0hnc1v2jzlbxka6wf50f81wybf9xg0y82v6x3119"; authors = [ "The ICU4X Project Developers" ]; @@ -3957,6 +3965,11 @@ rec { usesDefaultFeatures = false; features = [ "zerovec" ]; } + { + name = "utf8_iter"; + packageId = "utf8_iter"; + usesDefaultFeatures = false; + } { name = "yoke"; packageId = "yoke"; @@ -3984,9 +3997,9 @@ rec { }; "icu_locale_core" = rec { crateName = "icu_locale_core"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "1djvdc2f5ylmp1ymzv4gcnmq1s4hqfim9nxlcm173lsd01hpifpd"; + sha256 = "0a9cmin5w1x3bg941dlmgszn33qgq428k7qiqn5did72ndi9n8cj"; authors = [ "The ICU4X Project Developers" ]; @@ -4018,6 +4031,14 @@ rec { usesDefaultFeatures = false; } ]; + devDependencies = [ + { + name = "litemap"; + packageId = "litemap"; + usesDefaultFeatures = false; + features = [ "testing" ]; + } + ]; features = { "alloc" = [ "litemap/alloc" "tinystr/alloc" "writeable/alloc" "serde?/alloc" ]; "databake" = [ "dep:databake" "alloc" ]; @@ -4028,9 +4049,9 @@ rec { }; "icu_normalizer" = rec { crateName = "icu_normalizer"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "16dmn5596la2qm0r3vih0bzjfi0vx9a20yqjha6r1y3vnql8hv2z"; + sha256 = "1d7krxr0xpc4x9635k1100a24nh0nrc59n65j6yk6gbfkplmwvn5"; authors = [ "The ICU4X Project Developers" ]; @@ -4072,6 +4093,7 @@ rec { "compiled_data" = [ "dep:icu_normalizer_data" "icu_properties?/compiled_data" "icu_provider/baked" ]; "datagen" = [ "serde" "dep:databake" "icu_properties" "icu_collections/databake" "zerovec/databake" "icu_properties?/datagen" "icu_provider/export" ]; "default" = [ "compiled_data" "utf8_iter" "utf16_iter" ]; + "harfbuzz_traits" = [ "dep:harfbuzz-traits" ]; "icu_properties" = [ "dep:icu_properties" ]; "serde" = [ "dep:serde" "icu_collections/serde" "zerovec/serde" "icu_properties?/serde" "icu_provider/serde" ]; "utf16_iter" = [ "dep:utf16_iter" "dep:write16" ]; @@ -4081,9 +4103,9 @@ rec { }; "icu_normalizer_data" = rec { crateName = "icu_normalizer_data"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "02jnzizg6q75m41l6c13xc7nkc5q8yr1b728dcgfhpzw076wrvbs"; + sha256 = "0f5d5d5fhhr9937m2z6z38fzh6agf14z24kwlr6lyczafypf0fys"; authors = [ "The ICU4X Project Developers" ]; @@ -4091,9 +4113,9 @@ rec { }; "icu_properties" = rec { crateName = "icu_properties"; - version = "2.1.2"; + version = "2.2.0"; edition = "2021"; - sha256 = "1v3lbmhhi7i6jgw51ikjb1p50qh5rb67grlkdnkc63l7zq1gq2q2"; + sha256 = "1pkh3s837808cbwxvfagwc28cvwrz2d9h5rl02jwrhm51ryvdqxy"; authors = [ "The ICU4X Project Developers" ]; @@ -4138,6 +4160,7 @@ rec { "compiled_data" = [ "dep:icu_properties_data" "icu_provider/baked" ]; "datagen" = [ "serde" "dep:databake" "zerovec/databake" "icu_collections/databake" "icu_locale_core/databake" "zerotrie/databake" "icu_provider/export" ]; "default" = [ "compiled_data" ]; + "harfbuzz_traits" = [ "dep:harfbuzz-traits" ]; "serde" = [ "dep:serde" "icu_locale_core/serde" "zerovec/serde" "icu_collections/serde" "icu_provider/serde" "zerotrie/serde" ]; "unicode_bidi" = [ "dep:unicode-bidi" ]; }; @@ -4145,9 +4168,9 @@ rec { }; "icu_properties_data" = rec { crateName = "icu_properties_data"; - version = "2.1.2"; + version = "2.2.0"; edition = "2021"; - sha256 = "1bvpkh939rgzrjfdb7hz47v4wijngk0snmcgrnpwc9fpz162jv31"; + sha256 = "052awny0qwkbcbpd5jg2cd7vl5ry26pq4hz1nfsgf10c3qhbnawf"; authors = [ "The ICU4X Project Developers" ]; @@ -4155,9 +4178,9 @@ rec { }; "icu_provider" = rec { crateName = "icu_provider"; - version = "2.1.1"; + version = "2.2.0"; edition = "2021"; - sha256 = "0576b7dizgyhpfa74kacv86y4g1p7v5ffd6c56kf1q82rvq2r5l5"; + sha256 = "08dl8pxbwr8zsz4c5vphqb7xw0hykkznwi4rw7bk6pwb3krlr70k"; authors = [ "The ICU4X Project Developers" ]; @@ -4258,9 +4281,9 @@ rec { }; "idna_adapter" = rec { crateName = "idna_adapter"; - version = "1.2.1"; - edition = "2021"; - sha256 = "0i0339pxig6mv786nkqcxnwqa87v4m94b2653f6k3aj0jmhfkjis"; + version = "1.2.2"; + edition = "2024"; + sha256 = "0557p76l8hj35r9zn1yv7c6x1c0qbrsffmg80n0yy8361ly3fs6b"; authors = [ "The rust-url developers" ]; @@ -4283,9 +4306,9 @@ rec { }; "indexmap" = rec { crateName = "indexmap"; - version = "2.13.0"; - edition = "2021"; - sha256 = "05qh5c4h2hrnyypphxpwflk45syqbzvqsvvyxg43mp576w2ff53p"; + version = "2.14.0"; + edition = "2024"; + sha256 = "1na9z6f0d5pkjr1lgsni470v98gv2r7c41j8w48skr089x2yjrnl"; dependencies = [ { name = "equivalent"; @@ -4294,7 +4317,7 @@ rec { } { name = "hashbrown"; - packageId = "hashbrown"; + packageId = "hashbrown 0.17.1"; usesDefaultFeatures = false; } ]; @@ -4352,39 +4375,6 @@ rec { }; resolvedDefaultFeatures = [ "default" "std" ]; }; - "iri-string" = rec { - crateName = "iri-string"; - version = "0.7.10"; - edition = "2021"; - sha256 = "06kk3a5jz576p7vrpf7zz9jv3lrgcyp7pczcblcxdnryg3q3h4y9"; - libName = "iri_string"; - authors = [ - "YOSHIOKA Takuma " - ]; - dependencies = [ - { - name = "memchr"; - packageId = "memchr"; - optional = true; - usesDefaultFeatures = false; - } - { - name = "serde"; - packageId = "serde"; - optional = true; - usesDefaultFeatures = false; - features = [ "derive" ]; - } - ]; - features = { - "alloc" = [ "serde?/alloc" ]; - "default" = [ "std" ]; - "memchr" = [ "dep:memchr" ]; - "serde" = [ "dep:serde" ]; - "std" = [ "alloc" "memchr?/std" "serde?/std" ]; - }; - resolvedDefaultFeatures = [ "alloc" "default" "std" ]; - }; "is_terminal_polyfill" = rec { crateName = "is_terminal_polyfill"; version = "1.70.2"; @@ -4417,9 +4407,9 @@ rec { }; "itoa" = rec { crateName = "itoa"; - version = "1.0.17"; + version = "1.0.18"; edition = "2021"; - sha256 = "1lh93xydrdn1g9x547bd05g0d3hra7pd1k4jfd2z1pl1h5hwdv4j"; + sha256 = "10jnd1vpfkb8kj38rlkn2a6k02afvj3qmw054dfpzagrpl6achlg"; authors = [ "David Tolnay " ]; @@ -4454,9 +4444,9 @@ rec { }; "jiff" = rec { crateName = "jiff"; - version = "0.2.22"; + version = "0.2.28"; edition = "2021"; - sha256 = "1hni7qv2j2kbjisw84r7y6gxdb8qx534vw92nmz13nc7gjy496w1"; + sha256 = "00lixngcc7amh2fcsxfr0z38j06lllhapz192biv1qj97q1x60s6"; authors = [ "Andrew Gallant " ]; @@ -4502,12 +4492,10 @@ rec { usesDefaultFeatures = false; } { - name = "windows-sys"; - packageId = "windows-sys 0.61.2"; + name = "windows-link"; + packageId = "windows-link"; optional = true; - usesDefaultFeatures = false; target = { target, features }: (target."windows" or false); - features = [ "Win32_Foundation" "Win32_System_Time" ]; } ]; devDependencies = [ @@ -4526,7 +4514,7 @@ rec { "static-tz" = [ "dep:jiff-static" ]; "std" = [ "alloc" "log?/std" "serde_core?/std" ]; "tz-fat" = [ "jiff-static?/tz-fat" ]; - "tz-system" = [ "std" "dep:windows-sys" ]; + "tz-system" = [ "std" "dep:windows-link" ]; "tzdb-bundle-always" = [ "dep:jiff-tzdb" "alloc" ]; "tzdb-bundle-platform" = [ "dep:jiff-tzdb-platform" "alloc" ]; "tzdb-concatenated" = [ "std" ]; @@ -4536,9 +4524,9 @@ rec { }; "jiff-static" = rec { crateName = "jiff-static"; - version = "0.2.22"; + version = "0.2.28"; edition = "2021"; - sha256 = "18fljj75vxqvq1v55s074pbbrjy67qg1p2f0cvbmzhzc33dm40j7"; + sha256 = "0irbhfh2f4i9w5l53jcmh6ssnhdd92wfy76978chgwnxilvk4bbq"; procMacro = true; libName = "jiff_static"; authors = [ @@ -4565,9 +4553,9 @@ rec { }; "jiff-tzdb" = rec { crateName = "jiff-tzdb"; - version = "0.1.5"; + version = "0.1.6"; edition = "2021"; - sha256 = "1hm5xn3q092zac6apjy4492ddid473mwa0d64z5f5f95yyzix5v8"; + sha256 = "0xihzlnnyk0xnrzpq4xcyjdcmy8xc3ychzb9ayjkh4vgha2fy069"; libName = "jiff_tzdb"; libPath = "lib.rs"; authors = [ @@ -4618,14 +4606,25 @@ rec { }; "js-sys" = rec { crateName = "js-sys"; - version = "0.3.91"; + version = "0.3.99"; edition = "2021"; - sha256 = "171rzgq33wc1nxkgnvhlqqwwnrifs13mg3jjpjj5nf1z0yvib5xl"; + sha256 = "04azrzsz91gr5s3z0ij36lz0kj9ry4lw3jz0mmbiwb251rsc8aql"; libName = "js_sys"; authors = [ "The wasm-bindgen Developers" ]; dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "futures-util"; + packageId = "futures-util"; + optional = true; + usesDefaultFeatures = false; + features = [ "std" ]; + } { name = "once_cell"; packageId = "once_cell"; @@ -4639,15 +4638,16 @@ rec { ]; features = { "default" = [ "std" "unsafe-eval" ]; - "std" = [ "wasm-bindgen/std" ]; + "futures-core-03-stream" = [ "dep:futures-util" "dep:futures-core" ]; + "std" = [ "wasm-bindgen/std" "dep:futures-util" ]; }; resolvedDefaultFeatures = [ "default" "std" "unsafe-eval" ]; }; "json-patch" = rec { crateName = "json-patch"; - version = "4.1.0"; + version = "4.2.0"; edition = "2021"; - sha256 = "147yaxmv3i4s0bdna86rgwpmqh2507fn4ighfpplaiqkw8ay807k"; + sha256 = "0wkv896d0pzq56i2kkl0giqpv117fwvhbpgs8iz85805w66l68bl"; libName = "json_patch"; authors = [ "Ivan Dubrov " @@ -4657,6 +4657,11 @@ rec { name = "jsonptr"; packageId = "jsonptr"; } + { + name = "schemars"; + packageId = "schemars"; + optional = true; + } { name = "serde"; packageId = "serde"; @@ -4668,10 +4673,14 @@ rec { } { name = "thiserror"; - packageId = "thiserror 1.0.69"; + packageId = "thiserror 2.0.18"; } ]; devDependencies = [ + { + name = "schemars"; + packageId = "schemars"; + } { name = "serde_json"; packageId = "serde_json"; @@ -4683,7 +4692,7 @@ rec { "schemars" = [ "dep:schemars" ]; "utoipa" = [ "dep:utoipa" ]; }; - resolvedDefaultFeatures = [ "default" "diff" ]; + resolvedDefaultFeatures = [ "default" "diff" "schemars" ]; }; "jsonpath-rust" = rec { crateName = "jsonpath-rust"; @@ -4756,10 +4765,10 @@ rec { }; "k8s-openapi" = rec { crateName = "k8s-openapi"; - version = "0.27.0"; + version = "0.27.1"; edition = "2021"; - links = "k8s-openapi-0.27.0"; - sha256 = "038zxrklpni04rpaww9dr7v8ln8zj8p7mgdd68bx5l8sc7rxd9h5"; + links = "k8s-openapi-0.27.1"; + sha256 = "0pldsxbxd4ckq94p8rkck4s862w33gfns6rclxr5imcx47sjdcsi"; libName = "k8s_openapi"; authors = [ "Arnav Singh " @@ -4809,8 +4818,8 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; libName = "k8s_version"; @@ -4829,7 +4838,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.0"; + packageId = "snafu 0.9.1"; } ]; features = { @@ -4838,6 +4847,53 @@ rec { }; resolvedDefaultFeatures = [ "darling" ]; }; + "konst" = rec { + crateName = "konst"; + version = "0.2.20"; + edition = "2018"; + sha256 = "1yyf1fhk28wbf1lqrga9as4cpfmpbry9a5vvdqyxgz14g3nk708j"; + authors = [ + "rodrimati1992 " + ]; + dependencies = [ + { + name = "konst_macro_rules"; + packageId = "konst_macro_rules"; + } + ]; + features = { + "__ui" = [ "__test" "trybuild" "rust_latest_stable" ]; + "const_generics" = [ "rust_1_51" ]; + "constant_time_slice" = [ "rust_latest_stable" ]; + "default" = [ "cmp" "parsing" ]; + "deref_raw_in_fn" = [ "rust_1_56" ]; + "konst_proc_macros" = [ "dep:konst_proc_macros" ]; + "mut_refs" = [ "rust_latest_stable" "konst_macro_rules/mut_refs" ]; + "nightly_mut_refs" = [ "mut_refs" "konst_macro_rules/nightly_mut_refs" ]; + "parsing" = [ "parsing_no_proc" "konst_proc_macros" ]; + "rust_1_51" = [ "konst_macro_rules/rust_1_51" ]; + "rust_1_55" = [ "rust_1_51" "konst_macro_rules/rust_1_55" ]; + "rust_1_56" = [ "rust_1_55" "konst_macro_rules/rust_1_56" ]; + "rust_1_57" = [ "rust_1_56" "konst_macro_rules/rust_1_57" ]; + "rust_1_61" = [ "rust_1_57" "konst_macro_rules/rust_1_61" ]; + "rust_1_64" = [ "rust_1_61" ]; + "rust_latest_stable" = [ "rust_1_64" ]; + "trybuild" = [ "dep:trybuild" ]; + }; + resolvedDefaultFeatures = [ "rust_1_51" "rust_1_55" "rust_1_56" "rust_1_57" "rust_1_61" "rust_1_64" ]; + }; + "konst_macro_rules" = rec { + crateName = "konst_macro_rules"; + version = "0.2.19"; + edition = "2018"; + sha256 = "0dswja0dqcww4x3fwjnirc0azv2n6cazn8yv0kddksd8awzkz4x4"; + authors = [ + "rodrimati1992 " + ]; + features = { + }; + resolvedDefaultFeatures = [ "rust_1_51" "rust_1_55" "rust_1_56" "rust_1_57" "rust_1_61" ]; + }; "kube" = rec { crateName = "kube"; version = "3.1.0"; @@ -5312,7 +5368,7 @@ rec { } { name = "hashbrown"; - packageId = "hashbrown"; + packageId = "hashbrown 0.16.1"; } { name = "hostname"; @@ -5414,9 +5470,9 @@ rec { }; "libc" = rec { crateName = "libc"; - version = "0.2.182"; + version = "0.2.186"; edition = "2021"; - sha256 = "04k1w1mq9f4cxv520dbr5xw1i7xkbc9fcrvaggyjy25jdkdvl038"; + sha256 = "0rnyhzjyqq9x56skkllbjzzzwym3r61lq3l4hqj64v71gw0r3av8"; authors = [ "The Rust Project Developers" ]; @@ -5430,10 +5486,10 @@ rec { }; "libgit2-sys" = rec { crateName = "libgit2-sys"; - version = "0.18.3+1.9.2"; + version = "0.18.5+1.9.4"; edition = "2021"; links = "git2"; - sha256 = "11rlbyihj3k35mnkxxz4yvsnlx33a4r9srl66c5vp08pp72arcy9"; + sha256 = "18lwqnhy7qxg4iw24s1a0n7aj7qbnryry1iy0w32k4f1xbk6lp80"; libName = "libgit2_sys"; libPath = "lib.rs"; authors = [ @@ -5491,10 +5547,10 @@ rec { }; "libz-sys" = rec { crateName = "libz-sys"; - version = "1.1.24"; + version = "1.1.29"; edition = "2018"; links = "z"; - sha256 = "0f8879301wxgljw8snkcix90p6qbm4inp3sqrsjq9b2svv5yjda7"; + sha256 = "1n98kqya7a7a0cxf5n5z3g13rj7a1vqxynk2xc7bja1qfxbrdg45"; libName = "libz_sys"; authors = [ "Alex Crichton " @@ -5533,9 +5589,9 @@ rec { }; "litemap" = rec { crateName = "litemap"; - version = "0.8.1"; + version = "0.8.2"; edition = "2021"; - sha256 = "0xsy8pfp9s802rsj1bq2ys2kbk1g36w5dr3gkfip7gphb5x60wv3"; + sha256 = "1w7628bc7wwcxc4n4s5kw0610xk06710nh2hn5kwwk2wa91z9nlj"; authors = [ "The ICU4X Project Developers" ]; @@ -5571,9 +5627,9 @@ rec { }; "log" = rec { crateName = "log"; - version = "0.4.29"; + version = "0.4.32"; edition = "2021"; - sha256 = "15q8j9c8g5zpkcw0hnd6cf2z7fxqnvsjh3rw5mv5q10r83i34l2y"; + sha256 = "0fmdg0cxig7i4fwf1sw7fmg4d1gdbfzniawcfpwydy1q7320fgwm"; authors = [ "The Rust Project Developers" ]; @@ -5627,9 +5683,9 @@ rec { }; "memchr" = rec { crateName = "memchr"; - version = "2.8.0"; + version = "2.8.1"; edition = "2021"; - sha256 = "0y9zzxcqxvdqg6wyag7vc3h0blhdn7hkq164bxyx2vph8zs5ijpq"; + sha256 = "1n448jx01h5z2xknj6x2dhxgr8s8fb717cf6vfqj5lmhkpj7m53b"; authors = [ "Andrew Gallant " "bluss" @@ -5690,9 +5746,9 @@ rec { }; "mio" = rec { crateName = "mio"; - version = "1.1.1"; + version = "1.2.1"; edition = "2021"; - sha256 = "1z2phpalqbdgihrcjp8y09l3kgq6309jnhnr6h11l9s7mnqcm6x6"; + sha256 = "1nkggmrlnjs93w8rja4lvjj4aml1xqahgimv1h0p7d373kvhmg82"; authors = [ "Carl Lerche " "Thomas de Zeeuw " @@ -5702,17 +5758,7 @@ rec { { name = "libc"; packageId = "libc"; - target = { target, features }: ("hermit" == target."os" or null); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: ("wasi" == target."os" or null); - } - { - name = "libc"; - packageId = "libc"; - target = { target, features }: (target."unix" or false); + target = { target, features }: ((target."unix" or false) || ("hermit" == target."os" or null) || ("wasi" == target."os" or null)); } { name = "wasi"; @@ -5801,7 +5847,7 @@ rec { } { name = "rand"; - packageId = "rand 0.8.5"; + packageId = "rand 0.8.6"; optional = true; usesDefaultFeatures = false; } @@ -5820,7 +5866,7 @@ rec { devDependencies = [ { name = "rand"; - packageId = "rand 0.8.5"; + packageId = "rand 0.8.6"; features = [ "small_rng" ]; } ]; @@ -5838,9 +5884,9 @@ rec { }; "num-conv" = rec { crateName = "num-conv"; - version = "0.2.0"; + version = "0.2.2"; edition = "2021"; - sha256 = "0l4hj7lp8zbb9am4j3p7vlcv47y9bbazinvnxx9zjhiwkibyr5yg"; + sha256 = "0hg4f9bwmy7cwpxdkm165dmkfc8jhkkayci234jsmi5ssb33j5sj"; libName = "num_conv"; authors = [ "Jacob Pratt " @@ -5934,9 +5980,9 @@ rec { }; "once_cell" = rec { crateName = "once_cell"; - version = "1.21.3"; + version = "1.21.4"; edition = "2021"; - sha256 = "0b9x77lb9f1j6nqgf5aka4s2qj0nly176bpbrv6f9iakk5ff3xa2"; + sha256 = "0l1v676wf71kjg2khch4dphwh1jp3291ffiymr2mvy1kxd5kwz4z"; authors = [ "Aleksey Kladov " ]; @@ -5973,9 +6019,9 @@ rec { }; "opentelemetry" = rec { crateName = "opentelemetry"; - version = "0.31.0"; + version = "0.32.0"; edition = "2021"; - sha256 = "18629xsj4rsyiby9aj511q6wcw6s9m09gx3ymw1yjcvix1mcsjxq"; + sha256 = "10ln14d1jgc8rvw97mblc9blzcgpg1bimim4d170b7ia4mijq55h"; dependencies = [ { name = "futures-core"; @@ -6012,24 +6058,24 @@ rec { ]; features = { "default" = [ "trace" "metrics" "logs" "internal-logs" "futures" ]; + "experimental_metrics_bound_instruments" = [ "metrics" ]; "futures" = [ "futures-core" "futures-sink" "pin-project-lite" ]; "futures-core" = [ "dep:futures-core" ]; "futures-sink" = [ "dep:futures-sink" ]; "internal-logs" = [ "tracing" ]; "pin-project-lite" = [ "dep:pin-project-lite" ]; - "spec_unstable_logs_enabled" = [ "logs" ]; "testing" = [ "trace" ]; "thiserror" = [ "dep:thiserror" ]; "trace" = [ "futures" "thiserror" ]; "tracing" = [ "dep:tracing" ]; }; - resolvedDefaultFeatures = [ "default" "futures" "futures-core" "futures-sink" "internal-logs" "logs" "metrics" "pin-project-lite" "spec_unstable_logs_enabled" "thiserror" "trace" "tracing" ]; + resolvedDefaultFeatures = [ "default" "futures" "futures-core" "futures-sink" "internal-logs" "logs" "metrics" "pin-project-lite" "thiserror" "trace" "tracing" ]; }; "opentelemetry-appender-tracing" = rec { crateName = "opentelemetry-appender-tracing"; - version = "0.31.1"; + version = "0.32.0"; edition = "2021"; - sha256 = "1hnwizzgfhpjfnvml638yy846py8hf2gl1n3p1igbk1srb2ilspg"; + sha256 = "0dyq4myan64sl8wly02jx0gb3jjz7575mn3w8rpphz0xvkq8001c"; libName = "opentelemetry_appender_tracing"; dependencies = [ { @@ -6072,18 +6118,15 @@ rec { ]; features = { "experimental_metadata_attributes" = [ "dep:tracing-log" ]; - "experimental_use_tracing_span_context" = [ "tracing-opentelemetry" ]; "log" = [ "dep:log" ]; - "spec_unstable_logs_enabled" = [ "opentelemetry/spec_unstable_logs_enabled" ]; - "tracing-opentelemetry" = [ "dep:tracing-opentelemetry" ]; }; resolvedDefaultFeatures = [ "default" ]; }; "opentelemetry-http" = rec { crateName = "opentelemetry-http"; - version = "0.31.0"; + version = "0.32.0"; edition = "2021"; - sha256 = "0pc5nw1ds8v8w0nvyall39m92v8m1xl1p3vwvxk6nkhrffdd19np"; + sha256 = "0ca3drvm4fx5nskl7yn42dimy3bg35ppzc85y1p27pz215fh30sn"; libName = "opentelemetry_http"; dependencies = [ { @@ -6119,16 +6162,16 @@ rec { "internal-logs" = [ "opentelemetry/internal-logs" ]; "reqwest" = [ "dep:reqwest" ]; "reqwest-blocking" = [ "dep:reqwest" "reqwest/blocking" ]; - "reqwest-rustls" = [ "dep:reqwest" "reqwest/rustls-tls-native-roots" ]; - "reqwest-rustls-webpki-roots" = [ "dep:reqwest" "reqwest/rustls-tls-webpki-roots" ]; + "reqwest-rustls" = [ "dep:reqwest" "reqwest/default-tls" ]; + "reqwest-rustls-webpki-roots" = [ "dep:reqwest" "reqwest/default-tls" "reqwest/webpki-roots" ]; }; - resolvedDefaultFeatures = [ "internal-logs" "reqwest" "reqwest-blocking" ]; + resolvedDefaultFeatures = [ "reqwest" "reqwest-blocking" ]; }; "opentelemetry-otlp" = rec { crateName = "opentelemetry-otlp"; - version = "0.31.0"; + version = "0.32.0"; edition = "2021"; - sha256 = "1gv3h75z8c0p9b85mbq7f1rgsi18wip1xlfa6g82lkfa5pdnc8vs"; + sha256 = "0d9cys2flpidfxbr6h1103hjc633cax47ihnqgbj0xnicscr4rlr"; libName = "opentelemetry_otlp"; dependencies = [ { @@ -6189,10 +6232,9 @@ rec { usesDefaultFeatures = false; } { - name = "tracing"; - packageId = "tracing"; + name = "tonic-types"; + packageId = "tonic-types"; optional = true; - usesDefaultFeatures = false; } ]; devDependencies = [ @@ -6217,16 +6259,19 @@ rec { ]; features = { "default" = [ "http-proto" "reqwest-blocking-client" "trace" "metrics" "logs" "internal-logs" ]; + "experimental-grpc-retry" = [ "grpc-tonic" "opentelemetry_sdk/experimental_async_runtime" "opentelemetry_sdk/rt-tokio" ]; + "experimental-http-retry" = [ "opentelemetry_sdk/experimental_async_runtime" "opentelemetry_sdk/rt-tokio" "tokio" "httpdate" ]; "flate2" = [ "dep:flate2" ]; - "grpc-tonic" = [ "tonic" "prost" "http" "tokio" "opentelemetry-proto/gen-tonic" ]; + "grpc-tonic" = [ "tonic" "tonic-types" "prost" "http" "tokio" "opentelemetry-proto/gen-tonic" ]; "gzip-http" = [ "flate2" ]; "gzip-tonic" = [ "tonic/gzip" ]; "http" = [ "dep:http" ]; "http-json" = [ "serde_json" "prost" "opentelemetry-http" "opentelemetry-proto/gen-tonic-messages" "opentelemetry-proto/with-serde" "http" "trace" "metrics" ]; "http-proto" = [ "prost" "opentelemetry-http" "opentelemetry-proto/gen-tonic-messages" "http" "trace" "metrics" ]; + "httpdate" = [ "dep:httpdate" ]; "hyper-client" = [ "opentelemetry-http/hyper" ]; "integration-testing" = [ "tonic" "prost" "tokio/full" "trace" "logs" ]; - "internal-logs" = [ "tracing" "opentelemetry_sdk/internal-logs" "opentelemetry-http/internal-logs" ]; + "internal-logs" = [ "opentelemetry_sdk/internal-logs" "opentelemetry/internal-logs" ]; "logs" = [ "opentelemetry/logs" "opentelemetry_sdk/logs" "opentelemetry-proto/logs" ]; "metrics" = [ "opentelemetry/metrics" "opentelemetry_sdk/metrics" "opentelemetry-proto/metrics" ]; "opentelemetry-http" = [ "dep:opentelemetry-http" ]; @@ -6239,24 +6284,27 @@ rec { "serde" = [ "dep:serde" ]; "serde_json" = [ "dep:serde_json" ]; "serialize" = [ "serde" "serde_json" ]; - "tls" = [ "tonic/tls-ring" ]; - "tls-roots" = [ "tls" "tonic/tls-native-roots" ]; - "tls-webpki-roots" = [ "tls" "tonic/tls-webpki-roots" ]; + "tls" = [ "tls-ring" ]; + "tls-aws-lc" = [ "tonic/tls-aws-lc" ]; + "tls-provider-agnostic" = [ "tonic/_tls-any" ]; + "tls-ring" = [ "tonic/tls-ring" ]; + "tls-roots" = [ "tonic/tls-native-roots" ]; + "tls-webpki-roots" = [ "tonic/tls-webpki-roots" ]; "tokio" = [ "dep:tokio" ]; "tonic" = [ "dep:tonic" ]; + "tonic-types" = [ "dep:tonic-types" ]; "trace" = [ "opentelemetry/trace" "opentelemetry_sdk/trace" "opentelemetry-proto/trace" ]; - "tracing" = [ "dep:tracing" ]; "zstd" = [ "dep:zstd" ]; "zstd-http" = [ "zstd" ]; "zstd-tonic" = [ "tonic/zstd" ]; }; - resolvedDefaultFeatures = [ "default" "grpc-tonic" "gzip-tonic" "http" "http-proto" "internal-logs" "logs" "metrics" "opentelemetry-http" "prost" "reqwest" "reqwest-blocking-client" "tokio" "tonic" "trace" "tracing" ]; + resolvedDefaultFeatures = [ "default" "grpc-tonic" "gzip-tonic" "http" "http-proto" "internal-logs" "logs" "metrics" "opentelemetry-http" "prost" "reqwest" "reqwest-blocking-client" "tokio" "tonic" "tonic-types" "trace" ]; }; "opentelemetry-proto" = rec { crateName = "opentelemetry-proto"; - version = "0.31.0"; + version = "0.32.0"; edition = "2021"; - sha256 = "03xkjsjrsm7zkkx5gascqd9bg2z20wymm06l16cyxsp5dpq5s5x7"; + sha256 = "0f5ny4rpnpq6q5q34b8k2q548rf31rpbxkwjqjwzfqxg3yx5imjn"; libName = "opentelemetry_proto"; dependencies = [ { @@ -6300,30 +6348,29 @@ rec { "const-hex" = [ "dep:const-hex" ]; "default" = [ "full" ]; "full" = [ "gen-tonic" "trace" "logs" "metrics" "zpages" "with-serde" "internal-logs" ]; - "gen-tonic" = [ "gen-tonic-messages" "tonic/channel" ]; - "gen-tonic-messages" = [ "tonic" "tonic-prost" "prost" ]; + "gen-tonic" = [ "gen-tonic-messages" "tonic" "tonic-prost" "tonic/channel" ]; + "gen-tonic-messages" = [ "prost" ]; "internal-logs" = [ "opentelemetry/internal-logs" ]; "logs" = [ "opentelemetry/logs" "opentelemetry_sdk/logs" ]; "metrics" = [ "opentelemetry/metrics" "opentelemetry_sdk/metrics" ]; "prost" = [ "dep:prost" ]; "schemars" = [ "dep:schemars" ]; "serde" = [ "dep:serde" ]; - "serde_json" = [ "dep:serde_json" ]; "testing" = [ "opentelemetry/testing" ]; "tonic" = [ "dep:tonic" ]; "tonic-prost" = [ "dep:tonic-prost" ]; "trace" = [ "opentelemetry/trace" "opentelemetry_sdk/trace" ]; "with-schemars" = [ "schemars" ]; - "with-serde" = [ "serde" "const-hex" "base64" "serde_json" ]; + "with-serde" = [ "serde" "const-hex" "base64" ]; "zpages" = [ "trace" ]; }; resolvedDefaultFeatures = [ "gen-tonic" "gen-tonic-messages" "logs" "metrics" "prost" "tonic" "tonic-prost" "trace" ]; }; "opentelemetry-semantic-conventions" = rec { crateName = "opentelemetry-semantic-conventions"; - version = "0.31.0"; + version = "0.32.0"; edition = "2021"; - sha256 = "0in8plv2l2ar7anzi7lrbll0fjfvaymkg5vc5bnvibs1w3gjjbp6"; + sha256 = "0s1x4h1cgmhkxb7i5g02la2vhkf4lg5g26cgn2s2gd1p0j5gk8kc"; libName = "opentelemetry_semantic_conventions"; features = { }; @@ -6331,9 +6378,9 @@ rec { }; "opentelemetry_sdk" = rec { crateName = "opentelemetry_sdk"; - version = "0.31.0"; + version = "0.32.1"; edition = "2021"; - sha256 = "1gbjsggdxfpjbanjvaxa3nq32vfa37i3v13dvx4gsxhrk7sy8jp1"; + sha256 = "1ycl11syranrinhgn4c2hlzhyzyvpa06ryxq5mxgzmf4387ghncv"; dependencies = [ { name = "futures-channel"; @@ -6359,9 +6406,16 @@ rec { packageId = "percent-encoding"; optional = true; } + { + name = "portable-atomic"; + packageId = "portable-atomic"; + usesDefaultFeatures = false; + target = { target, features }: (!("64" == target."has_atomic" or null)); + features = [ "fallback" ]; + } { name = "rand"; - packageId = "rand 0.9.2"; + packageId = "rand 0.9.4"; optional = true; usesDefaultFeatures = false; features = [ "std" "std_rng" "small_rng" "os_rng" "thread_rng" ]; @@ -6383,10 +6437,18 @@ rec { optional = true; } ]; + devDependencies = [ + { + name = "tokio"; + packageId = "tokio"; + usesDefaultFeatures = false; + features = [ "macros" "rt-multi-thread" ]; + } + ]; features = { "default" = [ "trace" "metrics" "logs" "internal-logs" ]; "experimental_logs_batch_log_processor_with_async_runtime" = [ "logs" "experimental_async_runtime" ]; - "experimental_logs_concurrent_log_processor" = [ "logs" ]; + "experimental_metrics_bound_instruments" = [ "metrics" "opentelemetry/experimental_metrics_bound_instruments" ]; "experimental_metrics_custom_reader" = [ "metrics" ]; "experimental_metrics_disable_name_validation" = [ "metrics" ]; "experimental_metrics_periodicreader_with_async_runtime" = [ "metrics" "experimental_async_runtime" ]; @@ -6403,15 +6465,14 @@ rec { "rt-tokio-current-thread" = [ "tokio/rt" "tokio/time" "tokio-stream" "experimental_async_runtime" ]; "serde" = [ "dep:serde" ]; "serde_json" = [ "dep:serde_json" ]; - "spec_unstable_logs_enabled" = [ "logs" "opentelemetry/spec_unstable_logs_enabled" ]; "spec_unstable_metrics_views" = [ "metrics" ]; - "testing" = [ "opentelemetry/testing" "trace" "metrics" "logs" "rt-tokio" "rt-tokio-current-thread" "tokio/macros" "tokio/rt-multi-thread" ]; + "testing" = [ "opentelemetry/testing" "trace" "metrics" "logs" "tokio/sync" ]; "tokio" = [ "dep:tokio" ]; "tokio-stream" = [ "dep:tokio-stream" ]; "trace" = [ "opentelemetry/trace" "rand" "percent-encoding" ]; "url" = [ "dep:url" ]; }; - resolvedDefaultFeatures = [ "default" "experimental_async_runtime" "internal-logs" "logs" "metrics" "percent-encoding" "rand" "rt-tokio" "spec_unstable_logs_enabled" "tokio" "tokio-stream" "trace" ]; + resolvedDefaultFeatures = [ "default" "experimental_async_runtime" "internal-logs" "logs" "metrics" "percent-encoding" "rand" "rt-tokio" "tokio" "tokio-stream" "trace" ]; }; "ordered-float" = rec { crateName = "ordered-float"; @@ -6785,9 +6846,9 @@ rec { }; "pin-project" = rec { crateName = "pin-project"; - version = "1.1.11"; + version = "1.1.13"; edition = "2021"; - sha256 = "05zm3y3bl83ypsr6favxvny2kys4i19jiz1y18ylrbxwsiz9qx7i"; + sha256 = "09091qp946lpmjz4yp0xil1r5v4hgc91fi19dg5csayhdqrv4ri4"; libName = "pin_project"; dependencies = [ { @@ -6799,9 +6860,9 @@ rec { }; "pin-project-internal" = rec { crateName = "pin-project-internal"; - version = "1.1.11"; + version = "1.1.13"; edition = "2021"; - sha256 = "1ik4mpb92da75inmjvxf2qm61vrnwml3x24wddvrjlqh1z9hxcnr"; + sha256 = "12rzlh07i1sdgrvzj6wgkka5bjqyvbfsl8knq6qi7g16m7q9aqy9"; procMacro = true; libName = "pin_project_internal"; dependencies = [ @@ -6829,17 +6890,6 @@ rec { sha256 = "1kfmwvs271si96zay4mm8887v5khw0c27jc9srw1a75ykvgj54x8"; libName = "pin_project_lite"; - }; - "pin-utils" = rec { - crateName = "pin-utils"; - version = "0.1.0"; - edition = "2018"; - sha256 = "117ir7vslsl2z1a7qzhws4pd01cg2d3338c47swjyvqv2n60v1wb"; - libName = "pin_utils"; - authors = [ - "Josef Brandl " - ]; - }; "pkcs1" = rec { crateName = "pkcs1"; @@ -6911,9 +6961,9 @@ rec { }; "pkg-config" = rec { crateName = "pkg-config"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "0k4h3gnzs94sjb2ix6jyksacs52cf1fanpwsmlhjnwrdnp8dppby"; + sha256 = "17jnqmcbxsnwhg9gjf0nh6dj5k0x3hgwi3mb9krjnmfa9v435w8r"; libName = "pkg_config"; authors = [ "Alex Crichton " @@ -6931,13 +6981,13 @@ rec { "default" = [ "fallback" ]; "serde" = [ "dep:serde" ]; }; - resolvedDefaultFeatures = [ "require-cas" ]; + resolvedDefaultFeatures = [ "fallback" "require-cas" ]; }; "portable-atomic-util" = rec { crateName = "portable-atomic-util"; - version = "0.2.5"; + version = "0.2.7"; edition = "2018"; - sha256 = "1xcm0ia8756k6hdgafx4g3lx3fw0hvz2zqswq7c2sy58gxnvk7bs"; + sha256 = "0616j0fhy6y71hyxg3n86f6hng0fmsc269s3wp4gl8ww4p8hd8f2"; libName = "portable_atomic_util"; dependencies = [ { @@ -6948,15 +6998,16 @@ rec { } ]; features = { + "serde" = [ "dep:serde" ]; "std" = [ "alloc" ]; }; resolvedDefaultFeatures = [ "alloc" ]; }; "potential_utf" = rec { crateName = "potential_utf"; - version = "0.1.4"; + version = "0.1.5"; edition = "2021"; - sha256 = "0xxg0pkfpq299wvwln409z4fk80rbv55phh3f1jhjajy5x1ljfdp"; + sha256 = "0r0518fr32xbkgzqap509s3r60cr0iancsg9j1jgf37cyz7b20q1"; authors = [ "The ICU4X Project Developers" ]; @@ -7179,11 +7230,39 @@ rec { ]; }; + "prost-types" = rec { + crateName = "prost-types"; + version = "0.14.3"; + edition = "2021"; + sha256 = "1mrxrciryfgi6a0vmrgyj3g27r9hdhlgwkq71cgv3icbvg5w94c9"; + libName = "prost_types"; + authors = [ + "Dan Burkert " + "Lucio Franco " + "Casper Meijn " + "Tokio Contributors " + ]; + dependencies = [ + { + name = "prost"; + packageId = "prost"; + usesDefaultFeatures = false; + features = [ "derive" ]; + } + ]; + features = { + "arbitrary" = [ "dep:arbitrary" ]; + "chrono" = [ "dep:chrono" ]; + "default" = [ "std" ]; + "std" = [ "prost/std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "quote" = rec { crateName = "quote"; - version = "1.0.44"; + version = "1.0.45"; edition = "2021"; - sha256 = "1r7c7hxl66vz3q9qizgjhy77pdrrypqgk4ghc7260xvvfb7ypci1"; + sha256 = "095rb5rg7pbnwdp6v8w5jw93wndwyijgci1b5lw8j1h5cscn3wj1"; authors = [ "David Tolnay " ]; @@ -7212,11 +7291,11 @@ rec { "rustc-dep-of-std" = [ "core" ]; }; }; - "rand 0.8.5" = rec { + "rand 0.8.6" = rec { crateName = "rand"; - version = "0.8.5"; + version = "0.8.6"; edition = "2018"; - sha256 = "013l6931nn7gkc23jz5mm3qdhf93jjf0fg64nz2lp4i51qd8vbrl"; + sha256 = "12kd4rljn86m00rcaz4c1rcya4mb4gk5ig6i8xq00a8wjgxfr82w"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -7238,22 +7317,19 @@ rec { "default" = [ "std" "std_rng" ]; "getrandom" = [ "rand_core/getrandom" ]; "libc" = [ "dep:libc" ]; - "log" = [ "dep:log" ]; - "packed_simd" = [ "dep:packed_simd" ]; "rand_chacha" = [ "dep:rand_chacha" ]; "serde" = [ "dep:serde" ]; "serde1" = [ "serde" "rand_core/serde1" ]; - "simd_support" = [ "packed_simd" ]; "std" = [ "rand_core/std" "rand_chacha/std" "alloc" "getrandom" "libc" ]; "std_rng" = [ "rand_chacha" ]; }; resolvedDefaultFeatures = [ "rand_chacha" "std_rng" ]; }; - "rand 0.9.2" = rec { + "rand 0.9.4" = rec { crateName = "rand"; - version = "0.9.2"; + version = "0.9.4"; edition = "2021"; - sha256 = "1lah73ainvrgl7brcxx0pwhpnqa3sm3qaj672034jz8i0q7pgckd"; + sha256 = "1sknbxgs6nfg0nxdd7689lwbyr2i4vaswchrv4b34z8vpc3azia4"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -7273,7 +7349,6 @@ rec { ]; features = { "default" = [ "std" "std_rng" "os_rng" "small_rng" "thread_rng" ]; - "log" = [ "dep:log" ]; "os_rng" = [ "rand_core/os_rng" ]; "serde" = [ "dep:serde" "rand_core/serde" ]; "std" = [ "rand_core/std" "rand_chacha?/std" "alloc" ]; @@ -7598,9 +7673,9 @@ rec { }; "reqwest" = rec { crateName = "reqwest"; - version = "0.12.28"; + version = "0.13.4"; edition = "2021"; - sha256 = "0iqidijghgqbzl3bjg5hb4zmigwa4r612bgi0yiq0c90b6jkrpgd"; + sha256 = "1hy1plns9krbh3h1dy2sdjygsfkdcnxm6pbxdi0ya9b5vq8mi711"; authors = [ "Sean McArthur " ]; @@ -7617,7 +7692,7 @@ rec { name = "futures-channel"; packageId = "futures-channel"; optional = true; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); } { name = "futures-core"; @@ -7637,93 +7712,75 @@ rec { { name = "http-body"; packageId = "http-body"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); } { name = "http-body-util"; packageId = "http-body-util"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); } { name = "hyper"; packageId = "hyper"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "http1" "client" ]; } { name = "hyper-util"; packageId = "hyper-util"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "http1" "client" "client-legacy" "client-proxy" "tokio" ]; } { 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) || ("none" == target."os" or null))); } { name = "log"; packageId = "log"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); } { name = "percent-encoding"; packageId = "percent-encoding"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); } { name = "pin-project-lite"; packageId = "pin-project-lite"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); } { - name = "serde"; - packageId = "serde"; - } - { - name = "serde_json"; - packageId = "serde_json"; - optional = true; - } - { - name = "serde_json"; - packageId = "serde_json"; - target = { target, features }: ("wasm32" == target."arch" or null); - } - { - name = "serde_urlencoded"; - packageId = "serde_urlencoded"; - } - { - name = "sync_wrapper"; - packageId = "sync_wrapper"; - features = [ "futures" ]; + name = "sync_wrapper"; + packageId = "sync_wrapper"; + features = [ "futures" ]; } { name = "tokio"; packageId = "tokio"; usesDefaultFeatures = false; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "net" "time" ]; } { name = "tower"; packageId = "tower"; usesDefaultFeatures = false; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "retry" "timeout" "util" ]; } { name = "tower-http"; packageId = "tower-http"; usesDefaultFeatures = false; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "follow-redirect" ]; } { name = "tower-service"; packageId = "tower-service"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); } { name = "url"; @@ -7732,17 +7789,17 @@ rec { { 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) || ("none" == target."os" or null))); } { name = "wasm-bindgen-futures"; packageId = "wasm-bindgen-futures"; - target = { target, features }: ("wasm32" == target."arch" or null); + target = { target, features }: (("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null))); } { name = "web-sys"; packageId = "web-sys"; - target = { target, features }: ("wasm32" == target."arch" or null); + target = { target, features }: (("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null))); features = [ "AbortController" "AbortSignal" "Headers" "Request" "RequestInit" "RequestMode" "Response" "Window" "FormData" "Blob" "BlobPropertyBag" "ServiceWorkerGlobalScope" "RequestCredentials" "File" "ReadableStream" "RequestCache" ]; } ]; @@ -7751,33 +7808,27 @@ rec { name = "futures-util"; packageId = "futures-util"; usesDefaultFeatures = false; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "std" "alloc" ]; } { name = "hyper"; packageId = "hyper"; usesDefaultFeatures = false; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "http1" "http2" "client" "server" ]; } { name = "hyper-util"; packageId = "hyper-util"; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "http1" "http2" "client" "client-legacy" "server-auto" "server-graceful" "tokio" ]; } - { - name = "serde"; - packageId = "serde"; - target = { target, features }: (!("wasm32" == target."arch" or null)); - features = [ "derive" ]; - } { name = "tokio"; packageId = "tokio"; usesDefaultFeatures = false; - target = { target, features }: (!("wasm32" == target."arch" or null)); + target = { target, features }: (!(("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)))); features = [ "macros" "rt-multi-thread" ]; } { @@ -7789,40 +7840,37 @@ rec { { 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) || ("none" == target."os" or null))); features = [ "serde-serialize" ]; } ]; features = { + "__native-tls" = [ "dep:hyper-tls" "dep:native-tls-crate" "__tls" "dep:tokio-native-tls" ]; + "__native-tls-alpn" = [ "native-tls-crate?/alpn" "hyper-tls?/alpn" ]; "__rustls" = [ "dep:hyper-rustls" "dep:tokio-rustls" "dep:rustls" "__tls" ]; - "__rustls-ring" = [ "hyper-rustls?/ring" "tokio-rustls?/ring" "rustls?/ring" "quinn?/ring" ]; + "__rustls-aws-lc-rs" = [ "hyper-rustls?/aws-lc-rs" "tokio-rustls?/aws-lc-rs" "rustls?/aws-lc-rs" "quinn?/rustls-aws-lc-rs" ]; "__tls" = [ "dep:rustls-pki-types" "tokio/io-util" ]; "blocking" = [ "dep:futures-channel" "futures-channel?/sink" "dep:futures-util" "futures-util?/io" "futures-util?/sink" "tokio/sync" ]; "brotli" = [ "tower-http/decompression-br" ]; "charset" = [ "dep:encoding_rs" "dep:mime" ]; "cookies" = [ "dep:cookie_crate" "dep:cookie_store" ]; "default" = [ "default-tls" "charset" "http2" "system-proxy" ]; - "default-tls" = [ "dep:hyper-tls" "dep:native-tls-crate" "__tls" "dep:tokio-native-tls" ]; + "default-tls" = [ "rustls" ]; "deflate" = [ "tower-http/decompression-deflate" ]; + "form" = [ "dep:serde" "dep:serde_urlencoded" ]; "gzip" = [ "tower-http/decompression-gzip" ]; - "h2" = [ "dep:h2" ]; "hickory-dns" = [ "dep:hickory-resolver" "dep:once_cell" ]; - "http2" = [ "h2" "hyper/http2" "hyper-util/http2" "hyper-rustls?/http2" ]; - "http3" = [ "rustls-tls-manual-roots" "dep:h3" "dep:h3-quinn" "dep:quinn" "tokio/macros" ]; - "json" = [ "dep:serde_json" ]; - "macos-system-configuration" = [ "system-proxy" ]; + "http2" = [ "dep:h2" "hyper/http2" "hyper-util/http2" "hyper-rustls?/http2" ]; + "http3" = [ "rustls" "dep:h3" "dep:h3-quinn" "dep:quinn" "tokio/macros" ]; + "json" = [ "dep:serde" "dep:serde_json" ]; "multipart" = [ "dep:mime_guess" "dep:futures-util" ]; - "native-tls" = [ "default-tls" ]; - "native-tls-alpn" = [ "native-tls" "native-tls-crate?/alpn" "hyper-tls?/alpn" ]; - "native-tls-vendored" = [ "native-tls" "native-tls-crate?/vendored" ]; - "rustls-tls" = [ "rustls-tls-webpki-roots" ]; - "rustls-tls-manual-roots" = [ "rustls-tls-manual-roots-no-provider" "__rustls-ring" ]; - "rustls-tls-manual-roots-no-provider" = [ "__rustls" ]; - "rustls-tls-native-roots" = [ "rustls-tls-native-roots-no-provider" "__rustls-ring" ]; - "rustls-tls-native-roots-no-provider" = [ "dep:rustls-native-certs" "hyper-rustls?/native-tokio" "__rustls" ]; - "rustls-tls-no-provider" = [ "rustls-tls-manual-roots-no-provider" ]; - "rustls-tls-webpki-roots" = [ "rustls-tls-webpki-roots-no-provider" "__rustls-ring" ]; - "rustls-tls-webpki-roots-no-provider" = [ "dep:webpki-roots" "hyper-rustls?/webpki-tokio" "__rustls" ]; + "native-tls" = [ "__native-tls" "__native-tls-alpn" ]; + "native-tls-no-alpn" = [ "__native-tls" ]; + "native-tls-vendored" = [ "__native-tls" "native-tls-crate?/vendored" "__native-tls-alpn" ]; + "native-tls-vendored-no-alpn" = [ "__native-tls" "native-tls-crate?/vendored" ]; + "query" = [ "dep:serde" "dep:serde_urlencoded" ]; + "rustls" = [ "__rustls-aws-lc-rs" "dep:rustls-platform-verifier" "__rustls" ]; + "rustls-no-provider" = [ "dep:rustls-platform-verifier" "__rustls" ]; "stream" = [ "tokio/fs" "dep:futures-util" "dep:tokio-util" "dep:wasm-streams" ]; "system-proxy" = [ "hyper-util/client-proxy-system" ]; "zstd" = [ "tower-http/decompression-zstd" ]; @@ -8041,9 +8089,9 @@ rec { }; "rustls" = rec { crateName = "rustls"; - version = "0.23.37"; + version = "0.23.40"; edition = "2021"; - sha256 = "193k5h0wcih6ghvkrxyzwncivr1bd3a8yw3lzp13pzfcbz5jb03m"; + sha256 = "12qnv3ag4wrw7aj8jng74kgrilpjm2b1rfcjaac8h691frccv1pg"; dependencies = [ { name = "log"; @@ -8110,9 +8158,9 @@ rec { }; "rustls-native-certs" = rec { crateName = "rustls-native-certs"; - version = "0.8.3"; + version = "0.8.4"; edition = "2021"; - sha256 = "0qrajg2n90bcr3bcq6j95gjm7a9lirfkkdmjj32419dyyzan0931"; + sha256 = "0kgazl8zc1sv63qg179bz96ilzh56lzfa5k92ji7d265f4kibdfs"; libName = "rustls_native_certs"; dependencies = [ { @@ -8141,9 +8189,9 @@ rec { }; "rustls-pki-types" = rec { crateName = "rustls-pki-types"; - version = "1.14.0"; + version = "1.14.1"; edition = "2021"; - sha256 = "1p9zsgslvwzzkzhm6bqicffqndr4jpx67992b0vl0pi21a5hy15y"; + sha256 = "1a9pr54y0f3qr97bxpd3ahjldq0gqdld0h799xbnwdzbwxx1k9rh"; libName = "rustls_pki_types"; dependencies = [ { @@ -8222,9 +8270,9 @@ rec { }; "schannel" = rec { crateName = "schannel"; - version = "0.1.28"; + version = "0.1.29"; edition = "2018"; - sha256 = "1qb6s5gyxfz2inz753a4z3mc1d266mwvz0c5w7ppd3h44swq27c9"; + sha256 = "0ffrzz5vf2s3gnzvphgb5gg8fqifvryl07qcf7q3x1scj3jbghci"; authors = [ "Steven Fackler " "Steffen Butzer " @@ -8520,9 +8568,9 @@ rec { }; "semver" = rec { crateName = "semver"; - version = "1.0.27"; - edition = "2018"; - sha256 = "1qmi3akfrnqc2hfkdgcxhld5bv961wbk8my3ascv5068mc5fnryp"; + version = "1.0.28"; + edition = "2021"; + sha256 = "1kaimrpy876bcgi8bfj0qqfxk77zm9iz2zhn1hp9hj685z854y4a"; authors = [ "David Tolnay " ]; @@ -8679,9 +8727,9 @@ rec { }; "serde_json" = rec { crateName = "serde_json"; - version = "1.0.149"; + version = "1.0.150"; edition = "2021"; - sha256 = "11jdx4vilzrjjd1dpgy67x5lgzr0laplz30dhv75lnf5ffa07z43"; + sha256 = "1ffgfhy9kndjnrz8lmy95pr758p2zk8dxv6yi99x0vkkni24w0g8"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -8922,9 +8970,9 @@ rec { }; "shlex" = rec { crateName = "shlex"; - version = "1.3.0"; - edition = "2015"; - sha256 = "0r1y6bv26c1scpxvhg2cabimrmwgbp4p3wy6syj9n0c4s3q2znhg"; + version = "2.0.1"; + edition = "2018"; + sha256 = "1fjsll1cd7d2bcpdij9kd6w62rpbc7qqzvydvs021vsmr1cxvypq"; authors = [ "comex " "Fenhl " @@ -8992,9 +9040,9 @@ rec { }; "simd-adler32" = rec { crateName = "simd-adler32"; - version = "0.3.8"; + version = "0.3.9"; edition = "2018"; - sha256 = "18lx2gdgislabbvlgw5q3j5ssrr77v8kmkrxaanp3liimp2sc873"; + sha256 = "0532ysdwcvzyp2bwpk8qz0hijplcdwpssr5gy5r7qwqqy5z5qgbh"; libName = "simd_adler32"; authors = [ "Marvin Countryman " @@ -9103,29 +9151,25 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "default" "rust_1_61" "rust_1_65" "std" ]; }; - "snafu 0.9.0" = rec { + "snafu 0.9.1" = rec { crateName = "snafu"; - version = "0.9.0"; + version = "0.9.1"; edition = "2018"; - sha256 = "1ii9r99x5qcn754m624yzgb9hzvkqkrcygf0aqh0pyb9dbnvrm6i"; + sha256 = "08k5yfydxdlshivfhrdq9km8qn02r93q28gkyvazbqz2icr1586i"; authors = [ "Jake Goulding " ]; dependencies = [ { name = "snafu-derive"; - packageId = "snafu-derive 0.9.0"; + packageId = "snafu-derive 0.9.1"; } ]; features = { - "backtrace" = [ "dep:backtrace" ]; - "backtraces-impl-backtrace-crate" = [ "backtrace" ]; + "backtraces-impl-backtrace-crate" = [ "dep:backtrace" ]; "default" = [ "std" "rust_1_81" ]; - "futures" = [ "futures-core-crate" "pin-project" ]; - "futures-core-crate" = [ "dep:futures-core-crate" ]; - "futures-crate" = [ "dep:futures-crate" ]; - "internal-dev-dependencies" = [ "futures-crate" ]; - "pin-project" = [ "dep:pin-project" ]; + "futures" = [ "dep:futures-core" "dep:pin-project" ]; + "internal-dev-dependencies" = [ "dep:futures" ]; "std" = [ "alloc" ]; "unstable-provider-api" = [ "snafu-derive/unstable-provider-api" ]; }; @@ -9193,11 +9237,11 @@ rec { }; resolvedDefaultFeatures = [ "rust_1_61" ]; }; - "snafu-derive 0.9.0" = rec { + "snafu-derive 0.9.1" = rec { crateName = "snafu-derive"; - version = "0.9.0"; + version = "0.9.1"; edition = "2018"; - sha256 = "0h0x61kyj4fvilcr2nj02l85shw1ika64vq9brf2gyna662ln9al"; + sha256 = "1nkfi7bis72pz3w7vb64m79w49qsv20sbf19jkd471vbhr83q42z"; procMacro = true; libName = "snafu_derive"; authors = [ @@ -9223,7 +9267,7 @@ rec { name = "syn"; packageId = "syn 2.0.117"; usesDefaultFeatures = false; - features = [ "clone-impls" "derive" "full" "parsing" "printing" "proc-macro" ]; + features = [ "clone-impls" "derive" "full" "parsing" "printing" "proc-macro" "visit-mut" ]; } ]; features = { @@ -9231,9 +9275,9 @@ rec { }; "socket2" = rec { crateName = "socket2"; - version = "0.6.2"; + version = "0.6.4"; edition = "2021"; - sha256 = "1q073zkvz96h216mfz6niqk2kjqrgqv2va6zj34qh84zv4xamx46"; + sha256 = "0ldyp5rhba15spwxj1n94xh7sjks1398c3vwpwkxkd1087nwzlaj"; authors = [ "Alex Crichton " "Thomas de Zeeuw " @@ -9242,11 +9286,11 @@ rec { { name = "libc"; packageId = "libc"; - target = { target, features }: (target."unix" or false); + target = { target, features }: ((target."unix" or false) || ("wasi" == target."os" or null)); } { name = "windows-sys"; - packageId = "windows-sys 0.60.2"; + packageId = "windows-sys 0.61.2"; target = { target, features }: (target."windows" or false); features = [ "Win32_Foundation" "Win32_Networking_WinSock" "Win32_System_IO" "Win32_System_Threading" "Win32_System_WindowsProgramming" ]; } @@ -9331,8 +9375,8 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; libName = "stackable_certs"; @@ -9369,7 +9413,7 @@ rec { } { name = "rand"; - packageId = "rand 0.9.2"; + packageId = "rand 0.9.4"; } { name = "rand_core"; @@ -9391,7 +9435,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.0"; + packageId = "snafu 0.9.1"; } { name = "stackable-shared"; @@ -9434,8 +9478,8 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; libName = "stackable_operator"; @@ -9493,6 +9537,7 @@ rec { { name = "json-patch"; packageId = "json-patch"; + features = [ "schemars" ]; } { name = "k8s-openapi"; @@ -9512,7 +9557,7 @@ rec { } { name = "rand"; - packageId = "rand 0.9.2"; + packageId = "rand 0.9.4"; } { name = "regex"; @@ -9542,7 +9587,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.0"; + packageId = "snafu 0.9.1"; } { name = "stackable-operator-derive"; @@ -9596,12 +9641,17 @@ rec { packageId = "url"; features = [ "serde" ]; } + { + name = "uuid"; + packageId = "uuid"; + } ]; features = { "certs" = [ "dep:stackable-certs" ]; + "client-feature-gates" = [ "dep:winnow" ]; "crds" = [ "dep:stackable-versioned" ]; "default" = [ "crds" ]; - "full" = [ "crds" "certs" "time" "webhook" "kube-ws" ]; + "full" = [ "client-feature-gates" "crds" "certs" "time" "webhook" "kube-ws" ]; "kube-ws" = [ "kube/ws" ]; "time" = [ "stackable-shared/time" ]; "webhook" = [ "dep:stackable-webhook" ]; @@ -9614,8 +9664,8 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; procMacro = true; @@ -9645,12 +9695,12 @@ rec { }; "stackable-shared" = rec { crateName = "stackable-shared"; - version = "0.1.0"; + version = "0.1.1"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; libName = "stackable_shared"; @@ -9695,7 +9745,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.0"; + packageId = "snafu 0.9.1"; } { name = "strum"; @@ -9726,12 +9776,12 @@ rec { }; "stackable-telemetry" = rec { crateName = "stackable-telemetry"; - version = "0.6.3"; + version = "0.6.4"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; libName = "stackable_telemetry"; @@ -9775,7 +9825,7 @@ rec { { name = "opentelemetry_sdk"; packageId = "opentelemetry_sdk"; - features = [ "rt-tokio" "logs" "rt-tokio" "spec_unstable_logs_enabled" ]; + features = [ "rt-tokio" "logs" "rt-tokio" ]; } { name = "pin-project"; @@ -9783,7 +9833,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.0"; + packageId = "snafu 0.9.1"; } { name = "strum"; @@ -9840,8 +9890,8 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; libName = "stackable_versioned"; @@ -9875,7 +9925,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.0"; + packageId = "snafu 0.9.1"; } { name = "stackable-versioned-macros"; @@ -9890,8 +9940,8 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; procMacro = true; @@ -9958,8 +10008,8 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7a5f0c3fbcd091340214a23f0607fcd4b4fcc152"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "128e1afca7761d07058624091217b6d695fa790c"; sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; }; libName = "stackable_webhook"; @@ -10019,7 +10069,7 @@ rec { } { name = "rand"; - packageId = "rand 0.9.2"; + packageId = "rand 0.9.4"; } { name = "serde"; @@ -10032,7 +10082,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.0"; + packageId = "snafu 0.9.1"; } { name = "stackable-certs"; @@ -10126,12 +10176,12 @@ rec { packageId = "indoc"; } { - name = "pin-project"; - packageId = "pin-project"; + name = "java-properties"; + packageId = "java-properties"; } { - name = "product-config"; - packageId = "product-config"; + name = "pin-project"; + packageId = "pin-project"; } { name = "semver"; @@ -10148,7 +10198,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.0"; + packageId = "snafu 0.9.1"; } { name = "stackable-operator"; @@ -10267,6 +10317,16 @@ rec { }; resolvedDefaultFeatures = [ "i128" ]; }; + "symlink" = rec { + crateName = "symlink"; + version = "0.1.0"; + edition = "2015"; + sha256 = "02h1i0b81mxb4vns4xrvrfibpcvs7jqqav8p3yilwik8cv73r5x7"; + authors = [ + "Chris Morgan " + ]; + + }; "syn 1.0.109" = rec { crateName = "syn"; version = "1.0.109"; @@ -10607,9 +10667,9 @@ rec { }; "tinystr" = rec { crateName = "tinystr"; - version = "0.8.2"; + version = "0.8.3"; edition = "2021"; - sha256 = "0sa8z88axdsf088hgw5p4xcyi6g3w3sgbb6qdp81bph9bk2fkls2"; + sha256 = "0vfr8x285w6zsqhna0a9jyhylwiafb2kc8pj2qaqaahw48236cn8"; authors = [ "The ICU4X Project Developers" ]; @@ -10699,9 +10759,9 @@ rec { }; "tokio" = rec { crateName = "tokio"; - version = "1.50.0"; + version = "1.52.3"; edition = "2021"; - sha256 = "0bc2c5kd57p2xd4l6hagb0bkrp798k5vw0f3xzzwy0sf6ws5xb97"; + sha256 = "1zpzazypkg61sw91na1m85x5s4rsjym335fwwhwm1hcs70dz1iwg"; authors = [ "Tokio Contributors " ]; @@ -10717,6 +10777,12 @@ rec { optional = true; target = { target, features }: ((target."tokio_unstable" or false) && ("linux" == target."os" or null)); } + { + name = "libc"; + packageId = "libc"; + optional = true; + target = { target, features }: ("wasi" == target."os" or null); + } { name = "libc"; packageId = "libc"; @@ -10756,7 +10822,7 @@ rec { name = "socket2"; packageId = "socket2"; optional = true; - target = { target, features }: (!(builtins.elem "wasm" target."family")); + target = { target, features }: ((!(builtins.elem "wasm" target."family")) || (("wasi" == target."os" or null) && (!("p1" == target."env" or null)))); features = [ "all" ]; } { @@ -10814,9 +10880,9 @@ rec { }; "tokio-macros" = rec { crateName = "tokio-macros"; - version = "2.6.1"; + version = "2.7.0"; edition = "2021"; - sha256 = "172nwz3s7mmh266hb8l5xdnc7v9kqahisppqhinfd75nz3ps4maw"; + sha256 = "15m4f37mdafs0gg36sh0rskm1i768lb7zmp8bw67kaxr3avnqniq"; procMacro = true; libName = "tokio_macros"; authors = [ @@ -11038,9 +11104,9 @@ rec { }; "tonic" = rec { crateName = "tonic"; - version = "0.14.5"; - edition = "2021"; - sha256 = "1v4k7aa28m7722gz9qak2jiy7lis1ycm4fdmq63iip4m0qdcdizy"; + version = "0.14.6"; + edition = "2024"; + sha256 = "1vs5ci6z6b9xhfsnx4s8qx6bqi1zzcrxncjp71147a0gqwc5aamc"; authors = [ "Lucio Franco " ]; @@ -11167,9 +11233,9 @@ rec { }; "tonic-prost" = rec { crateName = "tonic-prost"; - version = "0.14.5"; - edition = "2021"; - sha256 = "02fkg2bv87q0yds2wz3w0s7i1x6qcgbrl00dy6ipajdapfh7clx5"; + version = "0.14.6"; + edition = "2024"; + sha256 = "184y40nf0iyzc5rg32ivgd88snv68sqy1kchynn55r1vhml9z12h"; libName = "tonic_prost"; authors = [ "Lucio Franco " @@ -11190,6 +11256,33 @@ rec { } ]; + }; + "tonic-types" = rec { + crateName = "tonic-types"; + version = "0.14.6"; + edition = "2024"; + sha256 = "1s286gg71pjajny8xar0azq1w9lgz1ks3jm3pccxb0qz0q11pavk"; + libName = "tonic_types"; + authors = [ + "Lucio Franco " + "Rafael Lemos " + ]; + dependencies = [ + { + name = "prost"; + packageId = "prost"; + } + { + name = "prost-types"; + packageId = "prost-types"; + } + { + name = "tonic"; + packageId = "tonic"; + usesDefaultFeatures = false; + } + ]; + }; "tower" = rec { crateName = "tower"; @@ -11311,9 +11404,9 @@ rec { }; "tower-http" = rec { crateName = "tower-http"; - version = "0.6.8"; + version = "0.6.11"; edition = "2018"; - sha256 = "1y514jwzbyrmrkbaajpwmss4rg0mak82k16d6588w9ncaffmbrnl"; + sha256 = "0h08wjgs3hwnq11iwwzlmnabn1h4cl0fzd48svaccvqffkiggz2c"; libName = "tower_http"; authors = [ "Tower Maintainers " @@ -11347,11 +11440,6 @@ rec { packageId = "http-body"; optional = true; } - { - name = "iri-string"; - packageId = "iri-string"; - optional = true; - } { name = "mime"; packageId = "mime"; @@ -11381,6 +11469,11 @@ rec { optional = true; usesDefaultFeatures = false; } + { + name = "url"; + packageId = "url"; + optional = true; + } ]; devDependencies = [ { @@ -11402,35 +11495,33 @@ rec { } ]; features = { - "async-compression" = [ "dep:async-compression" ]; "auth" = [ "base64" "validate-request" ]; "base64" = [ "dep:base64" ]; "catch-panic" = [ "tracing" "futures-util/std" "dep:http-body" "dep:http-body-util" ]; - "compression-br" = [ "async-compression/brotli" "futures-core" "dep:http-body" "tokio-util" "tokio" ]; - "compression-deflate" = [ "async-compression/zlib" "futures-core" "dep:http-body" "tokio-util" "tokio" ]; + "compression-br" = [ "dep:async-compression" "async-compression?/brotli" "futures-core" "dep:http-body" "tokio-util" "dep:tokio" ]; + "compression-deflate" = [ "dep:async-compression" "async-compression?/zlib" "futures-core" "dep:http-body" "tokio-util" "dep:tokio" ]; "compression-full" = [ "compression-br" "compression-deflate" "compression-gzip" "compression-zstd" ]; - "compression-gzip" = [ "async-compression/gzip" "futures-core" "dep:http-body" "tokio-util" "tokio" ]; - "compression-zstd" = [ "async-compression/zstd" "futures-core" "dep:http-body" "tokio-util" "tokio" ]; - "decompression-br" = [ "async-compression/brotli" "futures-core" "dep:http-body" "dep:http-body-util" "tokio-util" "tokio" ]; - "decompression-deflate" = [ "async-compression/zlib" "futures-core" "dep:http-body" "dep:http-body-util" "tokio-util" "tokio" ]; + "compression-gzip" = [ "dep:async-compression" "async-compression?/gzip" "futures-core" "dep:http-body" "tokio-util" "dep:tokio" ]; + "compression-zstd" = [ "dep:async-compression" "async-compression?/zstd" "futures-core" "dep:http-body" "tokio-util" "dep:tokio" ]; + "decompression-br" = [ "dep:async-compression" "async-compression?/brotli" "futures-core" "dep:http-body" "dep:http-body-util" "tokio-util" "dep:tokio" ]; + "decompression-deflate" = [ "dep:async-compression" "async-compression?/zlib" "futures-core" "dep:http-body" "dep:http-body-util" "tokio-util" "dep:tokio" ]; "decompression-full" = [ "decompression-br" "decompression-deflate" "decompression-gzip" "decompression-zstd" ]; - "decompression-gzip" = [ "async-compression/gzip" "futures-core" "dep:http-body" "dep:http-body-util" "tokio-util" "tokio" ]; - "decompression-zstd" = [ "async-compression/zstd" "futures-core" "dep:http-body" "dep:http-body-util" "tokio-util" "tokio" ]; - "follow-redirect" = [ "futures-util" "dep:http-body" "iri-string" "tower/util" ]; - "fs" = [ "futures-core" "futures-util" "dep:http-body" "dep:http-body-util" "tokio/fs" "tokio-util/io" "tokio/io-util" "dep:http-range-header" "mime_guess" "mime" "percent-encoding" "httpdate" "set-status" "futures-util/alloc" "tracing" ]; - "full" = [ "add-extension" "auth" "catch-panic" "compression-full" "cors" "decompression-full" "follow-redirect" "fs" "limit" "map-request-body" "map-response-body" "metrics" "normalize-path" "propagate-header" "redirect" "request-id" "sensitive-headers" "set-header" "set-status" "timeout" "trace" "util" "validate-request" ]; + "decompression-gzip" = [ "dep:async-compression" "async-compression?/gzip" "futures-core" "dep:http-body" "dep:http-body-util" "tokio-util" "dep:tokio" ]; + "decompression-zstd" = [ "dep:async-compression" "async-compression?/zstd" "futures-core" "dep:http-body" "dep:http-body-util" "tokio-util" "dep:tokio" ]; + "follow-redirect" = [ "futures-util" "dep:http-body" "dep:url" "tower/util" ]; + "fs" = [ "dep:tokio" "tokio?/fs" "tokio?/io-util" "futures-core" "futures-util" "dep:http-body" "dep:http-body-util" "tokio-util/io" "dep:http-range-header" "mime_guess" "mime" "percent-encoding" "httpdate" "set-status" "futures-util/alloc" ]; + "full" = [ "add-extension" "auth" "catch-panic" "compression-full" "cors" "decompression-full" "follow-redirect" "fs" "limit" "map-request-body" "map-response-body" "metrics" "normalize-path" "on-early-drop" "propagate-header" "redirect" "request-id" "sensitive-headers" "set-header" "set-status" "timeout" "trace" "util" "validate-request" ]; "futures-core" = [ "dep:futures-core" ]; "futures-util" = [ "dep:futures-util" ]; "httpdate" = [ "dep:httpdate" ]; - "iri-string" = [ "dep:iri-string" ]; "limit" = [ "dep:http-body" "dep:http-body-util" ]; - "metrics" = [ "dep:http-body" "tokio/time" ]; + "metrics" = [ "dep:http-body" "dep:tokio" "tokio?/time" ]; "mime" = [ "dep:mime" ]; "mime_guess" = [ "dep:mime_guess" ]; + "on-early-drop" = [ "dep:http-body" ]; "percent-encoding" = [ "dep:percent-encoding" ]; "request-id" = [ "uuid" ]; - "timeout" = [ "dep:http-body" "tokio/time" ]; - "tokio" = [ "dep:tokio" ]; + "timeout" = [ "dep:http-body" "dep:tokio" "tokio?/time" ]; "tokio-util" = [ "dep:tokio-util" ]; "tower" = [ "dep:tower" ]; "trace" = [ "dep:http-body" "tracing" ]; @@ -11439,7 +11530,7 @@ rec { "uuid" = [ "dep:uuid" ]; "validate-request" = [ "mime" ]; }; - resolvedDefaultFeatures = [ "auth" "base64" "default" "follow-redirect" "futures-util" "iri-string" "map-response-body" "mime" "tower" "trace" "tracing" "util" "validate-request" ]; + resolvedDefaultFeatures = [ "auth" "base64" "default" "follow-redirect" "futures-util" "map-response-body" "mime" "tower" "trace" "tracing" "util" "validate-request" ]; }; "tower-layer" = rec { crateName = "tower-layer"; @@ -11512,9 +11603,9 @@ rec { }; "tracing-appender" = rec { crateName = "tracing-appender"; - version = "0.2.4"; + version = "0.2.5"; edition = "2018"; - sha256 = "1bxf7xvsr89glbq174cx0b9pinaacbhlmc85y1ssniv2rq5lhvbq"; + sha256 = "0g4a6q5s3wafid5lqw1ljzvh1nhk3a4zmb627fxv96dr7qcqc1h5"; libName = "tracing_appender"; authors = [ "Zeki Sherif " @@ -11525,6 +11616,10 @@ rec { name = "crossbeam-channel"; packageId = "crossbeam-channel"; } + { + name = "symlink"; + packageId = "symlink"; + } { name = "thiserror"; packageId = "thiserror 2.0.18"; @@ -11642,9 +11737,9 @@ rec { }; "tracing-opentelemetry" = rec { crateName = "tracing-opentelemetry"; - version = "0.32.1"; + version = "0.33.0"; edition = "2021"; - sha256 = "1z2jjmxbkm1qawlb3bm99x8xwf4g8wjkbcknm9z4fv1w14nqzhhs"; + sha256 = "09nvxy5m7nxmifz4b6szdcyczapp2jcgxcac0jw4ax8klz5n9g5d"; libName = "tracing_opentelemetry"; dependencies = [ { @@ -11746,9 +11841,9 @@ rec { }; "tracing-subscriber" = rec { crateName = "tracing-subscriber"; - version = "0.3.22"; + version = "0.3.23"; edition = "2018"; - sha256 = "07hz575a0p1c2i4xw3gs3hkrykhndnkbfhyqdwjhvayx4ww18c1g"; + sha256 = "06fkr0qhggvrs861d7f74pn3i3a10h5jsp4n70jj9ys5b675fzyb"; libName = "tracing_subscriber"; authors = [ "Eliza Weisman " @@ -11879,13 +11974,9 @@ rec { }; "typenum" = rec { crateName = "typenum"; - version = "1.19.0"; + version = "1.20.1"; edition = "2018"; - sha256 = "1fw2mpbn2vmqan56j1b3fbpcdg80mz26fm53fs16bq5xcq84hban"; - authors = [ - "Paho Lurie-Gregg " - "Andre Bogus " - ]; + sha256 = "086s9ly0906kw5yw41249fba97w5zfxf03pyfwdkffvcprqfixdn"; features = { "scale-info" = [ "dep:scale-info" ]; "scale_info" = [ "scale-info/derive" ]; @@ -11918,9 +12009,9 @@ rec { }; "unicode-segmentation" = rec { crateName = "unicode-segmentation"; - version = "1.12.0"; + version = "1.13.3"; edition = "2018"; - sha256 = "14qla2jfx74yyb9ds3d2mpwpa4l4lzb9z57c6d2ba511458z5k7n"; + sha256 = "1a47zaq83p386r3baq4m018xd5q4q0grdg56i1x042dzn71x7xf6"; libName = "unicode_segmentation"; authors = [ "kwantam " @@ -12046,6 +12137,66 @@ rec { }; resolvedDefaultFeatures = [ "default" ]; }; + "uuid" = rec { + crateName = "uuid"; + version = "1.23.2"; + edition = "2021"; + sha256 = "1xy942s4z0bi8p3441wvd4ry3hx6ry1c7s6fgrr38462xqybhn6j"; + authors = [ + "Ashley Mannix" + "Dylan DPC" + "Hunar Roop Kahlon" + ]; + dependencies = [ + { + name = "js-sys"; + packageId = "js-sys"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: (("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null)) && (builtins.elem "atomics" targetFeatures)); + } + { + name = "wasm-bindgen"; + packageId = "wasm-bindgen"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: (("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null))); + } + ]; + devDependencies = [ + { + name = "wasm-bindgen"; + packageId = "wasm-bindgen"; + target = { target, features }: (("wasm32" == target."arch" or null) && (("unknown" == target."os" or null) || ("none" == target."os" or null))); + } + ]; + features = { + "arbitrary" = [ "dep:arbitrary" ]; + "atomic" = [ "dep:atomic" ]; + "borsh" = [ "dep:borsh" "dep:borsh-derive" ]; + "bytemuck" = [ "dep:bytemuck" ]; + "default" = [ "std" ]; + "fast-rng" = [ "rng" "dep:rand" ]; + "js" = [ "dep:wasm-bindgen" "dep:js-sys" ]; + "md5" = [ "dep:md-5" ]; + "rng" = [ "dep:getrandom" ]; + "rng-getrandom" = [ "rng" "dep:getrandom" "uuid-rng-internal-lib" "uuid-rng-internal-lib/getrandom" ]; + "rng-rand" = [ "rng" "dep:rand" "uuid-rng-internal-lib" "uuid-rng-internal-lib/rand" ]; + "serde" = [ "dep:serde_core" ]; + "sha1" = [ "dep:sha1_smol" ]; + "slog" = [ "dep:slog" ]; + "std" = [ "wasm-bindgen?/std" "js-sys?/std" ]; + "uuid-rng-internal-lib" = [ "dep:uuid-rng-internal-lib" ]; + "v1" = [ "atomic" ]; + "v3" = [ "md5" ]; + "v4" = [ "rng" ]; + "v5" = [ "sha1" ]; + "v6" = [ "atomic" ]; + "v7" = [ "rng" ]; + "zerocopy" = [ "dep:zerocopy" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; "valuable" = rec { crateName = "valuable"; version = "0.1.1"; @@ -12113,9 +12264,9 @@ rec { }; "wasip2" = rec { crateName = "wasip2"; - version = "1.0.2+wasi-0.2.9"; + version = "1.0.3+wasi-0.2.9"; edition = "2021"; - sha256 = "1xdw7v08jpfjdg94sp4lbdgzwa587m5ifpz6fpdnkh02kwizj5wm"; + sha256 = "1mi3w855dz99xzjqc4aa8c9q5b6z1y5c963pkk4cvmr6vdr4c1i0"; dependencies = [ { name = "wit-bindgen"; @@ -12133,9 +12284,9 @@ rec { }; "wasm-bindgen" = rec { crateName = "wasm-bindgen"; - version = "0.2.114"; + version = "0.2.122"; edition = "2021"; - sha256 = "13nkhw552hpllrrmkd2x9y4bmcxr82kdpky2n667kqzcq6jzjck5"; + sha256 = "02flix96brsb2r1i3grnikii302iqpdm337kl3xv5lklz5v4bl1y"; libName = "wasm_bindgen"; authors = [ "The wasm-bindgen Developers" @@ -12184,62 +12335,37 @@ rec { }; "wasm-bindgen-futures" = rec { crateName = "wasm-bindgen-futures"; - version = "0.4.64"; + version = "0.4.72"; edition = "2021"; - sha256 = "1f3xnr40wwims4zhvh119dhwmffz4h4x82cffi118ri878mm5ig9"; + sha256 = "03qb24gfr072rk8hb69glfdc8yhqqqq2rhy3j5i0ps8sk79dnwwl"; libName = "wasm_bindgen_futures"; authors = [ "The wasm-bindgen Developers" ]; dependencies = [ - { - name = "cfg-if"; - packageId = "cfg-if"; - } - { - name = "futures-util"; - packageId = "futures-util"; - optional = true; - usesDefaultFeatures = false; - features = [ "std" ]; - } { name = "js-sys"; packageId = "js-sys"; usesDefaultFeatures = false; } - { - name = "once_cell"; - packageId = "once_cell"; - usesDefaultFeatures = false; - } { name = "wasm-bindgen"; packageId = "wasm-bindgen"; usesDefaultFeatures = false; } - { - name = "web-sys"; - packageId = "web-sys"; - usesDefaultFeatures = false; - target = { target, features }: (builtins.elem "atomics" targetFeatures); - features = [ "MessageEvent" "Worker" ]; - } ]; features = { "default" = [ "std" ]; - "futures-core" = [ "dep:futures-core" ]; - "futures-core-03-stream" = [ "futures-core" ]; - "futures-util" = [ "dep:futures-util" ]; - "std" = [ "wasm-bindgen/std" "js-sys/std" "web-sys/std" "futures-util" ]; + "futures-core-03-stream" = [ "js-sys/futures-core-03-stream" ]; + "std" = [ "wasm-bindgen/std" "js-sys/std" ]; }; - resolvedDefaultFeatures = [ "default" "futures-util" "std" ]; + resolvedDefaultFeatures = [ "default" "std" ]; }; "wasm-bindgen-macro" = rec { crateName = "wasm-bindgen-macro"; - version = "0.2.114"; + version = "0.2.122"; edition = "2021"; - sha256 = "1rhq9kkl7n0zjrag9p25xsi4aabpgfkyf02zn4xv6pqhrw7xb8hq"; + sha256 = "1inyl55bvdifx7l60q9wl0ivmw7236jg7jqmcqpxhsx3knq52qci"; procMacro = true; libName = "wasm_bindgen_macro"; authors = [ @@ -12261,9 +12387,9 @@ rec { }; "wasm-bindgen-macro-support" = rec { crateName = "wasm-bindgen-macro-support"; - version = "0.2.114"; + version = "0.2.122"; edition = "2021"; - sha256 = "1qriqqjpn922kv5c7f7627fj823k5aifv06j2gvwsiy5map4rkh3"; + sha256 = "0pjw5kc2mbfz59agk5l21kh4hxzp94rygdvsnr4f3z6b5hv4g419"; libName = "wasm_bindgen_macro_support"; authors = [ "The wasm-bindgen Developers" @@ -12297,10 +12423,10 @@ rec { }; "wasm-bindgen-shared" = rec { crateName = "wasm-bindgen-shared"; - version = "0.2.114"; + version = "0.2.122"; edition = "2021"; links = "wasm_bindgen"; - sha256 = "05lc6w64jxlk4wk8rjci4z61lhx2ams90la27a41gvi3qaw2d8vm"; + sha256 = "0ds4mmfqvxwc5fp33hn0jblf0f6b4lghrd9mpkls66zic4n9p4ls"; libName = "wasm_bindgen_shared"; authors = [ "The wasm-bindgen Developers" @@ -12315,9 +12441,9 @@ rec { }; "web-sys" = rec { crateName = "web-sys"; - version = "0.3.91"; + version = "0.3.99"; edition = "2021"; - sha256 = "1y91r8f4dy4iqgrr03swdzqffz6wmllrgninp8kgpaq4n5xs2jw5"; + sha256 = "0dilfvl9jnyhi4skl6cry9wc300r693j0w82jjbq8yy3rx0i8qkd"; libName = "web_sys"; authors = [ "The wasm-bindgen Developers" @@ -12401,6 +12527,7 @@ rec { "CssStyleSheet" = [ "StyleSheet" ]; "CssSupportsRule" = [ "CssConditionRule" "CssGroupingRule" "CssRule" ]; "CssTransition" = [ "Animation" "EventTarget" ]; + "CssViewTransitionRule" = [ "CssRule" ]; "CustomEvent" = [ "Event" ]; "DedicatedWorkerGlobalScope" = [ "EventTarget" "WorkerGlobalScope" ]; "DelayNode" = [ "AudioNode" "EventTarget" ]; @@ -12807,7 +12934,7 @@ rec { "default" = [ "std" ]; "std" = [ "wasm-bindgen/std" "js-sys/std" ]; }; - resolvedDefaultFeatures = [ "AbortController" "AbortSignal" "Blob" "BlobPropertyBag" "Event" "EventTarget" "File" "FormData" "Headers" "MessageEvent" "ReadableStream" "Request" "RequestCache" "RequestCredentials" "RequestInit" "RequestMode" "Response" "ServiceWorkerGlobalScope" "Window" "Worker" "WorkerGlobalScope" "default" "std" ]; + resolvedDefaultFeatures = [ "AbortController" "AbortSignal" "Blob" "BlobPropertyBag" "EventTarget" "File" "FormData" "Headers" "ReadableStream" "Request" "RequestCache" "RequestCredentials" "RequestInit" "RequestMode" "Response" "ServiceWorkerGlobalScope" "Window" "WorkerGlobalScope" "default" "std" ]; }; "web-time" = rec { crateName = "web-time"; @@ -12981,7 +13108,7 @@ rec { dependencies = [ { name = "windows-targets"; - packageId = "windows-targets 0.52.6"; + packageId = "windows-targets"; } ]; features = { @@ -13217,19 +13344,16 @@ rec { }; resolvedDefaultFeatures = [ "Win32" "Win32_Foundation" "Win32_System" "Win32_System_Threading" "default" ]; }; - "windows-sys 0.60.2" = rec { + "windows-sys 0.61.2" = rec { crateName = "windows-sys"; - version = "0.60.2"; + version = "0.61.2"; edition = "2021"; - sha256 = "1jrbc615ihqnhjhxplr2kw7rasrskv9wj3lr80hgfd42sbj01xgj"; + sha256 = "1z7k3y9b6b5h52kid57lvmvm05362zv1v8w0gc7xyv5xphlp44xf"; libName = "windows_sys"; - authors = [ - "Microsoft" - ]; dependencies = [ { - name = "windows-targets"; - packageId = "windows-targets 0.53.5"; + name = "windows-link"; + packageId = "windows-link"; usesDefaultFeatures = false; } ]; @@ -13480,380 +13604,62 @@ rec { "Win32_Web" = [ "Win32" ]; "Win32_Web_InternetExplorer" = [ "Win32_Web" ]; }; - resolvedDefaultFeatures = [ "Win32" "Win32_Foundation" "Win32_Networking" "Win32_Networking_WinSock" "Win32_System" "Win32_System_IO" "Win32_System_Threading" "Win32_System_WindowsProgramming" "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_Security_Authentication" "Win32_Security_Authentication_Identity" "Win32_Security_Credentials" "Win32_Security_Cryptography" "Win32_Storage" "Win32_Storage_FileSystem" "Win32_System" "Win32_System_Console" "Win32_System_Diagnostics" "Win32_System_Diagnostics_Debug" "Win32_System_IO" "Win32_System_LibraryLoader" "Win32_System_Memory" "Win32_System_Pipes" "Win32_System_SystemInformation" "Win32_System_SystemServices" "Win32_System_Threading" "Win32_System_WindowsProgramming" "default" ]; }; - "windows-sys 0.61.2" = rec { - crateName = "windows-sys"; - version = "0.61.2"; + "windows-targets" = rec { + crateName = "windows-targets"; + version = "0.52.6"; edition = "2021"; - sha256 = "1z7k3y9b6b5h52kid57lvmvm05362zv1v8w0gc7xyv5xphlp44xf"; - libName = "windows_sys"; + sha256 = "0wwrx625nwlfp7k93r2rra568gad1mwd888h1jwnl0vfg5r4ywlv"; + libName = "windows_targets"; + authors = [ + "Microsoft" + ]; dependencies = [ { - name = "windows-link"; - packageId = "windows-link"; - usesDefaultFeatures = false; - } - ]; - 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_Beep" = [ "Win32_Devices" ]; - "Win32_Devices_BiometricFramework" = [ "Win32_Devices" ]; - "Win32_Devices_Bluetooth" = [ "Win32_Devices" ]; - "Win32_Devices_Cdrom" = [ "Win32_Devices" ]; - "Win32_Devices_Communication" = [ "Win32_Devices" ]; - "Win32_Devices_DeviceAndDriverInstallation" = [ "Win32_Devices" ]; - "Win32_Devices_DeviceQuery" = [ "Win32_Devices" ]; - "Win32_Devices_Display" = [ "Win32_Devices" ]; - "Win32_Devices_Dvd" = [ "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_Nfc" = [ "Win32_Devices" ]; - "Win32_Devices_Nfp" = [ "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 = [ "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_Console" "Win32_System_Diagnostics" "Win32_System_Diagnostics_Debug" "Win32_System_IO" "Win32_System_LibraryLoader" "Win32_System_Memory" "Win32_System_Pipes" "Win32_System_SystemInformation" "Win32_System_SystemServices" "Win32_System_Threading" "Win32_System_Time" "Win32_System_WindowsProgramming" "default" ]; - }; - "windows-targets 0.52.6" = rec { - crateName = "windows-targets"; - version = "0.52.6"; - edition = "2021"; - sha256 = "0wwrx625nwlfp7k93r2rra568gad1mwd888h1jwnl0vfg5r4ywlv"; - libName = "windows_targets"; - authors = [ - "Microsoft" - ]; - dependencies = [ - { - name = "windows_aarch64_gnullvm"; - packageId = "windows_aarch64_gnullvm 0.52.6"; - target = { target, features }: (target.name == "aarch64-pc-windows-gnullvm"); - } - { - name = "windows_aarch64_msvc"; - packageId = "windows_aarch64_msvc 0.52.6"; - target = { target, features }: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); - } - { - name = "windows_i686_gnu"; - packageId = "windows_i686_gnu 0.52.6"; - target = { target, features }: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); - } - { - name = "windows_i686_gnullvm"; - packageId = "windows_i686_gnullvm 0.52.6"; - target = { target, features }: (target.name == "i686-pc-windows-gnullvm"); - } - { - name = "windows_i686_msvc"; - packageId = "windows_i686_msvc 0.52.6"; - target = { target, features }: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); - } - { - name = "windows_x86_64_gnu"; - packageId = "windows_x86_64_gnu 0.52.6"; - target = { target, features }: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); - } - { - name = "windows_x86_64_gnullvm"; - packageId = "windows_x86_64_gnullvm 0.52.6"; - target = { target, features }: (target.name == "x86_64-pc-windows-gnullvm"); - } - { - name = "windows_x86_64_msvc"; - packageId = "windows_x86_64_msvc 0.52.6"; - target = { target, features }: ((("x86_64" == target."arch" or null) || ("arm64ec" == target."arch" or null)) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + name = "windows_aarch64_gnullvm"; + packageId = "windows_aarch64_gnullvm"; + target = { target, features }: (target.name == "aarch64-pc-windows-gnullvm"); + } + { + name = "windows_aarch64_msvc"; + packageId = "windows_aarch64_msvc"; + target = { target, features }: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + } + { + name = "windows_i686_gnu"; + packageId = "windows_i686_gnu"; + target = { target, features }: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); + } + { + name = "windows_i686_gnullvm"; + packageId = "windows_i686_gnullvm"; + target = { target, features }: (target.name == "i686-pc-windows-gnullvm"); + } + { + name = "windows_i686_msvc"; + packageId = "windows_i686_msvc"; + target = { target, features }: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + } + { + name = "windows_x86_64_gnu"; + packageId = "windows_x86_64_gnu"; + target = { target, features }: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); + } + { + name = "windows_x86_64_gnullvm"; + packageId = "windows_x86_64_gnullvm"; + target = { target, features }: (target.name == "x86_64-pc-windows-gnullvm"); + } + { + name = "windows_x86_64_msvc"; + packageId = "windows_x86_64_msvc"; + target = { target, features }: ((("x86_64" == target."arch" or null) || ("arm64ec" == target."arch" or null)) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } ]; }; - "windows-targets 0.53.5" = rec { - crateName = "windows-targets"; - version = "0.53.5"; - edition = "2021"; - sha256 = "1wv9j2gv3l6wj3gkw5j1kr6ymb5q6dfc42yvydjhv3mqa7szjia9"; - libName = "windows_targets"; - dependencies = [ - { - name = "windows-link"; - packageId = "windows-link"; - usesDefaultFeatures = false; - target = { target, features }: (target."windows_raw_dylib" or false); - } - { - name = "windows_aarch64_gnullvm"; - packageId = "windows_aarch64_gnullvm 0.53.1"; - target = { target, features }: (target.name == "aarch64-pc-windows-gnullvm"); - } - { - name = "windows_aarch64_msvc"; - packageId = "windows_aarch64_msvc 0.53.1"; - target = { target, features }: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); - } - { - name = "windows_i686_gnu"; - packageId = "windows_i686_gnu 0.53.1"; - target = { target, features }: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); - } - { - name = "windows_i686_gnullvm"; - packageId = "windows_i686_gnullvm 0.53.1"; - target = { target, features }: (target.name == "i686-pc-windows-gnullvm"); - } - { - name = "windows_i686_msvc"; - packageId = "windows_i686_msvc 0.53.1"; - target = { target, features }: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); - } - { - name = "windows_x86_64_gnu"; - packageId = "windows_x86_64_gnu 0.53.1"; - target = { target, features }: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); - } - { - name = "windows_x86_64_gnullvm"; - packageId = "windows_x86_64_gnullvm 0.53.1"; - target = { target, features }: (target.name == "x86_64-pc-windows-gnullvm"); - } - { - name = "windows_x86_64_msvc"; - packageId = "windows_x86_64_msvc 0.53.1"; - target = { target, features }: ((("x86_64" == target."arch" or null) || ("arm64ec" == target."arch" or null)) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); - } - ]; - - }; - "windows_aarch64_gnullvm 0.52.6" = rec { + "windows_aarch64_gnullvm" = rec { crateName = "windows_aarch64_gnullvm"; version = "0.52.6"; edition = "2021"; @@ -13863,14 +13669,7 @@ rec { ]; }; - "windows_aarch64_gnullvm 0.53.1" = rec { - crateName = "windows_aarch64_gnullvm"; - version = "0.53.1"; - edition = "2021"; - sha256 = "0lqvdm510mka9w26vmga7hbkmrw9glzc90l4gya5qbxlm1pl3n59"; - - }; - "windows_aarch64_msvc 0.52.6" = rec { + "windows_aarch64_msvc" = rec { crateName = "windows_aarch64_msvc"; version = "0.52.6"; edition = "2021"; @@ -13880,14 +13679,7 @@ rec { ]; }; - "windows_aarch64_msvc 0.53.1" = rec { - crateName = "windows_aarch64_msvc"; - version = "0.53.1"; - edition = "2021"; - sha256 = "01jh2adlwx043rji888b22whx4bm8alrk3khjpik5xn20kl85mxr"; - - }; - "windows_i686_gnu 0.52.6" = rec { + "windows_i686_gnu" = rec { crateName = "windows_i686_gnu"; version = "0.52.6"; edition = "2021"; @@ -13897,14 +13689,7 @@ rec { ]; }; - "windows_i686_gnu 0.53.1" = rec { - crateName = "windows_i686_gnu"; - version = "0.53.1"; - edition = "2021"; - sha256 = "18wkcm82ldyg4figcsidzwbg1pqd49jpm98crfz0j7nqd6h6s3ln"; - - }; - "windows_i686_gnullvm 0.52.6" = rec { + "windows_i686_gnullvm" = rec { crateName = "windows_i686_gnullvm"; version = "0.52.6"; edition = "2021"; @@ -13914,14 +13699,7 @@ rec { ]; }; - "windows_i686_gnullvm 0.53.1" = rec { - crateName = "windows_i686_gnullvm"; - version = "0.53.1"; - edition = "2021"; - sha256 = "030qaxqc4salz6l4immfb6sykc6gmhyir9wzn2w8mxj8038mjwzs"; - - }; - "windows_i686_msvc 0.52.6" = rec { + "windows_i686_msvc" = rec { crateName = "windows_i686_msvc"; version = "0.52.6"; edition = "2021"; @@ -13931,14 +13709,7 @@ rec { ]; }; - "windows_i686_msvc 0.53.1" = rec { - crateName = "windows_i686_msvc"; - version = "0.53.1"; - edition = "2021"; - sha256 = "1hi6scw3mn2pbdl30ji5i4y8vvspb9b66l98kkz350pig58wfyhy"; - - }; - "windows_x86_64_gnu 0.52.6" = rec { + "windows_x86_64_gnu" = rec { crateName = "windows_x86_64_gnu"; version = "0.52.6"; edition = "2021"; @@ -13948,14 +13719,7 @@ rec { ]; }; - "windows_x86_64_gnu 0.53.1" = rec { - crateName = "windows_x86_64_gnu"; - version = "0.53.1"; - edition = "2021"; - sha256 = "16d4yiysmfdlsrghndr97y57gh3kljkwhfdbcs05m1jasz6l4f4w"; - - }; - "windows_x86_64_gnullvm 0.52.6" = rec { + "windows_x86_64_gnullvm" = rec { crateName = "windows_x86_64_gnullvm"; version = "0.52.6"; edition = "2021"; @@ -13965,14 +13729,7 @@ rec { ]; }; - "windows_x86_64_gnullvm 0.53.1" = rec { - crateName = "windows_x86_64_gnullvm"; - version = "0.53.1"; - edition = "2021"; - sha256 = "1qbspgv4g3q0vygkg8rnql5c6z3caqv38japiynyivh75ng1gyhg"; - - }; - "windows_x86_64_msvc 0.52.6" = rec { + "windows_x86_64_msvc" = rec { crateName = "windows_x86_64_msvc"; version = "0.52.6"; edition = "2021"; @@ -13981,38 +13738,32 @@ rec { "Microsoft" ]; - }; - "windows_x86_64_msvc 0.53.1" = rec { - crateName = "windows_x86_64_msvc"; - version = "0.53.1"; - edition = "2021"; - sha256 = "0l6npq76vlq4ksn4bwsncpr8508mk0gmznm6wnhjg95d19gzzfyn"; - }; "wit-bindgen" = rec { crateName = "wit-bindgen"; - version = "0.51.0"; + version = "0.57.1"; edition = "2024"; - sha256 = "19fazgch8sq5cvjv3ynhhfh5d5x08jq2pkw8jfb05vbcyqcr496p"; + sha256 = "0vjk2jb593ri9k1aq4iqs2si9mrw5q46wxnn78im7hm7hx799gqy"; libName = "wit_bindgen"; authors = [ "Alex Crichton " ]; features = { - "async" = [ "std" "wit-bindgen-rust-macro?/async" ]; - "async-spawn" = [ "async" "dep:futures" ]; + "async-spawn" = [ "async" "dep:futures" "std" ]; "bitflags" = [ "dep:bitflags" ]; - "default" = [ "macros" "realloc" "async" "std" "bitflags" ]; + "default" = [ "macros" "realloc" "async" "std" "bitflags" "macro-string" ]; + "futures-stream" = [ "async" "dep:futures" ]; "inter-task-wakeup" = [ "async" ]; + "macro-string" = [ "wit-bindgen-rust-macro?/macro-string" ]; "macros" = [ "dep:wit-bindgen-rust-macro" ]; "rustc-dep-of-std" = [ "dep:core" "dep:alloc" ]; }; }; "writeable" = rec { crateName = "writeable"; - version = "0.6.2"; + version = "0.6.3"; edition = "2021"; - sha256 = "1fg08y97n6vk7l0rnjggw3xyrii6dcqg54wqaxldrlk98zdy1pcy"; + sha256 = "1i54d13h9bpap2hf13xcry1s4lxh7ap3923g8f3c0grd7c9fbyhz"; authors = [ "The ICU4X Project Developers" ]; @@ -14079,9 +13830,9 @@ rec { }; "xml" = rec { crateName = "xml"; - version = "1.2.1"; + version = "1.3.0"; edition = "2021"; - sha256 = "0ak4k990faralbli5a0rb8kvwihccb2rp0r94d4azfy94a6lkamq"; + sha256 = "128s58qhq8whrx90zbw8r5algr7lakgbf7mn05jfk234rbjqavv3"; authors = [ "Vladimir Matveev " "Kornel (https://github.com/kornelski)" @@ -14090,9 +13841,9 @@ rec { }; "yoke" = rec { crateName = "yoke"; - version = "0.8.1"; + version = "0.8.3"; edition = "2021"; - sha256 = "0m29dm0bf5iakxgma0bj6dbmc3b8qi9b1vaw9sa76kdqmz3fbmkj"; + sha256 = "1xgyj6c2lxj2bp891ynmhws87c6z7yyv2li1v0ss9di40hxf57vh"; authors = [ "Manish Goregaokar " ]; @@ -14125,9 +13876,9 @@ rec { }; "yoke-derive" = rec { crateName = "yoke-derive"; - version = "0.8.1"; + version = "0.8.2"; edition = "2021"; - sha256 = "0pbyja133jnng4mrhimzdq4a0y26421g734ybgz8wsgbfhl0andn"; + sha256 = "13l5y5sz4lqm7rmyakjbh6vwgikxiql51xfff9hq2j485hk4r16y"; procMacro = true; libName = "yoke_derive"; authors = [ @@ -14156,9 +13907,9 @@ rec { }; "zerocopy" = rec { crateName = "zerocopy"; - version = "0.8.40"; + version = "0.8.50"; edition = "2021"; - sha256 = "1r9j2mlb54q1l9pgall3mk0gg6cprhdncvbbgsgxnxmmj3jcd2d7"; + sha256 = "1laahnfxs4qyfb1fdf5nbb2qfshi72b1hbi0ffp2zy2m1r7ms1iv"; authors = [ "Joshua Liebow-Feeser " "Jack Wrenn " @@ -14192,9 +13943,9 @@ rec { }; "zerocopy-derive" = rec { crateName = "zerocopy-derive"; - version = "0.8.40"; + version = "0.8.50"; edition = "2021"; - sha256 = "0lsrhg5nvf0c40z644a014l2nrvh7xw0ff3i9744k9vif2d4hp7n"; + sha256 = "0fdnr9qslx1hbn2i9rsvy9s95mychfy2vj90ajsjm2basccinqqb"; procMacro = true; libName = "zerocopy_derive"; authors = [ @@ -14227,11 +13978,11 @@ rec { }; "zerofrom" = rec { crateName = "zerofrom"; - version = "0.1.6"; + version = "0.1.8"; edition = "2021"; - sha256 = "19dyky67zkjichsb7ykhv0aqws3q0jfvzww76l66c19y6gh45k2h"; + sha256 = "0wjjdj7gdmd0iq91gzkxl7dlv0nhkk80l4bmdpzh3a1yh48mmh0f"; authors = [ - "Manish Goregaokar " + "The ICU4X Project Developers" ]; dependencies = [ { @@ -14249,9 +14000,9 @@ rec { }; "zerofrom-derive" = rec { crateName = "zerofrom-derive"; - version = "0.1.6"; + version = "0.1.7"; edition = "2021"; - sha256 = "00l5niw7c1b0lf1vhvajpjmcnbdp2vn96jg4nmkhq2db0rp5s7np"; + sha256 = "18c4wsnznhdxx6m80piil1lbyszdiwsshgjrybqcm4b6qic22lqi"; procMacro = true; libName = "zerofrom_derive"; authors = [ @@ -14330,9 +14081,9 @@ rec { }; "zerotrie" = rec { crateName = "zerotrie"; - version = "0.2.3"; + version = "0.2.4"; edition = "2021"; - sha256 = "0lbqznlqazmrwwzslw0ci7p3pqxykrbfhq29npj0gmb2amxc2n9a"; + sha256 = "1gr0pkcn3qsr6in6iixqyp0vbzwf2j1jzyvh7yl2yydh3p9m548g"; authors = [ "The ICU4X Project Developers" ]; @@ -14357,7 +14108,9 @@ rec { } ]; features = { + "alloc" = [ "zerovec?/alloc" ]; "databake" = [ "dep:databake" "zerovec?/databake" ]; + "dense" = [ "dep:zerovec" ]; "litemap" = [ "dep:litemap" "alloc" ]; "serde" = [ "dep:serde_core" "dep:litemap" "alloc" "litemap/serde" "zerovec?/serde" ]; "yoke" = [ "dep:yoke" ]; @@ -14368,9 +14121,9 @@ rec { }; "zerovec" = rec { crateName = "zerovec"; - version = "0.11.5"; + version = "0.11.6"; edition = "2021"; - sha256 = "00m0p47k2g9mkv505hky5xh3r6ps7v8qc0dy4pspg542jj972a3c"; + sha256 = "0fdjsy6b31q9i0d73sl7xjd12xadbwi45lkpfgqnmasrqg5i3ych"; authors = [ "The ICU4X Project Developers" ]; @@ -14393,11 +14146,20 @@ rec { usesDefaultFeatures = false; } ]; + devDependencies = [ + { + name = "yoke"; + packageId = "yoke"; + usesDefaultFeatures = false; + features = [ "derive" ]; + } + ]; features = { "alloc" = [ "serde?/alloc" ]; "databake" = [ "dep:databake" ]; "derive" = [ "dep:zerovec-derive" ]; "hashmap" = [ "dep:twox-hash" "alloc" ]; + "schemars" = [ "dep:schemars" "alloc" ]; "serde" = [ "dep:serde" ]; "yoke" = [ "dep:yoke" ]; }; @@ -14405,9 +14167,9 @@ rec { }; "zerovec-derive" = rec { crateName = "zerovec-derive"; - version = "0.11.2"; + version = "0.11.3"; edition = "2021"; - sha256 = "1wsig4h5j7a1scd5hrlnragnazjny9qjc44hancb6p6a76ay7p7a"; + sha256 = "0m85qj92mmfvhjra6ziqky5b1p4kcmp5069k7kfadp5hr8jw8pb2"; procMacro = true; libName = "zerovec_derive"; authors = [ diff --git a/crate-hashes.json b/crate-hashes.json index 86f2b840..5b0037c5 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -1,12 +1,12 @@ { - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#k8s-version@0.1.3": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#stackable-certs@0.4.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#stackable-operator-derive@0.3.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#stackable-operator@0.111.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#stackable-shared@0.1.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#stackable-telemetry@0.6.3": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#stackable-versioned-macros@0.10.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#stackable-versioned@0.10.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.111.1#stackable-webhook@0.9.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#k8s-version@0.1.3": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-certs@0.4.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-operator-derive@0.3.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-operator@0.111.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-shared@0.1.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-telemetry@0.6.4": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-versioned-macros@0.10.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-versioned@0.10.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-webhook@0.9.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", "git+https://github.com/stackabletech/product-config.git?tag=0.8.0#product-config@0.8.0": "1dz70kapm2wdqcr7ndyjji0lhsl98bsq95gnb2lw487wf6yr7987" } \ No newline at end of file diff --git a/deploy/helm/zookeeper-operator/configs/properties.yaml b/deploy/helm/zookeeper-operator/configs/properties.yaml index 7b7de333..9bd8c3b2 100644 --- a/deploy/helm/zookeeper-operator/configs/properties.yaml +++ b/deploy/helm/zookeeper-operator/configs/properties.yaml @@ -1,439 +1,5 @@ +--- version: 0.1.0 spec: - units: - - unit: &unitDirectory - name: "directory" - regex: "^/|(/[\\w-]+)+$" - examples: - - "/tmp/xyz" - - unit: &unitPort - name: "port" - regex: "^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$" - -properties: - - property: &jvmDnsCacheTtl - propertyNames: - - name: "networkaddress.cache.ttl" - kind: - type: "file" - file: "security.properties" - datatype: - type: "integer" - min: "0" - recommendedValues: - - fromVersion: "0.0.0" - value: "5" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "TTL for successfully resolved domain names." - description: "TTL for successfully resolved domain names." - - - property: &jvmDnsCacheNegativeTtl - propertyNames: - - name: "networkaddress.cache.negative.ttl" - kind: - type: "file" - file: "security.properties" - datatype: - type: "integer" - min: "0" - recommendedValues: - - fromVersion: "0.0.0" - value: "0" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "TTL for domain names that cannot be resolved." - description: "TTL for domain names that cannot be resolved." - - - property: &tickTime - propertyNames: - - name: "tickTime" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - min: "1" - recommendedValues: - - fromVersion: "0.0.0" - value: "3000" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "ZK only checks whether the value is 0, all other values (including negative ones) are considered valid, we disallow negative values here, see QuorumPeerConfig.java" - description: "The basic time unit in milliseconds used by ZooKeeper. It is used to do heartbeats and the minimum session timeout will be twice the tickTime." - - - property: &dataDir - propertyNames: - - name: "dataDir" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/tmp/zookeeper" - recommendedValues: - - value: "/stackable/data" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "See QuorumPeerConfig.java" - description: "The location where ZooKeeper will store the in-memory database snapshots and, unless specified otherwise, the transaction log of updates to the database. Note: Be careful where you put the transaction log. A dedicated transaction log device is key to consistent good performance. Putting the log on a busy device will adversely affect performance." - - # Role required "true" is only correct if more than one zookeeper instances is used. - - property: &initLimit - propertyNames: - - name: "initLimit" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - min: "1" - recommendedValues: - - value: "5" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "ZK only checks whether the value is 0, all other values (including negative ones) are considered valid, we disallow negative values here, see QuorumPeerConfig.java" - description: "Amount of time, in ticks (see `tickTime`), to allow followers to connect and sync to a leader. Increased this value as needed, if the amount of data managed by ZooKeeper is large." - - # Role required "true" is only correct if more than one zookeeper instances is used. - - property: &syncLimit - propertyNames: - - name: "syncLimit" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - min: "1" - recommendedValues: - - value: "2" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - comment: "ZK only checks whether the value is 0, all other values (including negative ones) are considered valid, we disallow negative values here, see QuorumPeerConfig.java" - description: "Amount of time, in ticks (see `tickTime`), to allow followers to sync with ZooKeeper. If followers fall too far behind a leader, they will be dropped. In other words: The number of ticks that can pass between sending a request and getting an acknowledgment before a follower is dropped." - - ########################## - # Ports - ########################## - - property: &clientPort - propertyNames: - - name: "clientPort" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - unit: *unitPort - min: "1024" - max: "65535" - defaultValues: - - value: "2181" - roles: - - name: "server" - required: false - asOfVersion: "0.0.0" - description: "The plaintext port to listen on for client connections." - - - property: &secureClientPort - propertyNames: - - name: "secureClientPort" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - unit: *unitPort - min: "1024" - max: "65535" - roles: - - name: "server" - required: false - asOfVersion: "0.0.0" - description: "The secure port to listen on for secure client connections using TLS/SSL." - - - property: &adminServerPort - propertyNames: - - name: "admin.serverPort" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "integer" - unit: *unitPort - min: "1024" - max: "65535" - defaultValues: - - value: "8080" - roles: - - name: "server" - required: true - asOfVersion: "0.0.0" - description: "The port the embedded Jetty server listens on." - - ########################## - # Quorum TLS - ########################## - - property: &sslQuorum - propertyNames: - - name: "sslQuorum" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "bool" - defaultValues: - - value: "false" - recommendedValues: - - value: "true" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Enables encrypted quorum communication." - - - property: &sslQuorumClientAuth - propertyNames: - - name: "ssl.quorum.clientAuth" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - allowedValues: - - "none" - - "want" - - "need" - defaultValues: - - value: "need" - recommendedValues: - - value: "need" - roles: - - name: "server" - required: false - asOfVersion: "3.5.7" - description: "Specifies options to authenticate ssl connections from other quorum members." - - - property: &sslQuorumHostNameVerification - propertyNames: - - name: "ssl.quorum.hostnameVerification" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "bool" - recommendedValues: - - value: "true" - roles: - - name: "server" - required: false - asOfVersion: "3.5.7" - description: "Specifies whether the hostname verification is enabled in quorum TLS negotiation process. Disabling it only recommended for testing purposes." - - - property: &sslQuorumKeyStoreLocation - propertyNames: - - name: "ssl.quorum.keyStore.location" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/stackable/tls/quorum" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Specifies the file path to a Java keystore containing the local credentials to be used for quorum TLS connections." - - - property: &sslQuorumKeyStorePassword - propertyNames: - - name: "ssl.quorum.keyStore.password" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "The password to unlock the quorum keystore." - - - property: &sslQuorumTrustStoreLocation - propertyNames: - - name: "ssl.quorum.trustStore.location" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/stackable/tls/quorum" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Specifies the file path to a Java truststore containing the local credentials to be used for quorum TLS connections." - - - property: &sslQuorumTrustStorePassword - propertyNames: - - name: "ssl.quorum.trustStore.password" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "The password to unlock the quorum truststore." - - ########################## - # Client TLS - ########################## - - property: &sslClientAuth - propertyNames: - - name: "ssl.clientAuth" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - allowedValues: - - "none" - - "want" - - "need" - defaultValues: - - value: "need" - recommendedValues: - - value: "need" - roles: - - name: "server" - required: false - asOfVersion: "3.5.7" - description: "Specifies options to authenticate ssl connections from clients." - - - property: &sslHostNameVerification - propertyNames: - - name: "ssl.hostnameVerification" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "bool" - recommendedValues: - - value: "true" - roles: - - name: "server" - required: false - asOfVersion: "3.5.7" - description: "Specifies whether the hostname verification is enabled in client TLS negotiation process. Disabling it only recommended for testing purposes." - - - property: &sslKeyStoreLocation - propertyNames: - - name: "ssl.keyStore.location" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/stackable/tls/client" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Specifies the file path to a Java keystore containing the local credentials to be used for client TLS connections." - - - property: &sslKeyStorePassword - propertyNames: - - name: "ssl.keyStore.password" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "The password to unlock the client keystore." - - - property: &sslTrustStoreLocation - propertyNames: - - name: "ssl.trustStore.location" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - unit: *unitDirectory - defaultValues: - - value: "/stackable/tls/client" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "Specifies the file path to a Java truststore containing the remote credentials to be used for client TLS connections." - - - property: &sslTrustStorePassword - propertyNames: - - name: "ssl.trustStore.password" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "3.5.5" - description: "The password to unlock the client truststore." - ########################## - # Common TLS - ########################## - - property: &authProviderX509 - propertyNames: - - name: "authProvider.x509" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "0.0.0" - description: "Used for secure client authentication." - - - property: &serverCnxnFactory - propertyNames: - - name: "serverCnxnFactory" - kind: - type: "file" - file: "zoo.cfg" - datatype: - type: "string" - roles: - - name: "server" - required: false - asOfVersion: "0.0.0" - description: "This should be set to NettyServerCnxnFactory in order to use TLS based server communication." + units: [] +properties: [] diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index 5d28b9b8..daca700f 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -49,7 +49,6 @@ pub const APP_NAME: &str = "zookeeper"; pub const OPERATOR_NAME: &str = "zookeeper.stackable.tech"; pub const FIELD_MANAGER: &str = "zookeeper-operator"; - pub const ZOOKEEPER_SERVER_PORT_NAME: &str = "zk"; pub const ZOOKEEPER_LEADER_PORT_NAME: &str = "zk-leader"; pub const ZOOKEEPER_LEADER_PORT: u16 = 2888; diff --git a/rust/operator-binary/src/zk_controller.rs b/rust/operator-binary/src/zk_controller.rs index 173d679b..aca9619a 100644 --- a/rust/operator-binary/src/zk_controller.rs +++ b/rust/operator-binary/src/zk_controller.rs @@ -244,7 +244,6 @@ pub enum Error { #[snafu(display("failed to build service"))] BuildService { source: service::Error }, - } impl ReconcilerError for Error { @@ -892,10 +891,8 @@ pub fn error_policy( #[cfg(test)] mod tests { use stackable_operator::{ - commons::networking::DomainName, - k8s_openapi::api::core::v1::ConfigMap, - role_utils::JavaCommonConfig, - utils::cluster_info::KubernetesClusterInfo, + commons::networking::DomainName, k8s_openapi::api::core::v1::ConfigMap, + role_utils::JavaCommonConfig, utils::cluster_info::KubernetesClusterInfo, }; use super::*; @@ -1013,7 +1010,10 @@ mod tests { "metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider", "metricsProvider.httpPort=7000", ] { - assert!(zoo_cfg.contains(expected), "missing {expected:?} in:\n{zoo_cfg}"); + assert!( + zoo_cfg.contains(expected), + "missing {expected:?} in:\n{zoo_cfg}" + ); } } diff --git a/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs b/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs index 5fd3ca8f..66d48ebc 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs +++ b/rust/operator-binary/src/zk_controller/build/properties/security_properties.rs @@ -2,9 +2,8 @@ use std::collections::BTreeMap; -use crate::zk_controller::validate::ZookeeperRoleGroupConfig; - use super::resolved_overrides; +use crate::zk_controller::validate::ZookeeperRoleGroupConfig; const NETWORKADDRESS_CACHE_TTL: &str = "networkaddress.cache.ttl"; const NETWORKADDRESS_CACHE_NEGATIVE_TTL: &str = "networkaddress.cache.negative.ttl"; @@ -31,7 +30,10 @@ pub fn build(rolegroup_config: &ZookeeperRoleGroupConfig) -> BTreeMap Date: Thu, 4 Jun 2026 19:32:53 +0200 Subject: [PATCH 10/16] refactor: Move discovery ConfigMap builder into zk_controller/build Mirror trino-operator and hdfs-operator by relocating discovery.rs to zk_controller/build/discovery.rs. The zk_controller `build` module is now pub(crate) so the znode controller can reach the shared builder; both controllers build discovery ConfigMaps for a ZookeeperCluster. Pure move: no behavior change. Co-Authored-By: Claude Opus 4.8 (1M context) --- rust/operator-binary/src/main.rs | 1 - rust/operator-binary/src/zk_controller.rs | 9 +++++---- rust/operator-binary/src/zk_controller/build.rs | 1 + .../src/{ => zk_controller/build}/discovery.rs | 0 rust/operator-binary/src/znode_controller.rs | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) rename rust/operator-binary/src/{ => zk_controller/build}/discovery.rs (100%) diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index 96764b77..35380f60 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -42,7 +42,6 @@ use crate::{ mod command; mod config; pub mod crd; -mod discovery; mod framework; mod listener; mod operations; diff --git a/rust/operator-binary/src/zk_controller.rs b/rust/operator-binary/src/zk_controller.rs index aca9619a..7b3421f0 100644 --- a/rust/operator-binary/src/zk_controller.rs +++ b/rust/operator-binary/src/zk_controller.rs @@ -73,7 +73,6 @@ use crate::{ security::{self, ZookeeperSecurity}, v1alpha1::{self, ZookeeperServerRoleConfig}, }, - discovery::{self, build_discovery_configmap}, listener::{build_role_listener, role_listener_name}, operations::{graceful_shutdown::add_graceful_shutdown_config, pdb::add_pdbs}, service::{ @@ -82,7 +81,7 @@ use crate::{ utils::build_recommended_labels, }; -mod build; +pub(crate) mod build; mod dereference; mod validate; @@ -152,7 +151,9 @@ pub enum Error { }, #[snafu(display("failed to build discovery ConfigMap"))] - BuildDiscoveryConfig { source: discovery::Error }, + BuildDiscoveryConfig { + source: build::discovery::Error, + }, #[snafu(display("failed to apply discovery ConfigMap"))] ApplyDiscoveryConfig { @@ -447,7 +448,7 @@ pub async fn reconcile_zk( // std's SipHasher is deprecated, and DefaultHasher is unstable across Rust releases. // We don't /need/ stability, but it's still nice to avoid spurious changes where possible. let mut discovery_hash = FnvHasher::with_key(0); - let discovery_cm = build_discovery_configmap( + let discovery_cm = build::discovery::build_discovery_configmap( zk, zk, ZK_CONTROLLER_NAME, diff --git a/rust/operator-binary/src/zk_controller/build.rs b/rust/operator-binary/src/zk_controller/build.rs index 71528b85..1fc06484 100644 --- a/rust/operator-binary/src/zk_controller/build.rs +++ b/rust/operator-binary/src/zk_controller/build.rs @@ -6,4 +6,5 @@ //! configuration. pub mod config_map; +pub mod discovery; pub mod properties; diff --git a/rust/operator-binary/src/discovery.rs b/rust/operator-binary/src/zk_controller/build/discovery.rs similarity index 100% rename from rust/operator-binary/src/discovery.rs rename to rust/operator-binary/src/zk_controller/build/discovery.rs diff --git a/rust/operator-binary/src/znode_controller.rs b/rust/operator-binary/src/znode_controller.rs index 414f57ab..e31dd579 100644 --- a/rust/operator-binary/src/znode_controller.rs +++ b/rust/operator-binary/src/znode_controller.rs @@ -27,8 +27,8 @@ use tracing::{debug, info}; use crate::{ APP_NAME, OPERATOR_NAME, crd::{ZookeeperRole, security::ZookeeperSecurity, v1alpha1}, - discovery::{self, build_discovery_configmap}, listener::role_listener_name, + zk_controller::build::discovery::{self, build_discovery_configmap}, }; mod dereference; From bb1f171af019828d03abbc8b4aa2ce9aed14958a Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 19:37:02 +0200 Subject: [PATCH 11/16] refactor: Simplify build_discovery_configmap params; rename znode validated struct - build_discovery_configmap drops the redundant `zk` parameter (it was only used for an error ObjectRef; the owner reference comes from `owner`) and renames `resolved_product_image` to `image`. It keeps `image` + `zookeeper_security` as explicit shared params, so both controllers can call it without a shared trait or a full ValidatedCluster. - Rename the znode controller's ValidatedInputs to ValidatedZnode and its resolved_product_image field to image, for naming consistency with ValidatedCluster. No behavior change. Build, clippy, the 16 unit tests, and the generated CRD are all unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) --- rust/operator-binary/src/zk_controller.rs | 1 - .../src/zk_controller/build/discovery.rs | 22 +++++++++---------- rust/operator-binary/src/znode_controller.rs | 11 +++++----- .../src/znode_controller/validate.rs | 14 ++++++------ 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/rust/operator-binary/src/zk_controller.rs b/rust/operator-binary/src/zk_controller.rs index 7b3421f0..d964e241 100644 --- a/rust/operator-binary/src/zk_controller.rs +++ b/rust/operator-binary/src/zk_controller.rs @@ -449,7 +449,6 @@ pub async fn reconcile_zk( // We don't /need/ stability, but it's still nice to avoid spurious changes where possible. let mut discovery_hash = FnvHasher::with_key(0); let discovery_cm = build::discovery::build_discovery_configmap( - zk, zk, ZK_CONTROLLER_NAME, applied_listener, diff --git a/rust/operator-binary/src/zk_controller/build/discovery.rs b/rust/operator-binary/src/zk_controller/build/discovery.rs index 69bedb5e..347ee67e 100644 --- a/rust/operator-binary/src/zk_controller/build/discovery.rs +++ b/rust/operator-binary/src/zk_controller/build/discovery.rs @@ -10,7 +10,7 @@ use stackable_operator::{ }; use crate::{ - crd::{ZOOKEEPER_SERVER_PORT_NAME, ZookeeperRole, security::ZookeeperSecurity, v1alpha1}, + crd::{ZOOKEEPER_SERVER_PORT_NAME, ZookeeperRole, security::ZookeeperSecurity}, utils::build_recommended_labels, }; @@ -18,10 +18,9 @@ type Result = std::result::Result; #[derive(Snafu, Debug)] pub enum Error { - #[snafu(display("object {} is missing metadata to build owner reference", zk))] + #[snafu(display("object is missing metadata to build owner reference"))] ObjectMissingMetadataForOwnerRef { source: stackable_operator::builder::meta::Error, - zk: ObjectRef, }, #[snafu(display("chroot path {} was relative (must be absolute)", chroot))] @@ -61,15 +60,18 @@ pub enum Error { }, } -/// Build a discovery [`ConfigMap`] containing connection details for a [`v1alpha1::ZookeeperCluster`] from a [`listener::v1alpha1::Listener`]. -#[allow(clippy::too_many_arguments)] +/// Build a discovery [`ConfigMap`] containing ZooKeeper connection details from a +/// [`listener::v1alpha1::Listener`]. +/// +/// `owner` owns the ConfigMap (the [`ZookeeperCluster`](crate::crd::v1alpha1::ZookeeperCluster) +/// for the cluster controller, or the [`ZookeeperZnode`](crate::crd::v1alpha1::ZookeeperZnode) +/// for the znode controller). pub fn build_discovery_configmap( - zk: &v1alpha1::ZookeeperCluster, owner: &impl Resource, controller_name: &str, listener: listener::v1alpha1::Listener, chroot: Option<&str>, - resolved_product_image: &ResolvedProductImage, + image: &ResolvedProductImage, zookeeper_security: &ZookeeperSecurity, ) -> Result { let name = owner.name_unchecked(); @@ -98,13 +100,11 @@ pub fn build_discovery_configmap( .name(name) .namespace(namespace) .ownerreference_from_resource(owner, None, Some(true)) - .with_context(|_| ObjectMissingMetadataForOwnerRefSnafu { - zk: ObjectRef::from_obj(zk), - })? + .context(ObjectMissingMetadataForOwnerRefSnafu)? .with_recommended_labels(&build_recommended_labels( owner, controller_name, - &resolved_product_image.app_version_label_value, + &image.app_version_label_value, &ZookeeperRole::Server.to_string(), "discovery", )) diff --git a/rust/operator-binary/src/znode_controller.rs b/rust/operator-binary/src/znode_controller.rs index e31dd579..91419831 100644 --- a/rust/operator-binary/src/znode_controller.rs +++ b/rust/operator-binary/src/znode_controller.rs @@ -238,8 +238,8 @@ pub async fn reconcile_znode( match ev { finalizer::Event::Apply(znode) => { let dereferenced = dereferenced_objects.context(DereferenceSnafu)?; - let validate::ValidatedInputs { - resolved_product_image, + let validate::ValidatedZnode { + image, zookeeper_security, } = validate::validate(&znode, &dereferenced, &ctx.operator_environment) .context(ValidateClusterSnafu)?; @@ -249,7 +249,7 @@ pub async fn reconcile_znode( dereferenced.zk, &zookeeper_security, &znode_path, - &resolved_product_image, + &image, ) .await } @@ -285,7 +285,7 @@ async fn reconcile_apply( zk: v1alpha1::ZookeeperCluster, zookeeper_security: &ZookeeperSecurity, znode_path: &str, - resolved_product_image: &ResolvedProductImage, + image: &ResolvedProductImage, ) -> Result { let mut cluster_resources = ClusterResources::new( APP_NAME, @@ -321,12 +321,11 @@ async fn reconcile_apply( })?; let discovery_cm = build_discovery_configmap( - &zk, znode, ZNODE_CONTROLLER_NAME, listener, Some(znode_path), - resolved_product_image, + image, zookeeper_security, ) .context(BuildDiscoveryConfigMapSnafu)?; diff --git a/rust/operator-binary/src/znode_controller/validate.rs b/rust/operator-binary/src/znode_controller/validate.rs index 84fab0ce..f69fc7f0 100644 --- a/rust/operator-binary/src/znode_controller/validate.rs +++ b/rust/operator-binary/src/znode_controller/validate.rs @@ -1,7 +1,7 @@ //! The validate step in the ZookeeperZnode controller. //! //! Synchronously validates inputs that don't require a Kubernetes client. Produces -//! [`ValidatedInputs`], consumed by the rest of `reconcile_znode`. +//! [`ValidatedZnode`], consumed by the rest of `reconcile_znode`. use snafu::{ResultExt, Snafu}; use stackable_operator::{ @@ -28,8 +28,8 @@ pub enum Error { type Result = std::result::Result; /// Synchronous inputs the rest of `reconcile_znode` needs after dereferencing. -pub struct ValidatedInputs { - pub resolved_product_image: ResolvedProductImage, +pub struct ValidatedZnode { + pub image: ResolvedProductImage, pub zookeeper_security: ZookeeperSecurity, } @@ -38,8 +38,8 @@ pub fn validate( _znode: &v1alpha1::ZookeeperZnode, dereferenced_objects: &DereferencedObjects, operator_environment: &OperatorEnvironmentOptions, -) -> Result { - let resolved_product_image = dereferenced_objects +) -> Result { + let image = dereferenced_objects .zk .spec .image @@ -58,8 +58,8 @@ pub fn validate( let zookeeper_security = ZookeeperSecurity::new(&dereferenced_objects.zk, resolved_authentication_classes); - Ok(ValidatedInputs { - resolved_product_image, + Ok(ValidatedZnode { + image, zookeeper_security, }) } From 69a0e2aee557a22d11a67fd4ee6fedb8200de29c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 19:48:26 +0200 Subject: [PATCH 12/16] refactor: Move logging constants out of crd into their consumers These constants are no longer used in crd/mod.rs. Following hdfs-operator (logging constants live in the logging builder) and trino-operator (MAX_PREPARE_LOG_FILE_SIZE lives in the controller): - LOGBACK_CONFIG_FILE, LOG4J_CONFIG_FILE, ZOOKEEPER_LOG_FILE and MAX_ZK_LOG_FILES_SIZE move to zk_controller/build/properties/logging.rs. - MAX_PREPARE_LOG_FILE_SIZE (the prepare init container) moves to zk_controller.rs. - config/jvm.rs keeps its own local log-config-file consts (as it already does for security.properties) to avoid coupling config to the controller build module. No behavior change. Build, clippy, the 16 unit tests, and the generated CRD are all unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) --- rust/operator-binary/src/config/jvm.rs | 9 ++++++-- rust/operator-binary/src/crd/mod.rs | 15 ------------- rust/operator-binary/src/zk_controller.rs | 17 ++++++++++---- .../zk_controller/build/properties/logging.rs | 22 ++++++++++++------- .../src/zk_controller/build/properties/mod.rs | 4 +--- 5 files changed, 35 insertions(+), 32 deletions(-) diff --git a/rust/operator-binary/src/config/jvm.rs b/rust/operator-binary/src/config/jvm.rs index fa772fa7..79372132 100644 --- a/rust/operator-binary/src/config/jvm.rs +++ b/rust/operator-binary/src/config/jvm.rs @@ -5,8 +5,8 @@ use stackable_operator::{ }; use crate::crd::{ - JMX_METRICS_PORT, LOG4J_CONFIG_FILE, LOGBACK_CONFIG_FILE, LoggingFramework, - STACKABLE_CONFIG_DIR, STACKABLE_LOG_CONFIG_DIR, ZookeeperServerRoleType, + JMX_METRICS_PORT, LoggingFramework, STACKABLE_CONFIG_DIR, STACKABLE_LOG_CONFIG_DIR, + ZookeeperServerRoleType, v1alpha1::{ZookeeperCluster, ZookeeperConfig}, }; @@ -16,6 +16,11 @@ const JAVA_HEAP_FACTOR: f32 = 0.8; /// ConfigMap (see `zk_controller::build::properties::ConfigFileName`). const JVM_SECURITY_PROPERTIES_FILE: &str = "security.properties"; +/// The log config files the JVM is pointed at via system properties. These are +/// written by `zk_controller::build::properties::logging`. +const LOG4J_CONFIG_FILE: &str = "log4j.properties"; +const LOGBACK_CONFIG_FILE: &str = "logback.xml"; + #[derive(Snafu, Debug)] pub enum Error { #[snafu(display("invalid memory resource configuration - missing default or value in crd?"))] diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index daca700f..1717c326 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -23,7 +23,6 @@ use stackable_operator::{ apimachinery::pkg::api::resource::Quantity, }, kube::{CustomResource, ResourceExt, runtime::reflector::ObjectRef}, - memory::{BinaryMultiple, MemoryQuantity}, product_logging::{self, spec::Logging}, role_utils::{GenericRoleConfig, JavaCommonConfig, Role, RoleGroup, RoleGroupRef}, schemars::{self, JsonSchema}, @@ -67,20 +66,6 @@ pub const STACKABLE_LOG_CONFIG_DIR: &str = "/stackable/log_config"; pub const STACKABLE_LOG_DIR: &str = "/stackable/log"; pub const STACKABLE_RW_CONFIG_DIR: &str = "/stackable/rwconfig"; -pub const LOGBACK_CONFIG_FILE: &str = "logback.xml"; -pub const LOG4J_CONFIG_FILE: &str = "log4j.properties"; - -pub const ZOOKEEPER_LOG_FILE: &str = "zookeeper.log4j.xml"; - -pub const MAX_ZK_LOG_FILES_SIZE: MemoryQuantity = MemoryQuantity { - value: 10.0, - unit: BinaryMultiple::Mebi, -}; -pub const MAX_PREPARE_LOG_FILE_SIZE: MemoryQuantity = MemoryQuantity { - value: 1.0, - unit: BinaryMultiple::Mebi, -}; - pub const CONTAINER_IMAGE_BASE_NAME: &str = "zookeeper"; const DEFAULT_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT: Duration = Duration::from_minutes_unchecked(2); diff --git a/rust/operator-binary/src/zk_controller.rs b/rust/operator-binary/src/zk_controller.rs index d964e241..f9eb54b5 100644 --- a/rust/operator-binary/src/zk_controller.rs +++ b/rust/operator-binary/src/zk_controller.rs @@ -40,6 +40,7 @@ use stackable_operator::{ }, kvp::{LabelError, Labels}, logging::controller::ReconcilerError, + memory::{BinaryMultiple, MemoryQuantity}, product_logging::{ self, framework::{ @@ -65,9 +66,8 @@ use crate::{ command::create_init_container_command_args, config::jvm::{construct_non_heap_jvm_args, construct_zk_server_heap_env}, crd::{ - JMX_METRICS_PORT_NAME, MAX_PREPARE_LOG_FILE_SIZE, MAX_ZK_LOG_FILES_SIZE, - METRICS_PROVIDER_HTTP_PORT_NAME, STACKABLE_CONFIG_DIR, STACKABLE_DATA_DIR, - STACKABLE_LOG_CONFIG_DIR, STACKABLE_LOG_DIR, STACKABLE_RW_CONFIG_DIR, + JMX_METRICS_PORT_NAME, METRICS_PROVIDER_HTTP_PORT_NAME, STACKABLE_CONFIG_DIR, + STACKABLE_DATA_DIR, STACKABLE_LOG_CONFIG_DIR, STACKABLE_LOG_DIR, STACKABLE_RW_CONFIG_DIR, ZOOKEEPER_ELECTION_PORT, ZOOKEEPER_ELECTION_PORT_NAME, ZOOKEEPER_LEADER_PORT, ZOOKEEPER_LEADER_PORT_NAME, ZOOKEEPER_SERVER_PORT_NAME, ZookeeperRole, security::{self, ZookeeperSecurity}, @@ -90,6 +90,12 @@ pub const ZK_FULL_CONTROLLER_NAME: &str = concatcp!(ZK_CONTROLLER_NAME, '.', OPE pub const LISTENER_VOLUME_NAME: &str = "listener"; pub const LISTENER_VOLUME_DIR: &str = "/stackable/listener"; +/// Maximum size of the `prepare` init container log file (before rotation). +pub const MAX_PREPARE_LOG_FILE_SIZE: MemoryQuantity = MemoryQuantity { + value: 1.0, + unit: BinaryMultiple::Mebi, +}; + pub struct Ctx { pub client: stackable_operator::client::Client, pub operator_environment: OperatorEnvironmentOptions, @@ -763,7 +769,10 @@ fn build_server_rolegroup_statefulset( .add_empty_dir_volume( "log", Some(product_logging::framework::calculate_log_volume_size_limit( - &[MAX_ZK_LOG_FILES_SIZE, MAX_PREPARE_LOG_FILE_SIZE], + &[ + build::properties::logging::MAX_ZK_LOG_FILES_SIZE, + MAX_PREPARE_LOG_FILE_SIZE, + ], )), ) .context(AddVolumeSnafu)? diff --git a/rust/operator-binary/src/zk_controller/build/properties/logging.rs b/rust/operator-binary/src/zk_controller/build/properties/logging.rs index 16c8567e..46ba42fb 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/logging.rs +++ b/rust/operator-binary/src/zk_controller/build/properties/logging.rs @@ -1,16 +1,12 @@ //! Builders for the logging-related files in the rolegroup ConfigMap: the //! product log config (`logback.xml` / `log4j.properties`) and the Vector agent //! config (`vector.yaml`). -//! -//! Moved from the former top-level `product_logging` module so that all ConfigMap -//! contributions live under `zk_controller/build` (mirrors trino-operator and -//! hdfs-operator). use std::collections::BTreeMap; use snafu::{ResultExt, Snafu}; use stackable_operator::{ - memory::BinaryMultiple, + memory::{BinaryMultiple, MemoryQuantity}, product_logging::{ self, spec::{ContainerLogConfig, ContainerLogConfigChoice}, @@ -18,9 +14,19 @@ use stackable_operator::{ role_utils::RoleGroupRef, }; -use crate::crd::{ - LOG4J_CONFIG_FILE, LOGBACK_CONFIG_FILE, LoggingFramework, MAX_ZK_LOG_FILES_SIZE, - STACKABLE_LOG_DIR, ZOOKEEPER_LOG_FILE, ZookeeperRole, v1alpha1, +use crate::crd::{LoggingFramework, STACKABLE_LOG_DIR, ZookeeperRole, v1alpha1}; + +/// The logback config file name (when the product uses the LOGBACK framework). +pub const LOGBACK_CONFIG_FILE: &str = "logback.xml"; +/// The log4j config file name (when the product uses the LOG4J framework). +pub const LOG4J_CONFIG_FILE: &str = "log4j.properties"; +/// The file the ZooKeeper server logs are written to. +pub const ZOOKEEPER_LOG_FILE: &str = "zookeeper.log4j.xml"; + +/// Maximum size of the ZooKeeper server log files (before rotation). +pub const MAX_ZK_LOG_FILES_SIZE: MemoryQuantity = MemoryQuantity { + value: 10.0, + unit: BinaryMultiple::Mebi, }; #[derive(Snafu, Debug)] diff --git a/rust/operator-binary/src/zk_controller/build/properties/mod.rs b/rust/operator-binary/src/zk_controller/build/properties/mod.rs index 501b9c2b..78ba0c8f 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/mod.rs +++ b/rust/operator-binary/src/zk_controller/build/properties/mod.rs @@ -1,9 +1,7 @@ //! Per-file builders for the ZooKeeper config files. //! //! Each submodule renders the key/value pairs (or file contents) for one file -//! that ends up in the rolegroup ConfigMap. The shared -//! [`writer`](crate::framework::writer) module serializes property maps to the -//! Java-properties on-wire format. +//! that ends up in the rolegroup ConfigMap. use std::collections::BTreeMap; From 5084a05a80811aaa1dd160b2a4f4e9db006530fa Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 4 Jun 2026 19:49:56 +0200 Subject: [PATCH 13/16] fix: clippy --- rust/operator-binary/src/zk_controller.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rust/operator-binary/src/zk_controller.rs b/rust/operator-binary/src/zk_controller.rs index f9eb54b5..860bed69 100644 --- a/rust/operator-binary/src/zk_controller.rs +++ b/rust/operator-binary/src/zk_controller.rs @@ -157,9 +157,7 @@ pub enum Error { }, #[snafu(display("failed to build discovery ConfigMap"))] - BuildDiscoveryConfig { - source: build::discovery::Error, - }, + BuildDiscoveryConfig { source: build::discovery::Error }, #[snafu(display("failed to apply discovery ConfigMap"))] ApplyDiscoveryConfig { From 74a9f9152c802d31275278affb77f8e8f3985aab Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 5 Jun 2026 09:20:01 +0200 Subject: [PATCH 14/16] fix: regenerate hashes --- Cargo.nix | 18 +++++++++--------- crate-hashes.json | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.nix b/Cargo.nix index 6a0e868f..cddcaea7 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -4820,7 +4820,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "k8s_version"; authors = [ @@ -9377,7 +9377,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_certs"; authors = [ @@ -9480,7 +9480,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_operator"; authors = [ @@ -9666,7 +9666,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; procMacro = true; libName = "stackable_operator_derive"; @@ -9701,7 +9701,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_shared"; authors = [ @@ -9782,7 +9782,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_telemetry"; authors = [ @@ -9892,7 +9892,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_versioned"; authors = [ @@ -9942,7 +9942,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; procMacro = true; libName = "stackable_versioned_macros"; @@ -10010,7 +10010,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; rev = "128e1afca7761d07058624091217b6d695fa790c"; - sha256 = "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk"; + sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_webhook"; authors = [ diff --git a/crate-hashes.json b/crate-hashes.json index 5b0037c5..b944c535 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -1,12 +1,12 @@ { - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#k8s-version@0.1.3": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-certs@0.4.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-operator-derive@0.3.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-operator@0.111.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-shared@0.1.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-telemetry@0.6.4": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-versioned-macros@0.10.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-versioned@0.10.0": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", - "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-webhook@0.9.1": "0lj969rjbxairjglrnaq0xhabvdrq5nd6wl1i0y9pr50nhh7zvgk", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#k8s-version@0.1.3": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-certs@0.4.0": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-operator-derive@0.3.1": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-operator@0.111.1": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-shared@0.1.1": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-telemetry@0.6.4": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-versioned-macros@0.10.0": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-versioned@0.10.0": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", + "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#stackable-webhook@0.9.1": "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs", "git+https://github.com/stackabletech/product-config.git?tag=0.8.0#product-config@0.8.0": "1dz70kapm2wdqcr7ndyjji0lhsl98bsq95gnb2lw487wf6yr7987" } \ No newline at end of file From 2bac0f8dcdb9cb15f6b075bfb98fd60214c37861 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 5 Jun 2026 09:48:13 +0200 Subject: [PATCH 15/16] chore: adapt changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac50b266..6f2fa457 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,12 +17,15 @@ All notable changes to this project will be documented in this file. - Bump `stackable-operator` to 0.111.1 ([#1027], [#1028]). - Internal operator refactoring: introduce dereference() and validate() steps in the reconciler ([#1034]). - test: Bump vector-aggregator to 0.55.0, replace /graphql call with gRPC call ([#1038]). +- BREAKING: Removed product-config machinery. This is a breaking change in terms of configuration. + Users relying on the product-config `properties.yaml` file have to set these properties via the CRD ([#1041]). [#1020]: https://github.com/stackabletech/zookeeper-operator/pull/1020 [#1027]: https://github.com/stackabletech/zookeeper-operator/pull/1027 [#1028]: https://github.com/stackabletech/zookeeper-operator/pull/1028 [#1034]: https://github.com/stackabletech/zookeeper-operator/pull/1034 [#1038]: https://github.com/stackabletech/zookeeper-operator/pull/1038 +[#1041]: https://github.com/stackabletech/zookeeper-operator/pull/1041 ## [26.3.0] - 2026-03-16 From 7d4139659118d8df128df85ea75aff05294c7181 Mon Sep 17 00:00:00 2001 From: Andrew Kenworthy Date: Fri, 5 Jun 2026 17:20:31 +0200 Subject: [PATCH 16/16] refactor: consume the config-file writer from stackable-operator Replace the vendored Java-properties writer (rust/operator-binary/src/framework/writer.rs) with stackable_operator::v2::config_file_writer (moved there via operator-rs #1217 on the smooth-operator branch). ZooKeeper's copy was a java-only subset of the canonical hdfs writer; the upstream module's additional to_hadoop_xml simply goes unimported. Drop the now-unused java-properties dependency. The framework module now only contains role_utils. No behaviour change; rendered .properties output is byte-identical by construction (same code, new home). Co-Authored-By: Claude Opus 4.8 --- Cargo.lock | 21 ++--- Cargo.nix | 30 ++++--- Cargo.toml | 1 - rust/operator-binary/Cargo.toml | 1 - rust/operator-binary/src/framework.rs | 1 - rust/operator-binary/src/framework/writer.rs | 81 ------------------- .../src/zk_controller/build/config_map.rs | 2 +- .../src/zk_controller/build/properties/mod.rs | 2 +- 8 files changed, 30 insertions(+), 109 deletions(-) delete mode 100644 rust/operator-binary/src/framework/writer.rs diff --git a/Cargo.lock b/Cargo.lock index 25ea8d0d..97c3b8d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1509,7 +1509,7 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "darling", "regex", @@ -2844,7 +2844,7 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stackable-certs" version = "0.4.0" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "const-oid", "ecdsa", @@ -2868,7 +2868,7 @@ dependencies = [ [[package]] name = "stackable-operator" version = "0.111.1" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "base64", "clap", @@ -2880,6 +2880,7 @@ dependencies = [ "futures 0.3.32", "http", "indexmap", + "java-properties", "jiff", "json-patch", "k8s-openapi", @@ -2905,12 +2906,13 @@ dependencies = [ "tracing-subscriber", "url", "uuid", + "xml", ] [[package]] name = "stackable-operator-derive" version = "0.3.1" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "darling", "proc-macro2", @@ -2921,7 +2923,7 @@ dependencies = [ [[package]] name = "stackable-shared" version = "0.1.1" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "jiff", "k8s-openapi", @@ -2938,7 +2940,7 @@ dependencies = [ [[package]] name = "stackable-telemetry" version = "0.6.4" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "axum", "clap", @@ -2962,7 +2964,7 @@ dependencies = [ [[package]] name = "stackable-versioned" version = "0.10.0" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "kube", "schemars", @@ -2976,7 +2978,7 @@ dependencies = [ [[package]] name = "stackable-versioned-macros" version = "0.10.0" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "convert_case", "convert_case_extras", @@ -2994,7 +2996,7 @@ dependencies = [ [[package]] name = "stackable-webhook" version = "0.9.1" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#128e1afca7761d07058624091217b6d695fa790c" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=smooth-operator#46cd3f93a788d44d177a8794fde91fbefa3156d7" dependencies = [ "arc-swap", "async-trait", @@ -3034,7 +3036,6 @@ dependencies = [ "fnv", "futures 0.3.32", "indoc", - "java-properties", "pin-project", "semver", "serde", diff --git a/Cargo.nix b/Cargo.nix index cddcaea7..1e11a58a 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -4819,7 +4819,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "k8s_version"; @@ -9376,7 +9376,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_certs"; @@ -9479,7 +9479,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_operator"; @@ -9530,6 +9530,10 @@ rec { name = "indexmap"; packageId = "indexmap"; } + { + name = "java-properties"; + packageId = "java-properties"; + } { name = "jiff"; packageId = "jiff"; @@ -9645,6 +9649,10 @@ rec { name = "uuid"; packageId = "uuid"; } + { + name = "xml"; + packageId = "xml"; + } ]; features = { "certs" = [ "dep:stackable-certs" ]; @@ -9665,7 +9673,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; procMacro = true; @@ -9700,7 +9708,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_shared"; @@ -9781,7 +9789,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_telemetry"; @@ -9891,7 +9899,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_versioned"; @@ -9941,7 +9949,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; procMacro = true; @@ -10009,7 +10017,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "128e1afca7761d07058624091217b6d695fa790c"; + rev = "46cd3f93a788d44d177a8794fde91fbefa3156d7"; sha256 = "1a7g0rvvinwkm2wl5sxp129dc9agiilbgzfi0pvdp5a81xv01nxs"; }; libName = "stackable_webhook"; @@ -10175,10 +10183,6 @@ rec { name = "indoc"; packageId = "indoc"; } - { - name = "java-properties"; - packageId = "java-properties"; - } { name = "pin-project"; packageId = "pin-project"; diff --git a/Cargo.toml b/Cargo.toml index 3fc0dd93..4236f20b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,6 @@ const_format = "0.2" fnv = "1.0" futures = { version = "0.3", features = ["compat"] } indoc = "2.0" -java-properties = "2.0" pin-project = "1.1" semver = "1.0" serde = { version = "1.0", features = ["derive"] } diff --git a/rust/operator-binary/Cargo.toml b/rust/operator-binary/Cargo.toml index 7a707257..65272d8e 100644 --- a/rust/operator-binary/Cargo.toml +++ b/rust/operator-binary/Cargo.toml @@ -18,7 +18,6 @@ const_format.workspace = true fnv.workspace = true futures.workspace = true indoc.workspace = true -java-properties.workspace = true pin-project.workspace = true semver.workspace = true serde.workspace = true diff --git a/rust/operator-binary/src/framework.rs b/rust/operator-binary/src/framework.rs index 3453b11a..2040eb68 100644 --- a/rust/operator-binary/src/framework.rs +++ b/rust/operator-binary/src/framework.rs @@ -10,4 +10,3 @@ // Wired into the reconciler in a follow-up commit (validate -> ValidatedCluster). #[allow(dead_code)] pub mod role_utils; -pub mod writer; diff --git a/rust/operator-binary/src/framework/writer.rs b/rust/operator-binary/src/framework/writer.rs deleted file mode 100644 index 7204ece6..00000000 --- a/rust/operator-binary/src/framework/writer.rs +++ /dev/null @@ -1,81 +0,0 @@ -//! Writer for Java `.properties` files (e.g. ZooKeeper's `zoo.cfg` and -//! `security.properties`). -//! -//! Vendored from the `product-config` crate's `writer` module so the operator no -//! longer depends on `product-config` for rendering. Backed by the same -//! `java-properties` crate, so the rendered output is byte-identical to the -//! previous `product_config::writer::to_java_properties_string`. - -use std::io::Write; - -use java_properties::{PropertiesError, PropertiesWriter}; -use snafu::{ResultExt, Snafu}; - -#[derive(Debug, Snafu)] -pub enum PropertiesWriterError { - #[snafu(display("failed to create properties file"))] - Properties { source: PropertiesError }, - - #[snafu(display("failed to convert properties file byte array to UTF-8"))] - FromUtf8 { source: std::string::FromUtf8Error }, -} - -/// Creates a common Java properties file string in the format: -/// `property_1=value_1\nproperty_2=value_2\n`. -pub fn to_java_properties_string<'a, T>(properties: T) -> Result -where - T: Iterator)>, -{ - let mut output = Vec::new(); - write_java_properties(&mut output, properties)?; - String::from_utf8(output).context(FromUtf8Snafu) -} - -/// Writes Java properties to the given writer. A `None` value is written as an -/// empty value (`key=`). -fn write_java_properties<'a, W, T>(writer: W, properties: T) -> Result<(), PropertiesWriterError> -where - W: Write, - T: Iterator)>, -{ - let mut writer = PropertiesWriter::new(writer); - for (k, v) in properties { - let property_value = v.as_deref().unwrap_or_default(); - writer.write(k, property_value).context(PropertiesSnafu)?; - } - writer.flush().context(PropertiesSnafu)?; - Ok(()) -} - -#[cfg(test)] -mod tests { - use std::collections::BTreeMap; - - use super::*; - - fn props(pairs: &[(&str, Option<&str>)]) -> String { - let map: BTreeMap> = pairs - .iter() - .map(|(k, v)| (k.to_string(), v.map(str::to_string))) - .collect(); - to_java_properties_string(map.iter()).unwrap() - } - - #[test] - fn java_properties_renders_key_value() { - assert_eq!(props(&[("a", Some("1")), ("b", Some("2"))]), "a=1\nb=2\n"); - } - - #[test] - fn java_properties_renders_none_as_empty() { - assert_eq!(props(&[("none", None)]), "none=\n"); - } - - #[test] - fn java_properties_escapes_colon_in_value() { - assert_eq!( - props(&[("url", Some("file://this/location/file.abc"))]), - "url=file\\://this/location/file.abc\n" - ); - } -} diff --git a/rust/operator-binary/src/zk_controller/build/config_map.rs b/rust/operator-binary/src/zk_controller/build/config_map.rs index f7a06bbd..d7153d82 100644 --- a/rust/operator-binary/src/zk_controller/build/config_map.rs +++ b/rust/operator-binary/src/zk_controller/build/config_map.rs @@ -12,11 +12,11 @@ use stackable_operator::{ builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder}, k8s_openapi::api::core::v1::ConfigMap, role_utils::RoleGroupRef, + v2::config_file_writer::{PropertiesWriterError, to_java_properties_string}, }; use crate::{ crd::{ZookeeperRole, v1alpha1}, - framework::writer::{PropertiesWriterError, to_java_properties_string}, utils::build_recommended_labels, zk_controller::{ ZK_CONTROLLER_NAME, diff --git a/rust/operator-binary/src/zk_controller/build/properties/mod.rs b/rust/operator-binary/src/zk_controller/build/properties/mod.rs index 78ba0c8f..d5e6dc14 100644 --- a/rust/operator-binary/src/zk_controller/build/properties/mod.rs +++ b/rust/operator-binary/src/zk_controller/build/properties/mod.rs @@ -33,7 +33,7 @@ pub(crate) fn resolved_overrides( } /// Converts a `key -> value` map into the `key -> Some(value)` shape expected by -/// [`to_java_properties_string`](crate::framework::writer::to_java_properties_string). +/// [`to_java_properties_string`](stackable_operator::v2::config_file_writer::to_java_properties_string). pub(crate) fn into_optional_values( map: BTreeMap, ) -> BTreeMap> {