diff --git a/CHANGELOG.md b/CHANGELOG.md index 95731a59..b48cad20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Added + +- Support for emitting [OpenLineage](https://openlineage.io/) lineage events via `spec.clusterConfig.openLineage` ([#822]). + ### Changed - Internal operator refactoring: introduce a build() step in the reconciler that @@ -9,6 +13,7 @@ - Bump stackable-operator to 0.114.0 ([#827]). [#814]: https://github.com/stackabletech/airflow-operator/pull/814 +[#822]: https://github.com/stackabletech/airflow-operator/pull/822 [#827]: https://github.com/stackabletech/airflow-operator/pull/827 ## [26.7.0] - 2026-07-21 diff --git a/Cargo.lock b/Cargo.lock index 6aaa2b0a..6c9fabfe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,9 +108,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "arc-swap" @@ -158,18 +158,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -273,9 +273,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "block-buffer" @@ -304,15 +304,15 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytes" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" -version = "1.2.66" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" +checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" dependencies = [ "find-msvc-tools", "jobserver", @@ -339,9 +339,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.1" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" dependencies = [ "clap_builder", "clap_derive", @@ -349,9 +349,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" dependencies = [ "anstream", "anstyle", @@ -361,14 +361,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.1" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -383,6 +383,16 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -528,7 +538,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -539,7 +549,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -561,7 +571,7 @@ dependencies = [ "defmt-parser", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -570,7 +580,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" dependencies = [ - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -581,7 +591,7 @@ checksum = "780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -605,7 +615,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -632,7 +642,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -655,7 +665,7 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -707,7 +717,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -780,7 +790,7 @@ checksum = "42e528e2d34ba8a67a1a650b86beae8ef69fc5fdb638016f386b973226590432" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -822,9 +832,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "ff" @@ -887,9 +897,9 @@ checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" [[package]] name = "futures" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" dependencies = [ "futures-channel", "futures-core", @@ -902,9 +912,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", "futures-sink", @@ -912,15 +922,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" dependencies = [ "futures-core", "futures-task", @@ -929,32 +939,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-timer" @@ -964,9 +974,9 @@ checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures 0.1.31", "futures-channel", @@ -1034,7 +1044,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddddbf932745a6be37109b6112d3ee09696106f848449069d3a57bba937ab82e" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "libc", "libgit2-sys", "log", @@ -1042,9 +1052,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "gloo-timers" @@ -1060,9 +1070,9 @@ dependencies = [ [[package]] name = "granit-parser" -version = "0.0.3" +version = "0.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50ba32164f9e098d5da618776a32afbb32270adcbe3d3d006107dae11e37c91" +checksum = "d03f81ad4732830d85cfd417a9f62cde6dadda4354d37d078a6084a19560aa2d" dependencies = [ "arraydeque", "smallvec", @@ -1153,9 +1163,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -1163,9 +1173,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", @@ -1194,9 +1204,9 @@ checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" [[package]] name = "hyper" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", @@ -1468,11 +1478,12 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.31" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccfe6121cbe750cf81efa362d85c0bde7ea298ec43092d3a193baca59cdbd634" +checksum = "e184d09547b80eb7e20d141ba2fb1fbac843ca53f4cf1b31210adc4c1adc6e16" dependencies = [ "defmt", + "jiff-core", "jiff-static", "jiff-tzdb-platform", "log", @@ -1482,22 +1493,32 @@ dependencies = [ "windows-link", ] +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + [[package]] name = "jiff-static" -version = "0.2.31" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e165e897f662d428f3cd3828a919dbe067c2d42bb1031eede74ef9d27ecdedd2" +checksum = "323da076b7a6faf914dc677cb05a4b907742ff7375c8322c9e7f5061e5e0e9de" dependencies = [ + "jiff-core", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "jiff-tzdb" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6142247df1a93c2b3587402a19710be3e6e942f1581a1702e76408f2c21d6590" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" [[package]] name = "jiff-tzdb-platform" @@ -1508,6 +1529,55 @@ dependencies = [ "jiff-tzdb", ] +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.19", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + [[package]] name = "jobserver" version = "0.1.35" @@ -1539,20 +1609,20 @@ dependencies = [ "schemars", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] name = "jsonpath-rust" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633a7320c4bb672863a3782e89b9094ad70285e097ff6832cddd0ec615beadfa" +checksum = "4222e00941bfe18bf81b79fa23ad933e233bfa18f3ee27254c5dd9b1543b5d5f" dependencies = [ "pest", "pest_derive", "regex", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -1581,11 +1651,11 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "darling", "regex", - "snafu 0.9.1", + "snafu 0.9.2", ] [[package]] @@ -1605,9 +1675,9 @@ checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" [[package]] name = "kube" -version = "4.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb9108095346a7096d11feeaff419c75dddcac1b2f59acb38d7bf3d13c3e146" +checksum = "208d7fe1380066abb194812a8a8e303cb896a33bb3d7b3177b71bd03ff39bf18" dependencies = [ "k8s-openapi", "kube-client", @@ -1618,14 +1688,14 @@ dependencies = [ [[package]] name = "kube-client" -version = "4.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f628e05bc2264c21fe10d3d675117dc9b43ea3bf4fb07262a222679757537b" +checksum = "31e940a73033a7c5c7918b5ece7851d84571b58be25e937198da37fa13f116d3" dependencies = [ "base64", "bytes", "either", - "futures 0.3.32", + "futures 0.3.33", "http", "http-body", "http-body-util", @@ -1639,11 +1709,12 @@ dependencies = [ "kube-core", "pem", "rustls", + "rustls-platform-verifier", "secrecy", "serde", "serde-saphyr", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tokio-util", "tower", @@ -1653,9 +1724,9 @@ dependencies = [ [[package]] name = "kube-core" -version = "4.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b02f5933ba06140d58c7d6727f6c319f0962ec6a344aa5e21e475e891deaa8" +checksum = "a9d2353c118cf3462c352ee0b5bd5b0cf17990af456dfd8662d136ff9812eeb4" dependencies = [ "derive_more", "form_urlencoded", @@ -1667,35 +1738,35 @@ dependencies = [ "serde", "serde-value", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] name = "kube-derive" -version = "4.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe171898707dadf1818ef94e81ef57f6beb7edf9ba87b9e814c045dad356c7aa" +checksum = "92141c19e1fa83bf91633c1234c66b03375c29aa8ca5486331ddb47e3a3da9c0" dependencies = [ "darling", "proc-macro2", "quote", "serde", "serde_json", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "kube-runtime" -version = "4.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ddec66c540c7cf29a5b41fe4a657a53687f95c346e03bdf00585b70a1bab21" +checksum = "3eb064ef71c7bea55e934a443960da9e9ec31fbb2ba63e47e4aeca32603d5cc7" dependencies = [ "ahash", "async-broadcast", "async-stream", "backon", "educe", - "futures 0.3.32", + "futures 0.3.33", "hashbrown 0.16.1", "hostname", "json-patch", @@ -1705,7 +1776,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tokio-util", "tracing", @@ -1722,15 +1793,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libgit2-sys" -version = "0.18.5+1.9.4" +version = "0.18.7+1.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005d6ae6eac1912906073e069f7db60b1fa98e052a68227824afe3e3a1c59ca2" +checksum = "23c7391e4b9f4ffab1a624223cc1d7385ff9a678f490768add717de7ea2f4d89" dependencies = [ "cc", "libc", @@ -1794,9 +1865,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.8.2" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "mime" @@ -1816,9 +1887,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -1851,7 +1922,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.6", + "rand 0.8.7", "smallvec", "zeroize", ] @@ -1873,11 +1944,10 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -1920,7 +1990,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.18", + "thiserror 2.0.19", "tracing", ] @@ -1962,7 +2032,7 @@ dependencies = [ "opentelemetry_sdk", "prost", "reqwest", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tonic", "tonic-types", @@ -1999,8 +2069,8 @@ dependencies = [ "opentelemetry", "percent-encoding", "portable-atomic", - "rand 0.9.4", - "thiserror 2.0.18", + "rand 0.9.5", + "thiserror 2.0.19", "tokio", "tokio-stream", ] @@ -2082,9 +2152,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.7" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47627dd7305c6a2d6c8c6bcd24c5a4c17dbbf425f4f9c5313e724b38fc9782e9" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" dependencies = [ "memchr", "ucd-trie", @@ -2092,9 +2162,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.7" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b4254325ecad416ab689e27ba51da03ba01a9632bc6e108f5fe7c3c4ad29d58" +checksum = "9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd" dependencies = [ "pest", "pest_generator", @@ -2102,22 +2172,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.7" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4c0e91ead7a8f7acecbca6f003fc2e8282b1dbe2dd9c9d2f16aba42995e0a7" +checksum = "6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "pest_meta" -version = "2.8.7" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9744bc48116fee06334924bb5f2bad41eed5e89bd26e29b0b799f9a3f82c210" +checksum = "85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c" dependencies = [ "pest", ] @@ -2139,7 +2209,7 @@ checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -2177,9 +2247,9 @@ checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" [[package]] name = "portable-atomic-util" @@ -2234,9 +2304,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -2261,7 +2331,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -2275,9 +2345,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -2296,9 +2366,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.4", @@ -2306,9 +2376,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -2358,34 +2428,34 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] name = "regex" -version = "1.12.4" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -2395,9 +2465,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -2517,7 +2587,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.118", + "syn 2.0.119", "unicode-ident", ] @@ -2532,9 +2602,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.41" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "log", "once_cell", @@ -2559,13 +2629,40 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.103.13" @@ -2589,6 +2686,15 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.29" @@ -2621,7 +2727,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -2659,7 +2765,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "core-foundation", "core-foundation-sys", "libc", @@ -2684,9 +2790,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -2694,9 +2800,9 @@ dependencies = [ [[package]] name = "serde-saphyr" -version = "0.0.27" +version = "0.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5897b4c3faadadd35fdb6689f015641f3bc481d5adaaac56231ea15aeb243db3" +checksum = "7bd22781911de0ca6debda95f073c8f18bec65d1a94f1fa9573f3102e514cea4" dependencies = [ "ahash", "annotate-snippets", @@ -2706,7 +2812,7 @@ dependencies = [ "granit-parser", "nohash-hasher", "num-traits", - "serde", + "serde_core", "smallvec", "zmij", ] @@ -2723,22 +2829,22 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] @@ -2749,14 +2855,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -2803,9 +2909,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures", @@ -2860,9 +2966,25 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slab" @@ -2888,11 +3010,11 @@ dependencies = [ [[package]] name = "snafu" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1a012328be2e3f5d5f6f3218147ca02588cea4cb865e876849ab6debcf36522" +checksum = "e45cb604038abb7b926b679887b3226d8d0f23874b66623625a0454be425a4b7" dependencies = [ - "snafu-derive 0.9.1", + "snafu-derive 0.9.2", ] [[package]] @@ -2908,21 +3030,21 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f103c50866b8743da9429b8a581d81a27c2d3a9c4ac7df8f8571c1dd7896eda" +checksum = "287f59010008f0d7cf5e3b03196d666c1acc46c8d3e9cf34c28a1a7157601e72" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "socket2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -2959,13 +3081,13 @@ dependencies = [ "clap", "const_format", "fnv", - "futures 0.3.32", + "futures 0.3.33", "indoc", "rstest", "serde", "serde_json", "serde_yaml", - "snafu 0.9.1", + "snafu 0.9.2", "stackable-operator", "strum", "tokio", @@ -2975,19 +3097,19 @@ dependencies = [ [[package]] name = "stackable-certs" version = "0.4.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "const-oid", "ecdsa", "k8s-openapi", "kube", "p256", - "rand 0.9.4", + "rand 0.9.5", "rand_core 0.6.4", "rsa", "sha2", "signature", - "snafu 0.9.1", + "snafu 0.9.2", "stackable-shared", "tokio", "tokio-rustls", @@ -2999,7 +3121,7 @@ dependencies = [ [[package]] name = "stackable-operator" version = "0.114.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "base64", "clap", @@ -3008,7 +3130,7 @@ dependencies = [ "dockerfile-parser", "educe", "either", - "futures 0.3.32", + "futures 0.3.33", "http", "indexmap", "java-properties", @@ -3016,7 +3138,7 @@ dependencies = [ "json-patch", "k8s-openapi", "kube", - "rand 0.9.4", + "rand 0.9.5", "regex", "schemars", "semver", @@ -3024,7 +3146,7 @@ dependencies = [ "serde_json", "serde_yaml", "sha2", - "snafu 0.9.1", + "snafu 0.9.2", "stackable-operator-derive", "stackable-shared", "stackable-telemetry", @@ -3043,18 +3165,18 @@ dependencies = [ [[package]] name = "stackable-operator-derive" version = "0.3.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "stackable-shared" version = "0.1.2" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "jiff", "k8s-openapi", @@ -3063,7 +3185,7 @@ dependencies = [ "semver", "serde", "serde_yaml", - "snafu 0.9.1", + "snafu 0.9.2", "strum", "time", ] @@ -3071,7 +3193,7 @@ dependencies = [ [[package]] name = "stackable-telemetry" version = "0.6.5" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "axum", "clap", @@ -3082,7 +3204,7 @@ dependencies = [ "opentelemetry-semantic-conventions", "opentelemetry_sdk", "pin-project", - "snafu 0.9.1", + "snafu 0.9.2", "strum", "tokio", "tower", @@ -3095,21 +3217,21 @@ dependencies = [ [[package]] name = "stackable-versioned" version = "0.11.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "kube", "schemars", "serde", "serde_json", "serde_yaml", - "snafu 0.9.1", + "snafu 0.9.2", "stackable-versioned-macros", ] [[package]] name = "stackable-versioned-macros" version = "0.11.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "convert_case", "convert_case_extras", @@ -3121,13 +3243,13 @@ dependencies = [ "kube", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "stackable-webhook" version = "0.9.2" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#ee66b8d66fe10c216acfed0f81070b362604b392" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#d81a6b556e7a13736710dc945183dae331d20ea0" dependencies = [ "arc-swap", "async-trait", @@ -3140,10 +3262,10 @@ dependencies = [ "kube", "opentelemetry", "opentelemetry-semantic-conventions", - "rand 0.9.4", + "rand 0.9.5", "serde", "serde_json", - "snafu 0.9.1", + "snafu 0.9.2", "stackable-certs", "stackable-shared", "stackable-telemetry", @@ -3180,7 +3302,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3208,9 +3330,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.118" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -3234,7 +3367,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3248,11 +3381,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.19", ] [[package]] @@ -3263,34 +3396,34 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 3.0.3", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "time" -version = "0.3.53" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" dependencies = [ "deranged", "num-conv", @@ -3308,9 +3441,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -3344,14 +3477,14 @@ checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -3366,13 +3499,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3387,9 +3520,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -3398,13 +3531,14 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-sink", + "libc", "pin-project-lite", "slab", "tokio", @@ -3421,9 +3555,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.12+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap", "toml_datetime", @@ -3515,7 +3649,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "base64", - "bitflags 2.13.0", + "bitflags 2.13.1", "bytes", "futures-util", "http", @@ -3535,7 +3669,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b11f75e912b0c2be01b63d8cf8057b8c3f97cf34abb3d431a3a4c8675498e233" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "bytes", "http", "http-body", @@ -3578,7 +3712,7 @@ checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" dependencies = [ "crossbeam-channel", "symlink", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tracing-subscriber", ] @@ -3591,7 +3725,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3743,9 +3877,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.4" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ "js-sys", "wasm-bindgen", @@ -3769,6 +3903,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -3835,7 +3979,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "wasm-bindgen-shared", ] @@ -3868,6 +4012,24 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "windows-core" version = "0.62.2" @@ -3889,7 +4051,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3900,7 +4062,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4011,9 +4173,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] @@ -4069,28 +4231,28 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.53" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75726053136156d419e285b9b7eddaaea9e3fea6ce32eed44a89901f0bd98de1" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.53" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4714fd92cf900833d49538023a9b3915155210801d1c1169eba513b2addefd71" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4110,7 +4272,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "synstructure", ] @@ -4131,7 +4293,7 @@ checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4164,11 +4326,11 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.nix b/Cargo.nix index de95a38e..da9837cf 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -362,9 +362,9 @@ rec { }; "anyhow" = rec { crateName = "anyhow"; - version = "1.0.103"; + version = "1.0.104"; edition = "2021"; - sha256 = "1wsav2g6vxcvf2c0fv3jhxfr55l0p2g8nygy7rmmvcsfwgi8ahra"; + sha256 = "0w34jjcm02p5g9kvsjr1dvpw0zs2fi7igi6nr414fkm5gz85w2ik"; authors = [ "David Tolnay " ]; @@ -481,7 +481,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" "visit-mut" ]; } ]; @@ -489,9 +489,9 @@ rec { }; "async-trait" = rec { crateName = "async-trait"; - version = "0.1.89"; + version = "0.1.91"; edition = "2021"; - sha256 = "1fsxxmz3rzx1prn1h3rs7kyjhkap60i7xvi0ldapkvbb14nssdch"; + sha256 = "1v3cm8mzg66037wm392p1vsdx0lq8bid6y2ivr7z03lpfx0xqdmf"; procMacro = true; libName = "async_trait"; authors = [ @@ -508,7 +508,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 3.0.3"; usesDefaultFeatures = false; features = [ "clone-impls" "full" "parsing" "printing" "proc-macro" "visit-mut" ]; } @@ -877,11 +877,11 @@ rec { }; resolvedDefaultFeatures = [ "default" ]; }; - "bitflags 2.13.0" = rec { + "bitflags 2.13.1" = rec { crateName = "bitflags"; - version = "2.13.0"; + version = "2.13.1"; edition = "2021"; - sha256 = "1y239gpvl061rfvav7jds8mjs42kmwi39is7yx5d1qw3hvp8nf5l"; + sha256 = "1nl76mpykmwmb8rq1l5vw1azdh1wvxdrnsk4sy3rdrzx01nvg25m"; authors = [ "The Rust Project Developers" ]; @@ -959,9 +959,9 @@ rec { }; "bytes" = rec { crateName = "bytes"; - version = "1.12.0"; + version = "1.12.1"; edition = "2021"; - sha256 = "14xmxm8imyvw675bsgyadmzm9k63js1sdqh7099p0hlj2p9zbqwa"; + sha256 = "017z19dpg4f942h051m7bpnzcgng042hhcpd7bmg7bjjqd42lrgw"; authors = [ "Carl Lerche " "Sean McArthur " @@ -975,9 +975,9 @@ rec { }; "cc" = rec { crateName = "cc"; - version = "1.2.66"; + version = "1.3.0"; edition = "2018"; - sha256 = "15nr9bpbcinb9z7zvr1d70xyivv8969v490001qdjywrjg3wmmpm"; + sha256 = "1f27b93qhs65bjq04ljwgwxf8xq2qbba4j1k99cv9d9qav88i5f8"; authors = [ "Alex Crichton " ]; @@ -1074,10 +1074,10 @@ rec { }; "clap" = rec { crateName = "clap"; - version = "4.6.1"; + version = "4.6.4"; edition = "2024"; crateBin = []; - sha256 = "0lcf88l7vlg796rrqr7wipbbmfa5sgsgx4211b7xmxxv8dz13nqx"; + sha256 = "1dz5brl39xchkml0khm348i87w89misprlinmnk77vwjawa0q7nr"; dependencies = [ { name = "clap_builder"; @@ -1116,9 +1116,9 @@ rec { }; "clap_builder" = rec { crateName = "clap_builder"; - version = "4.6.0"; + version = "4.6.2"; edition = "2024"; - sha256 = "17q6np22yxhh5y5v53y4l31ps3hlaz45mvz2n2nicr7n3c056jki"; + sha256 = "12sl6fyj6w2djxj0lsc1lkj1h3wpx74fjhb37izvaf65vjpji5ph"; dependencies = [ { name = "anstream"; @@ -1155,9 +1155,9 @@ rec { }; "clap_derive" = rec { crateName = "clap_derive"; - version = "4.6.1"; + version = "4.6.4"; edition = "2024"; - sha256 = "1acpz49hi00iv9jkapixjzcv7s51x8qkfaqscjm36rqgf428dkpj"; + sha256 = "0qd0v7pa2arwxjjinmjim6xrjy61bc28m1yryhc7zjjssswx44nh"; procMacro = true; dependencies = [ { @@ -1174,7 +1174,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 3.0.3"; features = [ "full" ]; } ]; @@ -1199,6 +1199,53 @@ rec { sha256 = "0w75k89hw39p0mnnhlrwr23q50rza1yjki44qvh2mgrnj065a1qx"; }; + "combine" = rec { + crateName = "combine"; + version = "4.6.7"; + edition = "2018"; + sha256 = "1z8rh8wp59gf8k23ar010phgs0wgf5i8cx4fg01gwcnzfn5k0nms"; + authors = [ + "Markus Westerlind " + ]; + dependencies = [ + { + name = "bytes"; + packageId = "bytes"; + optional = true; + } + { + name = "memchr"; + packageId = "memchr"; + usesDefaultFeatures = false; + } + ]; + devDependencies = [ + { + name = "bytes"; + packageId = "bytes"; + } + ]; + features = { + "bytes" = [ "dep:bytes" ]; + "bytes_05" = [ "dep:bytes_05" ]; + "default" = [ "std" ]; + "futures-03" = [ "pin-project" "std" "futures-core-03" "futures-io-03" "pin-project-lite" ]; + "futures-core-03" = [ "dep:futures-core-03" ]; + "futures-io-03" = [ "dep:futures-io-03" ]; + "pin-project" = [ "pin-project-lite" ]; + "pin-project-lite" = [ "dep:pin-project-lite" ]; + "regex" = [ "dep:regex" ]; + "std" = [ "memchr/std" "bytes" "alloc" ]; + "tokio" = [ "tokio-dep" "tokio-util/io" "futures-core-03" "pin-project-lite" ]; + "tokio-02" = [ "pin-project" "std" "tokio-02-dep" "futures-core-03" "pin-project-lite" "bytes_05" ]; + "tokio-02-dep" = [ "dep:tokio-02-dep" ]; + "tokio-03" = [ "pin-project" "std" "tokio-03-dep" "futures-core-03" "pin-project-lite" ]; + "tokio-03-dep" = [ "dep:tokio-03-dep" ]; + "tokio-dep" = [ "dep:tokio-dep" ]; + "tokio-util" = [ "dep:tokio-util" ]; + }; + resolvedDefaultFeatures = [ "alloc" "bytes" "default" "std" ]; + }; "concurrent-queue" = rec { crateName = "concurrent-queue"; version = "2.5.0"; @@ -1605,7 +1652,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" "extra-traits" ]; } ]; @@ -1636,7 +1683,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; @@ -1690,7 +1737,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" "extra-traits" ]; } ]; @@ -1709,7 +1756,7 @@ rec { dependencies = [ { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; } ]; features = { @@ -1736,7 +1783,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" "visit-mut" ]; } ]; @@ -1813,7 +1860,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "extra-traits" ]; } ]; @@ -1907,7 +1954,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; buildDependencies = [ @@ -2004,7 +2051,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; features = { @@ -2170,13 +2217,13 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; devDependencies = [ { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" ]; } ]; @@ -2390,7 +2437,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; features = { @@ -2513,9 +2560,9 @@ rec { }; "fastrand" = rec { crateName = "fastrand"; - version = "2.4.1"; + version = "2.5.0"; edition = "2018"; - sha256 = "1mnqxxnxvd69ma9mczabpbbsgwlhd6l78yv3vd681453a9s247wz"; + sha256 = "08q2r30y62winysimnlpbvw9kiwn0rmdlidqlmzd6z90mv764z6s"; authors = [ "Stjepan Glavina " ]; @@ -2692,11 +2739,11 @@ rec { }; resolvedDefaultFeatures = [ "default" "use_std" "with-deprecated" ]; }; - "futures 0.3.32" = rec { + "futures 0.3.33" = rec { crateName = "futures"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "0b9q86r5ar18v5xjiyqn7sb8sa32xv98qqnfz779gl7ns7lpw54b"; + sha256 = "066j5aqz8an05xh4hn5ljdnjn80z3g335v4grx4gaifr57wg3358"; dependencies = [ { name = "futures-channel"; @@ -2756,9 +2803,9 @@ rec { }; "futures-channel" = rec { crateName = "futures-channel"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "07fcyzrmbmh7fh4ainilf1s7gnwvnk07phdq77jkb9fpa2ffifq7"; + sha256 = "1bn5hlhfkl1sgypmiachaqcgwmr6wmjal7dyhfyb1zkazvs90996"; libName = "futures_channel"; dependencies = [ { @@ -2784,9 +2831,9 @@ rec { }; "futures-core" = rec { crateName = "futures-core"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "07bbvwjbm5g2i330nyr1kcvjapkmdqzl4r6mqv75ivvjaa0m0d3y"; + sha256 = "1iqdbvcdlplfr2g43h7xrfkv2sg5p1a26x8acz1xgxl07i3hrm9c"; libName = "futures_core"; features = { "default" = [ "std" ]; @@ -2797,9 +2844,9 @@ rec { }; "futures-executor" = rec { crateName = "futures-executor"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "17aplz3ns74qn7a04qg7qlgsdx5iwwwkd4jvdfra6hl3h4w9rwms"; + sha256 = "0n3lpkmcfrsnh40i4armn040gnqbpd257hz5qs46zipjr6f8fm37"; libName = "futures_executor"; dependencies = [ { @@ -2827,9 +2874,9 @@ rec { }; "futures-io" = rec { crateName = "futures-io"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "063pf5m6vfmyxj74447x8kx9q8zj6m9daamj4hvf49yrg9fs7jyf"; + sha256 = "0yjx13qdm9b2p4w00ddw85k6yccnnmqrlrrz8yfmi5jg7jmfqxs5"; libName = "futures_io"; features = { "default" = [ "std" ]; @@ -2838,9 +2885,9 @@ rec { }; "futures-macro" = rec { crateName = "futures-macro"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "0ys4b1lk7s0bsj29pv42bxsaavalch35rprp64s964p40c1bfdg8"; + sha256 = "02xiyd5y1nk9b805aympj4wq2czgvxnhcml9w9xkc665d3g3qv9d"; procMacro = true; libName = "futures_macro"; dependencies = [ @@ -2854,7 +2901,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" ]; } ]; @@ -2862,9 +2909,9 @@ rec { }; "futures-sink" = rec { crateName = "futures-sink"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "14q8ml7hn5a6gyy9ri236j28kh0svqmrk4gcg0wh26rkazhm95y3"; + sha256 = "01z38z344hpryw84b6r0rbwcb669d8pyvl2szg10aqwx96n1hi73"; libName = "futures_sink"; features = { "default" = [ "std" ]; @@ -2874,9 +2921,9 @@ rec { }; "futures-task" = rec { crateName = "futures-task"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "14s3vqf8llz3kjza33vn4ixg6kwxp61xrysn716h0cwwsnri2xq3"; + sha256 = "02f1y1yvjg1cv998zkgl1706pi9y4fyc9045l1hlmyqyhclfscdj"; libName = "futures_task"; features = { "default" = [ "std" ]; @@ -2901,9 +2948,9 @@ rec { }; "futures-util" = rec { crateName = "futures-util"; - version = "0.3.32"; + version = "0.3.33"; edition = "2018"; - sha256 = "1mn60lw5kh32hz9isinjlpw34zx708fk5q1x0m40n6g6jq9a971q"; + sha256 = "1anyg40j5www5l22r2jbn1birsafz4q1w9qmcjk4vqzwasi90ym7"; libName = "futures_util"; dependencies = [ { @@ -2984,7 +3031,10 @@ rec { "io-compat" = [ "io" "compat" "tokio-io" "libc" ]; "libc" = [ "dep:libc" ]; "memchr" = [ "dep:memchr" ]; - "portable-atomic" = [ "futures-core/portable-atomic" ]; + "portable-atomic" = [ "futures-core/portable-atomic" "portable_atomic_crate" ]; + "portable-atomic-alloc" = [ "portable-atomic-util/alloc" "portable-atomic" ]; + "portable-atomic-util" = [ "dep:portable-atomic-util" ]; + "portable_atomic_crate" = [ "dep:portable_atomic_crate" ]; "sink" = [ "futures-sink" ]; "slab" = [ "dep:slab" ]; "spin" = [ "dep:spin" ]; @@ -3244,7 +3294,7 @@ rec { dependencies = [ { name = "bitflags"; - packageId = "bitflags 2.13.0"; + packageId = "bitflags 2.13.1"; } { name = "libc"; @@ -3273,9 +3323,9 @@ rec { }; "glob" = rec { crateName = "glob"; - version = "0.3.3"; - edition = "2015"; - sha256 = "106jpd3syfzjfj2k70mwm0v436qbx96wig98m4q8x071yrq35hhc"; + version = "0.3.4"; + edition = "2021"; + sha256 = "02zby4rsidb2ksrnysyrsaap7rk6wpp7vl5chflndafhl5gaisz4"; authors = [ "The Rust Project Developers" ]; @@ -3319,10 +3369,10 @@ rec { }; "granit-parser" = rec { crateName = "granit-parser"; - version = "0.0.3"; + version = "0.0.7"; edition = "2021"; crateBin = []; - sha256 = "14bwwc8swz8h0v8d7qybmmq25czv5aipd1v1vbariq7rchhs62zm"; + sha256 = "0bdac2as3130i83pvlsl8gdasvfy5kvaj5ylry2hv0rj8ynq2gyh"; libName = "granit_parser"; authors = [ "Ethiraric " @@ -3599,9 +3649,9 @@ rec { }; "http-body" = rec { crateName = "http-body"; - version = "1.0.1"; + version = "1.1.0"; edition = "2018"; - sha256 = "111ir5k2b9ihz5nr9cz7cwm7fnydca7dx4hc7vr16scfzghxrzhy"; + sha256 = "0b5wj0rdj8p03k20q8x0jy249amg2db919fnmh7zcrgf2clqyana"; libName = "http_body"; authors = [ "Carl Lerche " @@ -3622,9 +3672,9 @@ rec { }; "http-body-util" = rec { crateName = "http-body-util"; - version = "0.1.3"; + version = "0.1.4"; edition = "2018"; - sha256 = "0jm6jv4gxsnlsi1kzdyffjrj8cfr3zninnxpw73mvkxy4qzdj8dh"; + sha256 = "1wizkqx9a75x8v5lm7cawpammz8sfvd7cngnkp34wkcfl3b1zx79"; libName = "http_body_util"; authors = [ "Carl Lerche " @@ -3693,9 +3743,9 @@ rec { }; "hyper" = rec { crateName = "hyper"; - version = "1.10.1"; + version = "1.11.0"; edition = "2021"; - sha256 = "1624nwrh1ci34psqcl3q8q266kha8kd6fmqjj14qck49l59iqa2m"; + sha256 = "0wha96biivgpj0fpf80a2aar5dfbff1lk62i9x9i2bl53wl5686j"; authors = [ "Sean McArthur " ]; @@ -3790,7 +3840,7 @@ rec { "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" ]; - "http2" = [ "dep:futures-channel" "dep:futures-core" "dep:h2" ]; + "http2" = [ "dep:atomic-waker" "dep:futures-channel" "dep:futures-core" "dep:h2" ]; "server" = [ "dep:httpdate" "dep:pin-project-lite" "dep:smallvec" ]; "tracing" = [ "dep:tracing" ]; }; @@ -4650,9 +4700,9 @@ rec { }; "jiff" = rec { crateName = "jiff"; - version = "0.2.31"; + version = "0.2.34"; edition = "2021"; - sha256 = "0d6nvffabb1v34x2s2a3xjca4zny1dfdhqm3xy0wyl77rchn3znc"; + sha256 = "05kfvhd4rp0a44qipkzlag547j5s3zxs46ql1pibf3mq8yax1171"; authors = [ "Andrew Gallant " ]; @@ -4662,6 +4712,12 @@ rec { packageId = "defmt"; optional = true; } + { + name = "jiff-core"; + packageId = "jiff-core"; + rename = "jcore"; + usesDefaultFeatures = false; + } { name = "jiff-static"; packageId = "jiff-static"; @@ -4716,16 +4772,16 @@ rec { } ]; features = { - "alloc" = [ "serde_core?/alloc" "portable-atomic-util/alloc" "defmt?/alloc" ]; + "alloc" = [ "jcore/alloc" "serde_core?/alloc" "portable-atomic-util/alloc" "defmt?/alloc" ]; "default" = [ "std" "tz-system" "tz-fat" "tzdb-bundle-platform" "tzdb-zoneinfo" "tzdb-concatenated" "perf-inline" ]; - "defmt" = [ "dep:defmt" ]; + "defmt" = [ "dep:defmt" "jcore/defmt" ]; "js" = [ "dep:wasm-bindgen" "dep:js-sys" ]; - "logging" = [ "dep:log" ]; + "logging" = [ "dep:log" "jcore/logging" ]; "serde" = [ "dep:serde_core" ]; "static" = [ "static-tz" "jiff-static?/tzdb" ]; "static-tz" = [ "dep:jiff-static" ]; - "std" = [ "alloc" "log?/std" "serde_core?/std" ]; - "tz-fat" = [ "jiff-static?/tz-fat" ]; + "std" = [ "alloc" "jcore/std" "log?/std" "serde_core?/std" ]; + "tz-fat" = [ "jcore/tz-fat" "jiff-static?/tz-fat" ]; "tz-system" = [ "std" "dep:windows-link" ]; "tzdb-bundle-always" = [ "dep:jiff-tzdb" "alloc" ]; "tzdb-bundle-platform" = [ "dep:jiff-tzdb-platform" "alloc" ]; @@ -4734,17 +4790,47 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "default" "perf-inline" "serde" "std" "tz-fat" "tz-system" "tzdb-bundle-platform" "tzdb-concatenated" "tzdb-zoneinfo" ]; }; + "jiff-core" = rec { + crateName = "jiff-core"; + version = "0.1.0"; + edition = "2021"; + sha256 = "02axx56pkh2w4bw5rp94qlvcpwzd3n2w2025fnikvrgg762aiv3z"; + libName = "jiff_core"; + authors = [ + "Andrew Gallant " + ]; + dependencies = [ + { + name = "defmt"; + packageId = "defmt"; + optional = true; + } + ]; + features = { + "alloc" = [ "defmt?/alloc" ]; + "default" = [ "std" "tz-fat" ]; + "defmt" = [ "dep:defmt" ]; + "logging" = [ "dep:log" ]; + "std" = [ "alloc" ]; + }; + resolvedDefaultFeatures = [ "alloc" "default" "std" "tz-fat" ]; + }; "jiff-static" = rec { crateName = "jiff-static"; - version = "0.2.31"; + version = "0.2.34"; edition = "2021"; - sha256 = "1lpdrmzd5yafwzniw0xi5gac4rz0vccsja1qrprjim32ysbyhrg1"; + sha256 = "1pp9w3jn2l3zkqn35j3mfgzl4xwh9ddb0z37vhagkym6nxva0g9j"; procMacro = true; libName = "jiff_static"; authors = [ "Andrew Gallant " ]; dependencies = [ + { + name = "jiff-core"; + packageId = "jiff-core"; + rename = "jcore"; + } { name = "proc-macro2"; packageId = "proc-macro2"; @@ -4755,7 +4841,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; features = { @@ -4765,9 +4851,9 @@ rec { }; "jiff-tzdb" = rec { crateName = "jiff-tzdb"; - version = "0.1.7"; + version = "0.1.8"; edition = "2021"; - sha256 = "14353p1g4234ww11f6jqy51fkrp31dqijaj0hwsjng59y5yj8hk1"; + sha256 = "07hl9sgzfb9as1x0n5bjk1qxishzcriapy9xa481y8xd6acx6aql"; libName = "jiff_tzdb"; libPath = "lib.rs"; authors = [ @@ -4792,6 +4878,134 @@ rec { } ]; + }; + "jni" = rec { + crateName = "jni"; + version = "0.22.4"; + edition = "2024"; + sha256 = "161lza8gz071h22pgyqyx4n91ixd691z2dbb1pq2g97k5i49mzay"; + authors = [ + "jni team" + ]; + dependencies = [ + { + name = "cfg-if"; + packageId = "cfg-if"; + } + { + name = "combine"; + packageId = "combine"; + } + { + name = "jni-macros"; + packageId = "jni-macros"; + } + { + name = "jni-sys"; + packageId = "jni-sys"; + } + { + name = "log"; + packageId = "log"; + } + { + name = "simd_cesu8"; + packageId = "simd_cesu8"; + } + { + name = "thiserror"; + packageId = "thiserror 2.0.19"; + } + { + name = "windows-link"; + packageId = "windows-link"; + target = { target, features }: (target."windows" or false); + } + ]; + buildDependencies = [ + { + name = "walkdir"; + packageId = "walkdir"; + } + ]; + features = { + "invocation" = [ "dep:java-locator" "dep:libloading" ]; + }; + }; + "jni-macros" = rec { + crateName = "jni-macros"; + version = "0.22.4"; + edition = "2024"; + sha256 = "18v02mcn5c7mb2yw6r930xg6ynsn7hwkxv8z2kdhn3qprjn0j0d0"; + procMacro = true; + libName = "jni_macros"; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "simd_cesu8"; + packageId = "simd_cesu8"; + } + { + name = "syn"; + packageId = "syn 2.0.119"; + features = [ "full" ]; + } + ]; + buildDependencies = [ + { + name = "rustc_version"; + packageId = "rustc_version"; + } + ]; + + }; + "jni-sys" = rec { + crateName = "jni-sys"; + version = "0.4.1"; + edition = "2021"; + sha256 = "1wlahx6f2zhczdjqyn8mk7kshb8x5vsd927sn3lvw41rrf47ldy6"; + libName = "jni_sys"; + authors = [ + "Steven Fackler " + "Robert Bragg " + ]; + dependencies = [ + { + name = "jni-sys-macros"; + packageId = "jni-sys-macros"; + } + ]; + + }; + "jni-sys-macros" = rec { + crateName = "jni-sys-macros"; + version = "0.4.1"; + edition = "2021"; + sha256 = "0r32gbabrak15a7p487765b5wc0jcna2yv88mk6m1zjqyi1bkh1q"; + procMacro = true; + libName = "jni_sys_macros"; + authors = [ + "Robert Bragg " + ]; + dependencies = [ + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn 2.0.119"; + features = [ "full" ]; + } + ]; + }; "jobserver" = rec { crateName = "jobserver"; @@ -4880,7 +5094,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; } ]; devDependencies = [ @@ -4903,9 +5117,9 @@ rec { }; "jsonpath-rust" = rec { crateName = "jsonpath-rust"; - version = "1.0.4"; + version = "1.0.5"; edition = "2021"; - sha256 = "1ymdpqawc3nxrlr6izwpw22h5msa16wqjbkqldijhrxvqhh76fk3"; + sha256 = "0psx7dab3nax9hjjgvpk33x3n8ryjfnj7ykr3gw8pqdz844y08j2"; libName = "jsonpath_rust"; authors = [ "BorisZhguchev " @@ -4929,7 +5143,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; } ]; @@ -5026,9 +5240,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; libName = "k8s_version"; authors = [ @@ -5046,7 +5260,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.1"; + packageId = "snafu 0.9.2"; } ]; features = { @@ -5104,9 +5318,9 @@ rec { }; "kube" = rec { crateName = "kube"; - version = "4.0.0"; + version = "4.2.0"; edition = "2024"; - sha256 = "0ip1qc9kvgyp735rmxdjq75dspf737sazvhzs6b70siljn011fab"; + sha256 = "065z77zh7gbigcbv7mxk7firdf1w6278lal1jjqsnrh073hpz390"; authors = [ "clux " "Natalie Klestrup Röijezon " @@ -5179,9 +5393,9 @@ rec { }; "kube-client" = rec { crateName = "kube-client"; - version = "4.0.0"; + version = "4.2.0"; edition = "2024"; - sha256 = "0yskaybnf8m2c9rb0kxzlczb9jbx25sxdlqhzqhlq9n2bgh2ixnh"; + sha256 = "1lqny49zldysk1qr6pp2ifsp2ifqa5wcwplbj73wb9rk62kl1s9i"; libName = "kube_client"; authors = [ "clux " @@ -5206,7 +5420,7 @@ rec { } { name = "futures"; - packageId = "futures 0.3.32"; + packageId = "futures 0.3.33"; optional = true; usesDefaultFeatures = false; features = [ "std" ]; @@ -5281,6 +5495,11 @@ rec { optional = true; usesDefaultFeatures = false; } + { + name = "rustls-platform-verifier"; + packageId = "rustls-platform-verifier"; + optional = true; + } { name = "secrecy"; packageId = "secrecy"; @@ -5301,7 +5520,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; } { name = "tokio"; @@ -5337,7 +5556,7 @@ rec { devDependencies = [ { name = "futures"; - packageId = "futures 0.3.32"; + packageId = "futures 0.3.33"; usesDefaultFeatures = false; features = [ "async-await" ]; } @@ -5391,7 +5610,7 @@ rec { "pem" = [ "dep:pem" ]; "ring" = [ "hyper-rustls?/ring" ]; "rustls" = [ "dep:rustls" ]; - "rustls-tls" = [ "rustls" "hyper-rustls" ]; + "rustls-tls" = [ "rustls" "hyper-rustls" "dep:rustls-platform-verifier" ]; "serde-saphyr" = [ "dep:serde-saphyr" ]; "socks5" = [ "hyper-util/client-proxy" ]; "tame-oauth" = [ "dep:tame-oauth" ]; @@ -5408,9 +5627,9 @@ rec { }; "kube-core" = rec { crateName = "kube-core"; - version = "4.0.0"; + version = "4.2.0"; edition = "2024"; - sha256 = "1a7a3n4mwiqywajlld3axii0k7ridizp5mn7b06i81ms6dcjzc61"; + sha256 = "1d7f2acgydnica3gsva5my87kw8cbfyvbq1f6ln4dwwc24y3blm9"; libName = "kube_core"; authors = [ "clux " @@ -5467,7 +5686,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; } ]; devDependencies = [ @@ -5491,9 +5710,9 @@ rec { }; "kube-derive" = rec { crateName = "kube-derive"; - version = "4.0.0"; + version = "4.2.0"; edition = "2024"; - sha256 = "1an7av9xlif02klbk1xsz7nvggpnazpq2kpris0z3bbxf2c1h5zy"; + sha256 = "1h597lx7xd6x65ili9ccm8lmqdq3dg3384iwcf8vz0zsw4ciq54j"; procMacro = true; libName = "kube_derive"; authors = [ @@ -5525,7 +5744,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "extra-traits" ]; } ]; @@ -5540,9 +5759,9 @@ rec { }; "kube-runtime" = rec { crateName = "kube-runtime"; - version = "4.0.0"; + version = "4.2.0"; edition = "2024"; - sha256 = "08db3c5bg185y2yh6vilbkwqfdm5aykf87xllllwzis0qmkfrpcr"; + sha256 = "1isw7mh35jmfwi3kx9ibpcgw77lyv9h3ji2ajdgabgn7f7pn9c1y"; libName = "kube_runtime"; authors = [ "clux " @@ -5574,7 +5793,7 @@ rec { } { name = "futures"; - packageId = "futures 0.3.32"; + packageId = "futures 0.3.33"; usesDefaultFeatures = false; features = [ "async-await" ]; } @@ -5619,7 +5838,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; } { name = "tokio"; @@ -5682,12 +5901,9 @@ rec { }; "libc" = rec { crateName = "libc"; - version = "0.2.186"; + version = "0.2.189"; edition = "2021"; - sha256 = "0rnyhzjyqq9x56skkllbjzzzwym3r61lq3l4hqj64v71gw0r3av8"; - authors = [ - "The Rust Project Developers" - ]; + sha256 = "1whjfs375vlng2q6yrbzs73cvp5lm3w1n2gfqajb2vgf7zg3xbry"; features = { "default" = [ "std" ]; "rustc-dep-of-std" = [ "align" "rustc-std-workspace-core" ]; @@ -5698,10 +5914,10 @@ rec { }; "libgit2-sys" = rec { crateName = "libgit2-sys"; - version = "0.18.5+1.9.4"; + version = "0.18.7+1.9.6"; edition = "2021"; links = "git2"; - sha256 = "18lwqnhy7qxg4iw24s1a0n7aj7qbnryry1iy0w32k4f1xbk6lp80"; + sha256 = "12ad5zmffzbivn57d47lg2kgjprqsz0kq8i4lsqzlkwz9cg3kir3"; libName = "libgit2_sys"; libPath = "lib.rs"; authors = [ @@ -5895,9 +6111,9 @@ rec { }; "memchr" = rec { crateName = "memchr"; - version = "2.8.2"; + version = "2.8.3"; edition = "2021"; - sha256 = "1i33wr49pcz2sbd12nds3n9fszay8kq5bk78gwciz462mcs49448"; + sha256 = "161xa63ipfanf8v3nb82xd5hqgydv55nzw59wyngqbz6alfaz2yg"; authors = [ "Andrew Gallant " "bluss" @@ -5958,9 +6174,9 @@ rec { }; "mio" = rec { crateName = "mio"; - version = "1.2.1"; + version = "1.2.2"; edition = "2021"; - sha256 = "1nkggmrlnjs93w8rja4lvjj4aml1xqahgimv1h0p7d373kvhmg82"; + sha256 = "09y4b7gc42ymgssshh8sz6gs3y5r8bbigqaw2c4snh6fy5qmrmih"; authors = [ "Carl Lerche " "Thomas de Zeeuw " @@ -6073,7 +6289,7 @@ rec { } { name = "rand"; - packageId = "rand 0.8.6"; + packageId = "rand 0.8.7"; optional = true; usesDefaultFeatures = false; } @@ -6092,7 +6308,7 @@ rec { devDependencies = [ { name = "rand"; - packageId = "rand 0.8.6"; + packageId = "rand 0.8.7"; features = [ "small_rng" ]; } ]; @@ -6144,9 +6360,9 @@ rec { }; "num-iter" = rec { crateName = "num-iter"; - version = "0.1.45"; + version = "0.1.46"; edition = "2018"; - sha256 = "1gzm7vc5g9qsjjl3bqk9rz1h6raxhygbrcpbfl04swlh0i506a8l"; + sha256 = "12q4x0lp9l6bvsak1p5q24lvfzl99ak9vzmwhqbwksm1d6yh0a69"; libName = "num_iter"; authors = [ "The Rust Project Developers" @@ -6165,12 +6381,6 @@ rec { features = [ "i128" ]; } ]; - buildDependencies = [ - { - name = "autocfg"; - packageId = "autocfg"; - } - ]; features = { "default" = [ "std" ]; "std" = [ "num-integer/std" "num-traits/std" ]; @@ -6271,7 +6481,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; optional = true; usesDefaultFeatures = false; } @@ -6441,7 +6651,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; usesDefaultFeatures = false; } { @@ -6641,14 +6851,14 @@ rec { } { name = "rand"; - packageId = "rand 0.9.4"; + packageId = "rand 0.9.5"; optional = true; usesDefaultFeatures = false; features = [ "std" "std_rng" "small_rng" "os_rng" "thread_rng" ]; } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; usesDefaultFeatures = false; } { @@ -6949,9 +7159,9 @@ rec { }; "pest" = rec { crateName = "pest"; - version = "2.8.7"; + version = "2.8.8"; edition = "2021"; - sha256 = "1sc2jzy3hjvj7qqwbygl4psbnzf1lk2j9kbbiin2ssjw63bpsqj7"; + sha256 = "18jhl2zpxvl6kikc0jgp7gi7i7cy9s634z5bnvx70w1whjz2ixvx"; authors = [ "Dragoș Tiselice " ]; @@ -6978,9 +7188,9 @@ rec { }; "pest_derive" = rec { crateName = "pest_derive"; - version = "2.8.7"; + version = "2.8.8"; edition = "2021"; - sha256 = "0n4xs953qz7yyl4f3iibcflh3fh3v98vl9wyd2midm6abqr58hjb"; + sha256 = "1zcijlfdf6sk2s6l1qnm3j7kj7d4ymqcial8w4p4dcr67gydcbcy"; procMacro = true; authors = [ "Dragoș Tiselice " @@ -7006,9 +7216,9 @@ rec { }; "pest_generator" = rec { crateName = "pest_generator"; - version = "2.8.7"; + version = "2.8.8"; edition = "2021"; - sha256 = "19z0jlls9aqn5yfrrpg2vfqq50ifzh1z19mwxjngga6pxa8hwk3c"; + sha256 = "1dkmk6r6bb2hh5wayymfmwd7mswwbyhw12dnx2lrdxdnrw2r4yka"; authors = [ "Dragoș Tiselice " ]; @@ -7032,7 +7242,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; features = { @@ -7044,9 +7254,9 @@ rec { }; "pest_meta" = rec { crateName = "pest_meta"; - version = "2.8.7"; + version = "2.8.8"; edition = "2021"; - sha256 = "0462h8zrm7vr1fdy49mxi5gfs7nlpbrbajwj6iiy1zhnh724nx7r"; + sha256 = "0z7m54jc3nj3nxbbk4kyjfa06d8s24vhf6krzj2867nyq18x7aw5"; authors = [ "Dragoș Tiselice " ]; @@ -7092,7 +7302,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; usesDefaultFeatures = false; features = [ "parsing" "printing" "clone-impls" "proc-macro" "full" "visit-mut" ]; } @@ -7188,9 +7398,9 @@ rec { }; "portable-atomic" = rec { crateName = "portable-atomic"; - version = "1.13.1"; + version = "1.14.0"; edition = "2018"; - sha256 = "0j8vlar3n5acyigq8q6f4wjx3k3s5yz0rlpqrv76j73gi5qr8fn3"; + sha256 = "1hyfma9n2cs2ibazpfwrbv61zwg7cv86g0pr5yjkg07qgr4xa81x"; libName = "portable_atomic"; features = { "critical-section" = [ "dep:critical-section" ]; @@ -7324,9 +7534,9 @@ rec { }; "proc-macro2" = rec { crateName = "proc-macro2"; - version = "1.0.106"; + version = "1.0.107"; edition = "2021"; - sha256 = "0d09nczyaj67x4ihqr5p7gxbkz38gxhk4asc0k8q23g9n85hzl4g"; + sha256 = "1nb6ly8kp65f724kj73ippc7lvydss24sm2vagk6qpklpg4pwplq"; libName = "proc_macro2"; authors = [ "David Tolnay " @@ -7404,7 +7614,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "extra-traits" ]; } ]; @@ -7440,9 +7650,9 @@ rec { }; "quote" = rec { crateName = "quote"; - version = "1.0.46"; + version = "1.0.47"; edition = "2021"; - sha256 = "0s034glrlav8nzqy2yskqzv52ncy82k126sm2jk5j1vs1iylbg6z"; + sha256 = "00ch0yyzvv6s671ik0kcsbw8nigdaj2g3fr61kcahwx48aqlvgqz"; authors = [ "David Tolnay " ]; @@ -7482,11 +7692,11 @@ rec { "rustc-dep-of-std" = [ "core" ]; }; }; - "rand 0.8.6" = rec { + "rand 0.8.7" = rec { crateName = "rand"; - version = "0.8.6"; + version = "0.8.7"; edition = "2018"; - sha256 = "12kd4rljn86m00rcaz4c1rcya4mb4gk5ig6i8xq00a8wjgxfr82w"; + sha256 = "06iaf16fr0z8zly7anmn8ky0p80xnx9yv0gdcm30fwn9vqmigxi2"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -7516,11 +7726,11 @@ rec { }; resolvedDefaultFeatures = [ "rand_chacha" "std_rng" ]; }; - "rand 0.9.4" = rec { + "rand 0.9.5" = rec { crateName = "rand"; - version = "0.9.4"; + version = "0.9.5"; edition = "2021"; - sha256 = "1sknbxgs6nfg0nxdd7689lwbyr2i4vaswchrv4b34z8vpc3azia4"; + sha256 = "0hbvllk8g28mqjld6hqmckk69w296qpzg95whm3didsyg46ivvxr"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -7673,7 +7883,7 @@ rec { dependencies = [ { name = "bitflags"; - packageId = "bitflags 2.13.0"; + packageId = "bitflags 2.13.1"; } ]; features = { @@ -7685,9 +7895,9 @@ rec { }; "ref-cast" = rec { crateName = "ref-cast"; - version = "1.0.25"; + version = "1.0.26"; edition = "2021"; - sha256 = "0zdzc34qjva9xxgs889z5iz787g81hznk12zbk4g2xkgwq530m7k"; + sha256 = "0vdra0766jcc2czzqwhql41kkfyajdnai1pbkjxbq8vr7mvqyvi1"; libName = "ref_cast"; authors = [ "David Tolnay " @@ -7702,9 +7912,9 @@ rec { }; "ref-cast-impl" = rec { crateName = "ref-cast-impl"; - version = "1.0.25"; + version = "1.0.26"; edition = "2021"; - sha256 = "1nkhn1fklmn342z5c4mzfzlxddv3x8yhxwwk02cj06djvh36065p"; + sha256 = "0g70ff9an5i97cw9kijgzqrqydz7smcfic2zyydddizfbxl874ic"; procMacro = true; libName = "ref_cast_impl"; authors = [ @@ -7721,16 +7931,16 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 3.0.3"; } ]; }; "regex" = rec { crateName = "regex"; - version = "1.12.4"; + version = "1.13.1"; edition = "2021"; - sha256 = "1fm6si2xpmhwqflabdqsakc0qkq718wx2ljl37nbj75fb5vjnagi"; + sha256 = "1391a0a4100ik8cp7l577p3ip3haqq03rd9c5vdr7vcfdixj687h"; authors = [ "The Rust Project Developers" "Andrew Gallant " @@ -7786,9 +7996,9 @@ rec { }; "regex-automata" = rec { crateName = "regex-automata"; - version = "0.4.14"; + version = "0.4.16"; edition = "2021"; - sha256 = "13xf7hhn4qmgfh784llcp2kzrvljd13lb2b1ca0mwnf15w9d87bf"; + sha256 = "1b8ihxq99g3hr8mr37bvhib4bfn8rlmpmp0wjg2q1j50plvdpkwg"; libName = "regex_automata"; authors = [ "The Rust Project Developers" @@ -8352,7 +8562,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" "parsing" "extra-traits" "visit" "visit-mut" ]; } { @@ -8387,9 +8597,9 @@ rec { }; "rustls" = rec { crateName = "rustls"; - version = "0.23.41"; + version = "0.23.42"; edition = "2021"; - sha256 = "07vbs2935a7xjqqvy8w3ndzmmw8dg769d9zcgdg7k6sdccjv34kb"; + sha256 = "0f619dq1izpl40glcqgfjbqzpmwg8g5iffjx4429sh4v06mzqm1w"; dependencies = [ { name = "log"; @@ -8487,9 +8697,9 @@ rec { }; "rustls-pki-types" = rec { crateName = "rustls-pki-types"; - version = "1.15.0"; + version = "1.15.1"; edition = "2021"; - sha256 = "0imhb5d0m4hinavcgqxzmqpb55zjahv19g0lxrkh167k9ai9jj3n"; + sha256 = "15hakk4pcvr5278cazgw9qf2r7gdg09rg5pivbyd3dbyih12aj9g"; libName = "rustls_pki_types"; dependencies = [ { @@ -8507,6 +8717,139 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "default" "std" ]; }; + "rustls-platform-verifier" = rec { + crateName = "rustls-platform-verifier"; + version = "0.7.0"; + edition = "2021"; + sha256 = "181v4d0vl53vdh2wq56vghal1zyhdgqvy4xa8r45zwz4di9y5l96"; + libName = "rustls_platform_verifier"; + dependencies = [ + { + name = "core-foundation"; + packageId = "core-foundation"; + target = { target, features }: (("apple" == target."vendor" or null)); + } + { + name = "core-foundation-sys"; + packageId = "core-foundation-sys"; + target = { target, features }: (("apple" == target."vendor" or null)); + } + { + name = "jni"; + packageId = "jni"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "jni"; + packageId = "jni"; + usesDefaultFeatures = false; + target = { target, features }: ("android" == target."os" or null); + } + { + name = "log"; + packageId = "log"; + } + { + name = "once_cell"; + packageId = "once_cell"; + optional = true; + } + { + name = "once_cell"; + packageId = "once_cell"; + target = { target, features }: ("android" == target."os" or null); + } + { + name = "rustls"; + packageId = "rustls"; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "rustls-native-certs"; + packageId = "rustls-native-certs"; + target = { target, features }: ((target."unix" or false) && (!("android" == target."os" or null)) && (!("apple" == target."vendor" or null)) && (!("wasm32" == target."arch" or null))); + } + { + name = "rustls-platform-verifier-android"; + packageId = "rustls-platform-verifier-android"; + target = { target, features }: ("android" == target."os" or null); + } + { + name = "rustls-webpki"; + packageId = "rustls-webpki"; + rename = "webpki"; + usesDefaultFeatures = false; + target = { target, features }: ((target."unix" or false) && (!("android" == target."os" or null)) && (!("apple" == target."vendor" or null)) && (!("wasm32" == target."arch" or null))); + } + { + name = "rustls-webpki"; + packageId = "rustls-webpki"; + rename = "webpki"; + usesDefaultFeatures = false; + target = { target, features }: ("wasm32" == target."arch" or null); + } + { + name = "rustls-webpki"; + packageId = "rustls-webpki"; + rename = "webpki"; + usesDefaultFeatures = false; + target = { target, features }: ("android" == target."os" or null); + } + { + name = "security-framework"; + packageId = "security-framework"; + target = { target, features }: (("apple" == target."vendor" or null)); + } + { + name = "security-framework-sys"; + packageId = "security-framework-sys"; + target = { target, features }: (("apple" == target."vendor" or null)); + } + { + name = "webpki-root-certs"; + packageId = "webpki-root-certs"; + target = { target, features }: ("wasm32" == target."arch" or null); + } + { + name = "windows-sys"; + packageId = "windows-sys 0.61.2"; + usesDefaultFeatures = false; + target = { target, features }: (target."windows" or false); + features = [ "Win32_Foundation" "Win32_Security_Cryptography" ]; + } + ]; + devDependencies = [ + { + name = "rustls"; + packageId = "rustls"; + usesDefaultFeatures = false; + features = [ "ring" ]; + } + { + name = "webpki-root-certs"; + packageId = "webpki-root-certs"; + } + ]; + features = { + "android_logger" = [ "dep:android_logger" ]; + "base64" = [ "dep:base64" ]; + "cert-logging" = [ "base64" ]; + "docsrs" = [ "jni" "once_cell" ]; + "ffi-testing" = [ "android_logger" "rustls/ring" ]; + "jni" = [ "dep:jni" ]; + "once_cell" = [ "dep:once_cell" ]; + }; + }; + "rustls-platform-verifier-android" = rec { + crateName = "rustls-platform-verifier-android"; + version = "0.1.1"; + edition = "2021"; + sha256 = "13vq6sxsgz9547xm2zbdxiw8x7ad1g8n8ax6xvxsjqszk7q6awgq"; + libName = "rustls_platform_verifier_android"; + + }; "rustls-webpki" = rec { crateName = "rustls-webpki"; version = "0.103.13"; @@ -8566,6 +8909,24 @@ rec { "no-panic" = [ "dep:no-panic" ]; }; }; + "same-file" = rec { + crateName = "same-file"; + version = "1.0.6"; + edition = "2018"; + sha256 = "00h5j1w87dmhnvbv9l8bic3y7xxsnjmssvifw2ayvgx9mb1ivz4k"; + libName = "same_file"; + authors = [ + "Andrew Gallant " + ]; + dependencies = [ + { + name = "winapi-util"; + packageId = "winapi-util"; + target = { target, features }: (target."windows" or false); + } + ]; + + }; "schannel" = rec { crateName = "schannel"; version = "0.1.29"; @@ -8694,13 +9055,13 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; devDependencies = [ { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "extra-traits" ]; } ]; @@ -8811,7 +9172,7 @@ rec { dependencies = [ { name = "bitflags"; - packageId = "bitflags 2.13.0"; + packageId = "bitflags 2.13.1"; } { name = "core-foundation"; @@ -8863,6 +9224,7 @@ rec { features = { "default" = [ "OSX_10_13" ]; }; + resolvedDefaultFeatures = [ "OSX_10_13" "default" ]; }; "semver" = rec { crateName = "semver"; @@ -8880,9 +9242,9 @@ rec { }; "serde" = rec { crateName = "serde"; - version = "1.0.228"; + version = "1.0.229"; edition = "2021"; - sha256 = "17mf4hhjxv5m90g42wmlbc61hdhlm6j9hwfkpcnd72rpgzm993ls"; + sha256 = "1fp04fq4a79bpm61xz1zy0pbz4kpc7d771zii1k3inmszq55jj21"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -8913,10 +9275,10 @@ rec { }; "serde-saphyr" = rec { crateName = "serde-saphyr"; - version = "0.0.27"; + version = "0.0.29"; edition = "2024"; crateBin = []; - sha256 = "1crx4kmmm88y4dbaramdsn0w8fqzchaz12b6vdgx7bddzb1v95sq"; + sha256 = "196f2kjh4c9zayliykx9s5jyr2zir1rz15fsxdnwmq0xj60jglkv"; libName = "serde_saphyr"; dependencies = [ { @@ -8961,9 +9323,8 @@ rec { optional = true; } { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; + name = "serde_core"; + packageId = "serde_core"; } { name = "smallvec"; @@ -8976,16 +9337,9 @@ rec { optional = true; } ]; - devDependencies = [ - { - name = "serde"; - packageId = "serde"; - features = [ "derive" "rc" ]; - } - ]; features = { "default" = [ "serialize" "deserialize" ]; - "deserialize" = [ "dep:base64" "dep:num-traits" "dep:annotate-snippets" "dep:granit-parser" "dep:smallvec" "dep:encoding_rs_io" "dep:ahash" ]; + "deserialize" = [ "dep:num-traits" "dep:annotate-snippets" "dep:granit-parser" "dep:smallvec" "dep:encoding_rs_io" "dep:ahash" ]; "figment" = [ "dep:figment" "deserialize" ]; "figment2" = [ "dep:figment2" "deserialize" ]; "garde" = [ "dep:garde" "deserialize" ]; @@ -8994,6 +9348,7 @@ rec { "miette" = [ "dep:miette" "deserialize" ]; "properties" = [ "deserialize" ]; "robotics" = [ "deserialize" ]; + "serde_derived_types" = [ "dep:serde" ]; "serialize" = [ "dep:base64" "dep:num-traits" "dep:zmij" "dep:nohash-hasher" ]; "validator" = [ "dep:validator" "deserialize" ]; }; @@ -9022,9 +9377,9 @@ rec { }; "serde_core" = rec { crateName = "serde_core"; - version = "1.0.228"; + version = "1.0.229"; edition = "2021"; - sha256 = "1bb7id2xwx8izq50098s5j2sqrrvk31jbbrjqygyan6ask3qbls1"; + sha256 = "0j1ajiha76h3nmd976il9li6975k121xa7jb39ws8n0yqp4s5p37"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -9049,9 +9404,9 @@ rec { }; "serde_derive" = rec { crateName = "serde_derive"; - version = "1.0.228"; + version = "1.0.229"; edition = "2021"; - sha256 = "0y8xm7fvmr2kjcd029g9fijpndh8csv5m20g4bd76w8qschg4h6m"; + sha256 = "0j4k63i7h1bikxwz2c89ig0hrwbnl9mz1czn85xx99x5cc9dg9g7"; procMacro = true; authors = [ "Erick Tryzelaar " @@ -9072,7 +9427,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 3.0.3"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" "proc-macro" ]; } @@ -9104,7 +9459,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" ]; } @@ -9113,9 +9468,9 @@ rec { }; "serde_json" = rec { crateName = "serde_json"; - version = "1.0.150"; + version = "1.0.151"; edition = "2021"; - sha256 = "1ffgfhy9kndjnrz8lmy95pr758p2zk8dxv6yi99x0vkkni24w0g8"; + sha256 = "051zww7lvpw147vvwss1ng6w587qyrkzg75fvj08q2dfrmgbahf8"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -9258,9 +9613,9 @@ rec { }; "sha1" = rec { crateName = "sha1"; - version = "0.10.6"; + version = "0.10.7"; edition = "2018"; - sha256 = "1fnnxlfg08xhkmwf2ahv634as30l1i3xhlhkvxflmasi5nd85gz3"; + sha256 = "1f632d529qzz95yrprr632w1fxqkrv6b6jksjc11vnzl049lay59"; authors = [ "RustCrypto Developers" ]; @@ -9287,10 +9642,8 @@ rec { } ]; features = { - "asm" = [ "sha1-asm" ]; "default" = [ "std" ]; "oid" = [ "digest/oid" ]; - "sha1-asm" = [ "dep:sha1-asm" ]; "std" = [ "digest/std" ]; }; resolvedDefaultFeatures = [ "default" "std" ]; @@ -9426,9 +9779,9 @@ rec { }; "simd-adler32" = rec { crateName = "simd-adler32"; - version = "0.3.9"; + version = "0.3.10"; edition = "2018"; - sha256 = "0532ysdwcvzyp2bwpk8qz0hijplcdwpssr5gy5r7qwqqy5z5qgbh"; + sha256 = "1sny4y2qa5mwyxx5x59ln2p02vsdh92004njlslnx98imjc9489s"; libName = "simd_adler32"; authors = [ "Marvin Countryman " @@ -9437,6 +9790,46 @@ rec { "default" = [ "std" "const-generics" ]; }; }; + "simd_cesu8" = rec { + crateName = "simd_cesu8"; + version = "1.2.0"; + edition = "2021"; + sha256 = "0865mv3nmd35f1dccjcfj7dncjmmvvdij3j61z4131mz38jiw0qi"; + authors = [ + "Sean C. Roach " + ]; + dependencies = [ + { + name = "simdutf8"; + packageId = "simdutf8"; + usesDefaultFeatures = false; + } + ]; + buildDependencies = [ + { + name = "rustc_version"; + packageId = "rustc_version"; + } + ]; + features = { + "default" = [ "std" ]; + "std" = [ "simdutf8/std" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "simdutf8" = rec { + crateName = "simdutf8"; + version = "0.1.5"; + edition = "2018"; + sha256 = "0vmpf7xaa0dnaikib5jlx6y4dxd3hxqz6l830qb079g7wcsgxag3"; + authors = [ + "Hans Kratz " + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; "slab" = rec { crateName = "slab"; version = "0.4.12"; @@ -9506,18 +9899,18 @@ rec { }; resolvedDefaultFeatures = [ "default" "guide" "std" ]; }; - "snafu 0.9.1" = rec { + "snafu 0.9.2" = rec { crateName = "snafu"; - version = "0.9.1"; + version = "0.9.2"; edition = "2018"; - sha256 = "08k5yfydxdlshivfhrdq9km8qn02r93q28gkyvazbqz2icr1586i"; + sha256 = "1dx44pj4nid04lv64rjbhwihz3bd4arqg637df97pfwa0c2bcp74"; authors = [ "Jake Goulding " ]; dependencies = [ { name = "snafu-derive"; - packageId = "snafu-derive 0.9.1"; + packageId = "snafu-derive 0.9.2"; } ]; features = { @@ -9558,11 +9951,11 @@ rec { features = { }; }; - "snafu-derive 0.9.1" = rec { + "snafu-derive 0.9.2" = rec { crateName = "snafu-derive"; - version = "0.9.1"; + version = "0.9.2"; edition = "2018"; - sha256 = "1nkfi7bis72pz3w7vb64m79w49qsv20sbf19jkd471vbhr83q42z"; + sha256 = "0whyc1bp26laq8sczsfkr13cq6kccrnij0rvbv7xgw08000mjzr8"; procMacro = true; libName = "snafu_derive"; authors = [ @@ -9586,7 +9979,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "full" "parsing" "printing" "proc-macro" "visit-mut" ]; } @@ -9596,9 +9989,9 @@ rec { }; "socket2" = rec { crateName = "socket2"; - version = "0.6.4"; + version = "0.6.5"; edition = "2021"; - sha256 = "0ldyp5rhba15spwxj1n94xh7sjks1398c3vwpwkxkd1087nwzlaj"; + sha256 = "1m7diygswpvlpvrxd6ap169nxgax014jr8220nqlr3bzyb3y5lf3"; authors = [ "Alex Crichton " "Thomas de Zeeuw " @@ -9724,7 +10117,7 @@ rec { } { name = "futures"; - packageId = "futures 0.3.32"; + packageId = "futures 0.3.33"; features = [ "compat" ]; } { @@ -9746,7 +10139,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.1"; + packageId = "snafu 0.9.2"; } { name = "stackable-operator"; @@ -9793,9 +10186,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; libName = "stackable_certs"; authors = [ @@ -9831,7 +10224,7 @@ rec { } { name = "rand"; - packageId = "rand 0.9.4"; + packageId = "rand 0.9.5"; } { name = "rand_core"; @@ -9853,7 +10246,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.1"; + packageId = "snafu 0.9.2"; } { name = "stackable-shared"; @@ -9896,9 +10289,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; libName = "stackable_operator"; authors = [ @@ -9938,7 +10331,7 @@ rec { } { name = "futures"; - packageId = "futures 0.3.32"; + packageId = "futures 0.3.33"; } { name = "http"; @@ -9975,7 +10368,7 @@ rec { } { name = "rand"; - packageId = "rand 0.9.4"; + packageId = "rand 0.9.5"; } { name = "regex"; @@ -10010,7 +10403,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.1"; + packageId = "snafu 0.9.2"; } { name = "stackable-operator-derive"; @@ -10091,9 +10484,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; procMacro = true; libName = "stackable_operator_derive"; @@ -10115,7 +10508,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; @@ -10126,9 +10519,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; libName = "stackable_shared"; authors = [ @@ -10172,7 +10565,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.1"; + packageId = "snafu 0.9.2"; } { name = "strum"; @@ -10207,9 +10600,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; libName = "stackable_telemetry"; authors = [ @@ -10260,7 +10653,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.1"; + packageId = "snafu 0.9.2"; } { name = "strum"; @@ -10317,9 +10710,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; libName = "stackable_versioned"; authors = [ @@ -10352,7 +10745,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.1"; + packageId = "snafu 0.9.2"; } { name = "stackable-versioned-macros"; @@ -10367,9 +10760,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; procMacro = true; libName = "stackable_versioned_macros"; @@ -10424,7 +10817,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; @@ -10435,9 +10828,9 @@ rec { edition = "2024"; workspace_member = null; src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "ee66b8d66fe10c216acfed0f81070b362604b392"; - sha256 = "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj"; + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "d81a6b556e7a13736710dc945183dae331d20ea0"; + sha256 = "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy"; }; libName = "stackable_webhook"; authors = [ @@ -10496,7 +10889,7 @@ rec { } { name = "rand"; - packageId = "rand 0.9.4"; + packageId = "rand 0.9.5"; } { name = "serde"; @@ -10509,7 +10902,7 @@ rec { } { name = "snafu"; - packageId = "snafu 0.9.1"; + packageId = "snafu 0.9.2"; } { name = "stackable-certs"; @@ -10619,7 +11012,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "parsing" ]; } ]; @@ -10683,11 +11076,11 @@ rec { }; resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "full" "parsing" "printing" "proc-macro" "quote" ]; }; - "syn 2.0.118" = rec { + "syn 2.0.119" = rec { crateName = "syn"; - version = "2.0.118"; + version = "2.0.119"; edition = "2021"; - sha256 = "08hlbc32lqd5d67p26ck7chg0rkclsw9as6f96vfn4s2j1zyb6hv"; + sha256 = "15vjy620l91a3q4n4f4gzhnflmdr6pnm38v2m6cpk86i8av32a47"; authors = [ "David Tolnay " ]; @@ -10716,6 +11109,39 @@ rec { }; resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "extra-traits" "fold" "full" "parsing" "printing" "proc-macro" "visit" "visit-mut" ]; }; + "syn 3.0.3" = rec { + crateName = "syn"; + version = "3.0.3"; + edition = "2021"; + sha256 = "18srnql3cd39j9q6hf1az02p67rlr1rf6njx9zx4vxj9i3jvmsak"; + authors = [ + "David Tolnay " + ]; + dependencies = [ + { + name = "proc-macro2"; + packageId = "proc-macro2"; + usesDefaultFeatures = false; + } + { + name = "quote"; + packageId = "quote"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "unicode-ident"; + packageId = "unicode-ident"; + } + ]; + features = { + "default" = [ "derive" "parsing" "printing" "clone-impls" "proc-macro" ]; + "printing" = [ "dep:quote" ]; + "proc-macro" = [ "proc-macro2/proc-macro" "quote?/proc-macro" ]; + "test" = [ "syn-test-suite/all-features" ]; + }; + resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "full" "parsing" "printing" "proc-macro" "visit-mut" ]; + }; "sync_wrapper" = rec { crateName = "sync_wrapper"; version = "1.0.2"; @@ -10759,7 +11185,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; usesDefaultFeatures = false; features = [ "derive" "parsing" "printing" "clone-impls" "visit" "extra-traits" ]; } @@ -10786,18 +11212,18 @@ rec { ]; }; - "thiserror 2.0.18" = rec { + "thiserror 2.0.19" = rec { crateName = "thiserror"; - version = "2.0.18"; + version = "2.0.19"; edition = "2021"; - sha256 = "1i7vcmw9900bvsmay7mww04ahahab7wmr8s925xc083rpjybb222"; + sha256 = "1ngwxsjsa64v1n7vb90h2b0i3fqk1piwaf0z6fqdacqfhjc3b909"; authors = [ "David Tolnay " ]; dependencies = [ { name = "thiserror-impl"; - packageId = "thiserror-impl 2.0.18"; + packageId = "thiserror-impl 2.0.19"; } ]; features = { @@ -10826,16 +11252,16 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; } ]; }; - "thiserror-impl 2.0.18" = rec { + "thiserror-impl 2.0.19" = rec { crateName = "thiserror-impl"; - version = "2.0.18"; + version = "2.0.19"; edition = "2021"; - sha256 = "1mf1vrbbimj1g6dvhdgzjmn6q09yflz2b92zs1j9n3k7cxzyxi7b"; + sha256 = "1ka10pqy1g8zy5al9m8yadg30jp8hx0q80j8awmd8131yw6gxjs3"; procMacro = true; libName = "thiserror_impl"; authors = [ @@ -10852,16 +11278,16 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 3.0.3"; } ]; }; "thread_local" = rec { crateName = "thread_local"; - version = "1.1.9"; + version = "1.1.10"; edition = "2021"; - sha256 = "1191jvl8d63agnq06pcnarivf63qzgpws5xa33hgc92gjjj4c0pn"; + sha256 = "0w20g2pfdcp8pz3gds0bzksv6mxk802szca8qlr3701jdm69rn8s"; authors = [ "Amanieu d'Antras " ]; @@ -10876,9 +11302,9 @@ rec { }; "time" = rec { crateName = "time"; - version = "0.3.53"; + version = "0.3.54"; edition = "2024"; - sha256 = "0l4aans0kv47y53736cjs0pnvdz91iyywrkqbrxk6cmrvknsmpqq"; + sha256 = "0i12170vw516jprmbv385krw75nyn7kwfp48nqybgfpnkximw79y"; authors = [ "Jacob Pratt " "Time contributors" @@ -10959,9 +11385,9 @@ rec { }; "time-macros" = rec { crateName = "time-macros"; - version = "0.2.31"; + version = "0.2.32"; edition = "2024"; - sha256 = "0pq8y9bm1zr008dmjs62qdfwsigv2kwkga5sj0d4jvk625qvhcf4"; + sha256 = "11gdd3b81mj8i0h114qfjjzm8j2rz2mhr9byr0ksjbldli196s3y"; procMacro = true; libName = "time_macros"; authors = [ @@ -11064,7 +11490,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "parsing" ]; } ]; @@ -11076,9 +11502,9 @@ rec { }; "tokio" = rec { crateName = "tokio"; - version = "1.52.3"; + version = "1.53.1"; edition = "2021"; - sha256 = "1zpzazypkg61sw91na1m85x5s4rsjym335fwwhwm1hcs70dz1iwg"; + sha256 = "1v8b3b45pkpbibls75yniqbvx5dlks2708141ljni5mnf6lawb10"; authors = [ "Tokio Contributors " ]; @@ -11197,9 +11623,9 @@ rec { }; "tokio-macros" = rec { crateName = "tokio-macros"; - version = "2.7.0"; + version = "2.7.1"; edition = "2021"; - sha256 = "15m4f37mdafs0gg36sh0rskm1i768lb7zmp8bw67kaxr3avnqniq"; + sha256 = "1fj2h3gysqzwqchyhcyyvslwdj7qjgyzlc20d6sajwqf949sya33"; procMacro = true; libName = "tokio_macros"; authors = [ @@ -11216,7 +11642,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" ]; } ]; @@ -11262,9 +11688,9 @@ rec { }; "tokio-stream" = rec { crateName = "tokio-stream"; - version = "0.1.18"; + version = "0.1.19"; edition = "2021"; - sha256 = "0w3cj33605ab58wqd382gnla5pnd9hnr00xgg333np5bka04knij"; + sha256 = "02s2ag7j40z8kx3yjy2g28l1wangawp3f1wlnwk7r99b105nzl53"; libName = "tokio_stream"; authors = [ "Tokio Contributors " @@ -11294,9 +11720,10 @@ rec { features = { "default" = [ "time" ]; "fs" = [ "tokio/fs" ]; - "full" = [ "time" "net" "io-util" "fs" "sync" "signal" ]; + "full" = [ "time" "net" "io-util" "fs" "rt" "sync" "signal" ]; "io-util" = [ "tokio/io-util" ]; "net" = [ "tokio/net" ]; + "rt" = [ "tokio/rt" ]; "signal" = [ "tokio/signal" ]; "sync" = [ "tokio/sync" "tokio-util" ]; "time" = [ "tokio/time" ]; @@ -11306,9 +11733,9 @@ rec { }; "tokio-util" = rec { crateName = "tokio-util"; - version = "0.7.18"; + version = "0.7.19"; edition = "2021"; - sha256 = "1600rd47pylwn7cap1k7s5nvdaa9j7w8kqigzp1qy7mh0p4cxscs"; + sha256 = "0licqrhrawysjrsr0qw3cgzkkjph7090hlcqcm45aazmkg81aj29"; libName = "tokio_util"; authors = [ "Tokio Contributors " @@ -11326,6 +11753,12 @@ rec { name = "futures-sink"; packageId = "futures-sink"; } + { + name = "libc"; + packageId = "libc"; + optional = true; + target = { target, features }: (target."unix" or false); + } { name = "pin-project-lite"; packageId = "pin-project-lite"; @@ -11350,6 +11783,7 @@ rec { ]; features = { "__docs_rs" = [ "futures-util" ]; + "codec" = [ "libc" ]; "compat" = [ "futures-io" ]; "full" = [ "codec" "compat" "io-util" "time" "net" "rt" "join-map" ]; "futures-io" = [ "dep:futures-io" ]; @@ -11357,13 +11791,14 @@ rec { "hashbrown" = [ "dep:hashbrown" ]; "io-util" = [ "io" "tokio/rt" "tokio/io-util" ]; "join-map" = [ "rt" "hashbrown" ]; + "libc" = [ "dep:libc" ]; "net" = [ "tokio/net" ]; "rt" = [ "tokio/rt" "tokio/sync" "futures-util" ]; "slab" = [ "dep:slab" ]; "time" = [ "tokio/time" "slab" ]; "tracing" = [ "dep:tracing" ]; }; - resolvedDefaultFeatures = [ "codec" "default" "io" "slab" "time" ]; + resolvedDefaultFeatures = [ "codec" "default" "io" "libc" "slab" "time" ]; }; "toml_datetime" = rec { crateName = "toml_datetime"; @@ -11388,9 +11823,9 @@ rec { }; "toml_edit" = rec { crateName = "toml_edit"; - version = "0.25.12+spec-1.1.0"; + version = "0.25.13+spec-1.1.0"; edition = "2024"; - sha256 = "1mx5paq837rjw7w51zprrjynk1vaig9yzxfqz9ac79jmd7f3w5fj"; + sha256 = "16xgmjdnxssdpj7rjyimsk4fqbv29g8zl7zhdbc6dxrf9mz3cxb9"; dependencies = [ { name = "indexmap"; @@ -11758,7 +12193,7 @@ rec { } { name = "bitflags"; - packageId = "bitflags 2.13.0"; + packageId = "bitflags 2.13.1"; } { name = "bytes"; @@ -11883,7 +12318,7 @@ rec { dependencies = [ { name = "bitflags"; - packageId = "bitflags 2.13.0"; + packageId = "bitflags 2.13.1"; } { name = "bytes"; @@ -12058,7 +12493,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.18"; + packageId = "thiserror 2.0.19"; } { name = "time"; @@ -12100,7 +12535,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; usesDefaultFeatures = false; features = [ "full" "parsing" "printing" "visit-mut" "clone-impls" "extra-traits" "proc-macro" ]; } @@ -12593,9 +13028,9 @@ rec { }; "uuid" = rec { crateName = "uuid"; - version = "1.23.4"; + version = "1.24.0"; edition = "2021"; - sha256 = "0lws65rrqncssdz1rk8g8ww7xg6k4d3l6avzkslzwni78llag05z"; + sha256 = "0faj5x0zgri8m3i8dv9qgyhiwqwdyhbl2g351cp3iin4ynk26fdz"; authors = [ "Ashley Mannix" "Dylan DPC" @@ -12683,6 +13118,27 @@ rec { "Sergio Benitez " ]; + }; + "walkdir" = rec { + crateName = "walkdir"; + version = "2.5.0"; + edition = "2018"; + sha256 = "0jsy7a710qv8gld5957ybrnc07gavppp963gs32xk4ag8130jy99"; + authors = [ + "Andrew Gallant " + ]; + dependencies = [ + { + name = "same-file"; + packageId = "same-file"; + } + { + name = "winapi-util"; + packageId = "winapi-util"; + target = { target, features }: (target."windows" or false); + } + ]; + }; "want" = rec { crateName = "want"; @@ -12863,7 +13319,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "visit" "visit-mut" "full" "extra-traits" ]; } { @@ -13413,6 +13869,41 @@ rec { "serde" = [ "dep:serde" ]; }; }; + "webpki-root-certs" = rec { + crateName = "webpki-root-certs"; + version = "1.0.9"; + edition = "2021"; + sha256 = "16qw59hxn1lln1615kb9rjy16pfxd1x8m9f9w6vwv36c5am58rdr"; + libName = "webpki_root_certs"; + dependencies = [ + { + name = "rustls-pki-types"; + packageId = "rustls-pki-types"; + rename = "pki-types"; + usesDefaultFeatures = false; + } + ]; + + }; + "winapi-util" = rec { + crateName = "winapi-util"; + version = "0.1.11"; + edition = "2021"; + sha256 = "08hdl7mkll7pz8whg869h58c1r9y7in0w0pk8fm24qc77k0b39y2"; + libName = "winapi_util"; + authors = [ + "Andrew Gallant " + ]; + dependencies = [ + { + name = "windows-sys"; + packageId = "windows-sys 0.61.2"; + target = { target, features }: (target."windows" or false); + features = [ "Win32_Foundation" "Win32_Storage_FileSystem" "Win32_System_Console" "Win32_System_SystemInformation" ]; + } + ]; + + }; "windows-core" = rec { crateName = "windows-core"; version = "0.62.2"; @@ -13472,7 +13963,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; usesDefaultFeatures = false; features = [ "parsing" "proc-macro" "printing" "full" "clone-impls" ]; } @@ -13499,7 +13990,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; usesDefaultFeatures = false; features = [ "parsing" "proc-macro" "printing" "full" "clone-impls" ]; } @@ -14195,9 +14686,9 @@ rec { }; "winnow" = rec { crateName = "winnow"; - version = "1.0.3"; + version = "1.0.4"; edition = "2021"; - sha256 = "1wajycd3krn6h699vydjv7hm0ll5l31p899qzpk59y2is74y34h5"; + sha256 = "10fzxipa7lx16172p3aca9j60hzbqgjki2f95kqksd5qywcp7f93"; dependencies = [ { name = "memchr"; @@ -14374,7 +14865,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "fold" ]; } { @@ -14386,9 +14877,9 @@ rec { }; "zerocopy" = rec { crateName = "zerocopy"; - version = "0.8.53"; + version = "0.8.55"; edition = "2021"; - sha256 = "1qcdv45iz4499bafwcnflvzf7adfvbnvgfc5w8cx8mk12d9n0wkm"; + sha256 = "1swncvj53zi9yr08b9ddhfrcmlrmh6ijxzxcr3p6w3qlgg6hb8dm"; authors = [ "Joshua Liebow-Feeser " "Jack Wrenn " @@ -14422,9 +14913,9 @@ rec { }; "zerocopy-derive" = rec { crateName = "zerocopy-derive"; - version = "0.8.53"; + version = "0.8.55"; edition = "2021"; - sha256 = "0wgxvsnv44x5xdli270xh085458m76dkl0iqjpa3624hry9gs527"; + sha256 = "1sr8w9zc62lxmw7v6n89nxvqlki48b0nyfpyri6dd367f3xpds8g"; procMacro = true; libName = "zerocopy_derive"; authors = [ @@ -14442,14 +14933,14 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" ]; } ]; devDependencies = [ { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "visit" ]; } ]; @@ -14498,7 +14989,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "fold" ]; } { @@ -14552,7 +15043,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "full" "extra-traits" "visit" ]; } ]; @@ -14665,7 +15156,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.118"; + packageId = "syn 2.0.119"; features = [ "extra-traits" ]; } ]; @@ -14673,9 +15164,9 @@ rec { }; "zmij" = rec { crateName = "zmij"; - version = "1.0.21"; + version = "1.0.23"; edition = "2021"; - sha256 = "1amb5i6gz7yjb0dnmz5y669674pqmwbj44p4yfxfv2ncgvk8x15q"; + sha256 = "06zwri21nnrl34rwinmvbciap8yk1mrl8qfg9pff7lgspc56sri9"; authors = [ "David Tolnay " ]; diff --git a/Cargo.toml b/Cargo.toml index 912ac226..31b69341 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,5 +33,6 @@ tokio = { version = "1.52", features = ["full"] } tracing = "0.1" [patch."https://github.com/stackabletech/operator-rs.git"] -# stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "main" } +# TODO: Switch back to a release tag once operator-rs#1250 (crd::openlineage) has merged. +stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "feat/openlineage-crd" } # stackable-operator = { path = "../operator-rs/crates/stackable-operator" } diff --git a/crate-hashes.json b/crate-hashes.json index 04979b96..c0260aa2 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -1,11 +1,11 @@ { - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#k8s-version@0.1.3": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#stackable-certs@0.4.1": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#stackable-operator-derive@0.3.1": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#stackable-operator@0.114.0": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#stackable-shared@0.1.2": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#stackable-telemetry@0.6.5": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#stackable-versioned-macros@0.11.1": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#stackable-versioned@0.11.1": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.114.0#stackable-webhook@0.9.2": "1v6slybgc0xqsmh3bxyid6xjvmz8ps41nfmmc6csgyzqs2v0wzxj" + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#k8s-version@0.1.3": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy", + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#stackable-certs@0.4.1": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy", + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#stackable-operator-derive@0.3.1": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy", + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#stackable-operator@0.114.0": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy", + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#stackable-shared@0.1.2": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy", + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#stackable-telemetry@0.6.5": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy", + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#stackable-versioned-macros@0.11.1": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy", + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#stackable-versioned@0.11.1": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy", + "git+https://github.com/stackabletech//operator-rs.git?branch=feat%2Fopenlineage-crd#stackable-webhook@0.9.2": "173aldjb47krgdm6h5san01pw8ljbc4xr0hljvfwk4h6whdii4qy" } \ No newline at end of file diff --git a/deploy/helm/airflow-operator/templates/clusterrole-operator.yaml b/deploy/helm/airflow-operator/templates/clusterrole-operator.yaml index 4bf6607d..bc61ec88 100644 --- a/deploy/helm/airflow-operator/templates/clusterrole-operator.yaml +++ b/deploy/helm/airflow-operator/templates/clusterrole-operator.yaml @@ -133,6 +133,17 @@ rules: - get - list - watch + # Resolve OpenLineage connections referenced by spec.clusterConfig.openLineage. + # Watched (list + watch) to re-reconcile when an OpenLineageConnection changes, + # and fetched individually (get) during reconciliation to dereference a `reference`. + - apiGroups: + - openlineage.stackable.tech + resources: + - openlineageconnections + verbs: + - get + - list + - watch # Publish Kubernetes events for reconciliation activity - apiGroups: - events.k8s.io diff --git a/docs/modules/airflow/pages/usage-guide/openlineage.adoc b/docs/modules/airflow/pages/usage-guide/openlineage.adoc new file mode 100644 index 00000000..22c5a7f0 --- /dev/null +++ b/docs/modules/airflow/pages/usage-guide/openlineage.adoc @@ -0,0 +1,148 @@ += OpenLineage +:description: Emit OpenLineage lineage events from Airflow to an OpenLineage backend such as Marquez. +:openlineage: https://openlineage.io/ +:airflow-openlineage: https://airflow.apache.org/docs/apache-airflow-providers-openlineage/stable/ + +Airflow can emit {openlineage}[OpenLineage] lineage events describing the datasets your DAGs read and write. +This is implemented by the {airflow-openlineage}[Airflow OpenLineage provider], which must be installed in the product image. + +[NOTE] +==== +The `apache-airflow-providers-openlineage` provider package must be present in the Airflow image. +The Stackable images include it; if you build a custom image, make sure the provider is installed. +==== + +== Enabling OpenLineage + +Set `spec.clusterConfig.openLineage` and provide a `connection` to your OpenLineage backend. +The connection can be defined inline: + +[source,yaml] +---- +apiVersion: airflow.stackable.tech/v1alpha2 +kind: AirflowCluster +metadata: + name: airflow +spec: + clusterConfig: + openLineage: + connection: + inline: + host: marquez # <1> + port: 5000 # <2> + namespace: production # <3> +---- +<1> Host of the OpenLineage backend, without protocol or port. +<2> Port the backend listens on. +<3> Optional OpenLineage namespace lineage is reported under. Defaults to the Kubernetes namespace of the cluster. + +The operator configures the transport via the OpenLineage client environment variables +(`OPENLINEAGE__TRANSPORT__*`) and sets `AIRFLOW__OPENLINEAGE__NAMESPACE`. +Lineage events are emitted to `\http(s)://:/api/v1/lineage`. + +== Referencing an OpenLineageConnection + +To share a backend definition across multiple stacklets, create an `OpenLineageConnection` resource and reference it by name. +The referenced resource must live in the same namespace as the `AirflowCluster`. + +[source,yaml] +---- +apiVersion: openlineage.stackable.tech/v1alpha1 +kind: OpenLineageConnection +metadata: + name: marquez +spec: + host: marquez + port: 5000 +---- + +[source,yaml] +---- +apiVersion: airflow.stackable.tech/v1alpha2 +kind: AirflowCluster +metadata: + name: airflow +spec: + clusterConfig: + openLineage: + connection: + reference: marquez # <1> +---- +<1> Name of the `OpenLineageConnection` resource. + +== TLS + +Configure TLS on the connection to reach a backend over HTTPS: + +[source,yaml] +---- +openLineage: + connection: + inline: + host: marquez + port: 5000 + tls: + verification: + server: + caCert: + secretClass: openlineage-tls # <1> +---- +<1> A xref:secret-operator:secretclass.adoc[SecretClass] providing the CA certificate used to verify the backend. + +When a SecretClass CA is configured, the CA certificate is mounted into the Airflow pods and the OpenLineage +client is pointed at it via `REQUESTS_CA_BUNDLE`. +Use `verification.server.caCert.webPki` to verify against the common public CAs instead, or +`verification.none` to disable verification entirely (not recommended). + +== Authentication + +If the backend requires a bearer token, set `credentialsSecretName` on the connection to the name of +a Secret containing the token. The Secret must contain the token under the fixed key `apiKey` and must +live in the same namespace as the cluster: + +[source,yaml] +---- +apiVersion: v1 +kind: Secret +metadata: + name: openlineage-credentials +stringData: + apiKey: "" # <1> +---- +<1> The bearer token, under the fixed key `apiKey`. + +[source,yaml] +---- +openLineage: + connection: + inline: + host: marquez + port: 5000 + credentialsSecretName: openlineage-credentials # <1> +---- +<1> Name of the Secret holding the API key. + +The token is injected into the Airflow pods from the Secret via a `secretKeyRef` environment variable. +It never appears in the CRD, a ConfigMap, or a plaintext environment value. + +== Job name (`appName`) + +The shared `openLineage.appName` field has no effect for Airflow: Airflow derives OpenLineage job names per +DAG and task. The field is accepted for cross-operator consistency but ignored. + +== Overriding injected configuration + +The OpenLineage environment variables are applied to every role (and the Kubernetes-executor pod template) +_before_ user `envOverrides`, so you can override any of them. +For example, to disable emission for a single role group without removing the `openLineage` block: + +[source,yaml] +---- +webservers: + roleGroups: + default: + envOverrides: + AIRFLOW__OPENLINEAGE__DISABLED: "true" +---- + +See xref:usage-guide/overrides.adoc[] for more on overrides. diff --git a/docs/modules/airflow/partials/nav.adoc b/docs/modules/airflow/partials/nav.adoc index e84b005f..5332aac7 100644 --- a/docs/modules/airflow/partials/nav.adoc +++ b/docs/modules/airflow/partials/nav.adoc @@ -12,6 +12,7 @@ ** xref:airflow:usage-guide/security.adoc[] ** xref:airflow:usage-guide/logging.adoc[] ** xref:airflow:usage-guide/monitoring.adoc[] +** xref:airflow:usage-guide/openlineage.adoc[] ** xref:airflow:usage-guide/using-kubernetes-executors.adoc[] ** xref:airflow:usage-guide/overrides.adoc[] ** xref:airflow:usage-guide/operations/index.adoc[] diff --git a/extra/crds.yaml b/extra/crds.yaml index d5e18603..3e434aa9 100644 --- a/extra/crds.yaml +++ b/extra/crds.yaml @@ -6,7 +6,6 @@ metadata: spec: group: airflow.stackable.tech names: - categories: [] kind: AirflowCluster plural: airflowclusters shortNames: @@ -14,8 +13,7 @@ spec: singular: airflowcluster scope: Namespaced versions: - - additionalPrinterColumns: [] - name: v1alpha2 + - name: v1alpha2 schema: openAPIV3Schema: description: An Airflow cluster stacklet. This resource is managed by the Stackable operator for Apache Airflow. @@ -1506,6 +1504,113 @@ spec: - host type: object type: object + openLineage: + description: |- + Emit [OpenLineage](https://openlineage.io/) lineage events for this cluster. The + [OpenLineage provider](https://airflow.apache.org/docs/apache-airflow-providers-openlineage/stable/) + must be installed in the Airflow image. Learn more in the + [OpenLineage usage guide](https://docs.stackable.tech/home/nightly/airflow/usage-guide/openlineage). + nullable: true + properties: + appName: + description: |- + A stable OpenLineage job/application name. Setting this prevents fragmented run history. + If unset, operators resolve a name from workload-specific configuration. + nullable: true + type: string + connection: + description: |- + The OpenLineage backend connection, either inlined or referencing an + `OpenLineageConnection` resource by name. + oneOf: + - required: + - inline + - required: + - reference + properties: + inline: + description: |- + OpenLineage connection definition as a resource. + Learn more about [OpenLineage](https://openlineage.io/). + properties: + credentialsSecretName: + description: |- + Name of a Secret containing the API key used to authenticate against the OpenLineage + backend. The API key must be stored under the key `apiKey`. The Secret must be located in + the same namespace as the workload using this connection. If not specified, no + authentication is used. + nullable: true + type: string + host: + description: 'Host of the OpenLineage backend without any protocol or port. For example: `marquez`.' + type: string + port: + description: 'Port the OpenLineage backend listens on. For example: `5000`.' + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + tls: + description: Use a TLS connection. If not specified no TLS will be used. + nullable: true + properties: + verification: + description: The verification method used to verify the certificates of the server and/or the client. + oneOf: + - required: + - none + - required: + - server + properties: + none: + description: Use TLS but don't verify certificates. + type: object + server: + description: Use TLS and a CA certificate to verify the server. + properties: + caCert: + description: CA cert to verify the server. + oneOf: + - required: + - webPki + - required: + - secretClass + properties: + secretClass: + description: |- + Name of the [SecretClass](https://docs.stackable.tech/home/nightly/secret-operator/secretclass) which will provide the CA certificate. + Note that a SecretClass does not need to have a key but can also work with just a CA certificate, + so if you got provided with a CA cert but don't have access to the key you can still use this method. + type: string + webPki: + description: |- + Use TLS and the CA certificates trusted by the common web browsers to verify the server. + This can be useful when you e.g. use public AWS S3 or other public available services. + type: object + type: object + required: + - caCert + type: object + type: object + required: + - verification + type: object + required: + - host + - port + type: object + reference: + type: string + type: object + namespace: + description: |- + The OpenLineage namespace lineage is reported under. + If unset, operators typically default to the workload's Kubernetes namespace. + nullable: true + type: string + required: + - connection + type: object vectorAggregatorConfigMapName: description: |- Name of the Vector aggregator [discovery ConfigMap](https://docs.stackable.tech/home/nightly/concepts/service_discovery). @@ -6244,8 +6349,7 @@ spec: storage: true subresources: status: {} - - additionalPrinterColumns: [] - name: v1alpha1 + - name: v1alpha1 schema: openAPIV3Schema: description: An Airflow cluster stacklet. This resource is managed by the Stackable operator for Apache Airflow. @@ -7712,6 +7816,113 @@ spec: - host type: object type: object + openLineage: + description: |- + Emit [OpenLineage](https://openlineage.io/) lineage events for this cluster. The + [OpenLineage provider](https://airflow.apache.org/docs/apache-airflow-providers-openlineage/stable/) + must be installed in the Airflow image. Learn more in the + [OpenLineage usage guide](https://docs.stackable.tech/home/nightly/airflow/usage-guide/openlineage). + nullable: true + properties: + appName: + description: |- + A stable OpenLineage job/application name. Setting this prevents fragmented run history. + If unset, operators resolve a name from workload-specific configuration. + nullable: true + type: string + connection: + description: |- + The OpenLineage backend connection, either inlined or referencing an + `OpenLineageConnection` resource by name. + oneOf: + - required: + - inline + - required: + - reference + properties: + inline: + description: |- + OpenLineage connection definition as a resource. + Learn more about [OpenLineage](https://openlineage.io/). + properties: + credentialsSecretName: + description: |- + Name of a Secret containing the API key used to authenticate against the OpenLineage + backend. The API key must be stored under the key `apiKey`. The Secret must be located in + the same namespace as the workload using this connection. If not specified, no + authentication is used. + nullable: true + type: string + host: + description: 'Host of the OpenLineage backend without any protocol or port. For example: `marquez`.' + type: string + port: + description: 'Port the OpenLineage backend listens on. For example: `5000`.' + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + tls: + description: Use a TLS connection. If not specified no TLS will be used. + nullable: true + properties: + verification: + description: The verification method used to verify the certificates of the server and/or the client. + oneOf: + - required: + - none + - required: + - server + properties: + none: + description: Use TLS but don't verify certificates. + type: object + server: + description: Use TLS and a CA certificate to verify the server. + properties: + caCert: + description: CA cert to verify the server. + oneOf: + - required: + - webPki + - required: + - secretClass + properties: + secretClass: + description: |- + Name of the [SecretClass](https://docs.stackable.tech/home/nightly/secret-operator/secretclass) which will provide the CA certificate. + Note that a SecretClass does not need to have a key but can also work with just a CA certificate, + so if you got provided with a CA cert but don't have access to the key you can still use this method. + type: string + webPki: + description: |- + Use TLS and the CA certificates trusted by the common web browsers to verify the server. + This can be useful when you e.g. use public AWS S3 or other public available services. + type: object + type: object + required: + - caCert + type: object + type: object + required: + - verification + type: object + required: + - host + - port + type: object + reference: + type: string + type: object + namespace: + description: |- + The OpenLineage namespace lineage is reported under. + If unset, operators typically default to the workload's Kubernetes namespace. + nullable: true + type: string + required: + - connection + type: object vectorAggregatorConfigMapName: description: |- Name of the Vector aggregator [discovery ConfigMap](https://docs.stackable.tech/home/nightly/concepts/service_discovery). diff --git a/rust/operator-binary/src/controller/build/mod.rs b/rust/operator-binary/src/controller/build/mod.rs index f148f167..f4364d34 100644 --- a/rust/operator-binary/src/controller/build/mod.rs +++ b/rust/operator-binary/src/controller/build/mod.rs @@ -20,6 +20,7 @@ use crate::{ }; pub mod graceful_shutdown; +pub mod openlineage; pub mod properties; pub mod resource; pub mod volumes; @@ -233,6 +234,7 @@ mod tests { sync_roles_at: FlaskRolesSyncMoment::default(), }, authorization_config: AirflowAuthorizationResolved { opa: None }, + resolved_open_lineage_config: None, }; validate_cluster(&cluster, "oci.stackable.tech/sdp", dereferenced) diff --git a/rust/operator-binary/src/controller/build/openlineage.rs b/rust/operator-binary/src/controller/build/openlineage.rs new file mode 100644 index 00000000..d171efd0 --- /dev/null +++ b/rust/operator-binary/src/controller/build/openlineage.rs @@ -0,0 +1,393 @@ +//! OpenLineage lineage-emission wiring for Airflow. +//! +//! The reusable CRD and resolution types live in operator-rs +//! ([`stackable_operator::crd::openlineage`]). This module resolves an +//! [`OpenLineageJob`] into the Airflow-specific set of environment variables (and TLS CA volumes) +//! needed to configure the +//! [`apache-airflow-providers-openlineage`](https://airflow.apache.org/docs/apache-airflow-providers-openlineage/stable/) +//! provider. +//! +//! Airflow configures OpenLineage entirely via environment variables (this operator renders no +//! `airflow.cfg`). The provider resolves its transport from `AIRFLOW__OPENLINEAGE__TRANSPORT` +//! (a JSON string) or `AIRFLOW__OPENLINEAGE__CONFIG_PATH`, and only falls back to the OpenLineage +//! Python client's own `OPENLINEAGE__TRANSPORT__*` env vars when neither is set. We deliberately use +//! that fallback path (leaving the Airflow-native transport keys unset) so the API key can be +//! injected from a Secret via `secretKeyRef` instead of being embedded in a plaintext JSON value. +//! +//! The Python client's HTTP transport has no CA-path option (only a boolean `verify`), so a +//! SecretClass-provided CA is trusted by mounting it and pointing `REQUESTS_CA_BUNDLE` at it. + +use snafu::{ResultExt, Snafu}; +use stackable_operator::{ + client::Client, + commons::tls_verification::TlsClientDetailsError, + crd::openlineage::{ + ResolvedOpenLineageConnection, + v1alpha1::{OpenLineageError, OpenLineageJob}, + }, + k8s_openapi::api::core::v1::{EnvVar, Volume, VolumeMount}, +}; + +use crate::util::env_var_from_secret; + +// OpenLineage Python client transport env vars. These are the Airflow provider's fallback config +// source, used only when no Airflow-native transport (`AIRFLOW__OPENLINEAGE__TRANSPORT` / +// `__CONFIG_PATH`) is configured - which is exactly the state this operator leaves them in. +const OPENLINEAGE_TRANSPORT_TYPE: &str = "OPENLINEAGE__TRANSPORT__TYPE"; +const OPENLINEAGE_TRANSPORT_URL: &str = "OPENLINEAGE__TRANSPORT__URL"; +const OPENLINEAGE_TRANSPORT_ENDPOINT: &str = "OPENLINEAGE__TRANSPORT__ENDPOINT"; +const OPENLINEAGE_TRANSPORT_VERIFY: &str = "OPENLINEAGE__TRANSPORT__VERIFY"; +const OPENLINEAGE_TRANSPORT_AUTH_TYPE: &str = "OPENLINEAGE__TRANSPORT__AUTH__TYPE"; +const OPENLINEAGE_TRANSPORT_AUTH_API_KEY: &str = "OPENLINEAGE__TRANSPORT__AUTH__API_KEY"; + +/// Airflow-native OpenLineage namespace setting. This is orthogonal to the transport lookup and is +/// applied regardless of where the transport config comes from. +const AIRFLOW_OPENLINEAGE_NAMESPACE: &str = "AIRFLOW__OPENLINEAGE__NAMESPACE"; + +/// Standard `requests`/Python CA-bundle env var. Used to trust a SecretClass-provided CA, since the +/// OpenLineage Python HTTP transport has no CA-path option (only a boolean `verify`). +const REQUESTS_CA_BUNDLE: &str = "REQUESTS_CA_BUNDLE"; + +const OPENLINEAGE_TRANSPORT_TYPE_HTTP: &str = "http"; +const OPENLINEAGE_ENDPOINT_LINEAGE: &str = "api/v1/lineage"; +const OPENLINEAGE_AUTH_TYPE_API_KEY: &str = "api_key"; + +/// Fixed Secret key that must hold the OpenLineage HTTP transport API key / bearer token. +pub const OPENLINEAGE_AUTH_SECRET_KEY: &str = "apiKey"; + +#[derive(Snafu, Debug)] +pub enum Error { + #[snafu(display("failed to resolve OpenLineage connection"))] + ResolveConnection { source: OpenLineageError }, + + #[snafu(display("failed to build TLS volumes and mounts for the OpenLineage connection"))] + TlsVolumesAndMounts { source: TlsClientDetailsError }, +} + +/// The resolved, Airflow-specific OpenLineage configuration: the environment variables to add to +/// every workload container, plus any TLS CA volume/mount required to trust the backend. +#[derive(Clone, Debug, Default)] +pub struct ResolvedOpenLineageConfig { + /// Environment variables configuring the OpenLineage transport (and, when authenticated, the + /// Secret-backed API key). Injected into the statefulset roles and the Kubernetes-executor + /// pod template. + pub env_vars: Vec, + /// Volumes for a SecretClass-provided CA certificate (empty unless TLS server verification with + /// a SecretClass is configured). + pub volumes: Vec, + /// Volume mounts for the CA certificate above. + pub volume_mounts: Vec, +} + +impl ResolvedOpenLineageConfig { + /// Resolves an [`OpenLineageJob`] (inline connection or `OpenLineageConnection` reference, plus + /// an optional credentials Secret) into the Airflow-specific configuration. + pub async fn from_config( + open_lineage: &OpenLineageJob, + client: &Client, + namespace: &str, + ) -> Result { + let connection = open_lineage + .connection + .clone() + .resolve(client, namespace) + .await + .context(ResolveConnectionSnafu)?; + + let auth_secret_name = connection.credentials_secret_name.clone(); + + Self::build(&connection, open_lineage, namespace, auth_secret_name) + } + + /// Assembles the configuration from an already-resolved connection and (optional) auth Secret + /// name. Kept separate from [`Self::from_config`] so it can be unit tested without a client. + fn build( + connection: &ResolvedOpenLineageConnection, + open_lineage: &OpenLineageJob, + namespace: &str, + auth_secret_name: Option, + ) -> Result { + let mut env_vars = Vec::new(); + let mut volumes = Vec::new(); + let mut volume_mounts = Vec::new(); + + // Transport (delivered via the OpenLineage Python client fallback env vars). + env_vars.push(plain_env( + OPENLINEAGE_TRANSPORT_TYPE, + OPENLINEAGE_TRANSPORT_TYPE_HTTP, + )); + env_vars.push(plain_env( + OPENLINEAGE_TRANSPORT_URL, + &connection.transport_url(), + )); + env_vars.push(plain_env( + OPENLINEAGE_TRANSPORT_ENDPOINT, + OPENLINEAGE_ENDPOINT_LINEAGE, + )); + + // Namespace: the explicit value, else the workload's Kubernetes namespace. + let ol_namespace = open_lineage + .namespace + .clone() + .unwrap_or_else(|| namespace.to_string()); + env_vars.push(plain_env(AIRFLOW_OPENLINEAGE_NAMESPACE, &ol_namespace)); + + // TLS handling. + if connection.tls.uses_tls_verification() { + // Server verification. A public (WebPki) CA needs nothing; a SecretClass CA must be + // mounted and trusted via REQUESTS_CA_BUNDLE. + if let Some(ca_cert_path) = connection.tls.tls_ca_cert_mount_path() { + let (tls_volumes, tls_mounts) = connection + .tls + .volumes_and_mounts() + .context(TlsVolumesAndMountsSnafu)?; + volumes.extend(tls_volumes); + volume_mounts.extend(tls_mounts); + env_vars.push(plain_env(REQUESTS_CA_BUNDLE, &ca_cert_path)); + } + } else if connection.tls.uses_tls() { + // TLS configured but verification disabled. + env_vars.push(plain_env(OPENLINEAGE_TRANSPORT_VERIFY, "false")); + } + + // Authentication. The token is delivered from the `credentialsSecretName` Secret via a + // secretKeyRef so it never lands in the CRD, ConfigMap or a plaintext env value. + if let Some(secret_name) = auth_secret_name { + env_vars.push(plain_env( + OPENLINEAGE_TRANSPORT_AUTH_TYPE, + OPENLINEAGE_AUTH_TYPE_API_KEY, + )); + env_vars.push(env_var_from_secret( + OPENLINEAGE_TRANSPORT_AUTH_API_KEY, + &secret_name, + OPENLINEAGE_AUTH_SECRET_KEY, + )); + } + + // Airflow has no global OpenLineage job name (names are derived per DAG/task), so the shared + // `appName` field is not applicable and is ignored. + if open_lineage.app_name.is_some() { + tracing::debug!( + "The OpenLineage `appName` field is not used by Airflow and will be ignored; \ + Airflow derives OpenLineage job names per DAG/task." + ); + } + + Ok(Self { + env_vars, + volumes, + volume_mounts, + }) + } +} + +fn plain_env(name: &str, value: &str) -> EnvVar { + EnvVar { + name: name.to_string(), + value: Some(value.to_string()), + ..Default::default() + } +} + +#[cfg(test)] +mod tests { + use stackable_operator::{ + commons::tls_verification::{ + CaCert, Tls, TlsClientDetails, TlsServerVerification, TlsVerification, + }, + crd::openlineage::v1alpha1::{ + InlineConnectionOrReference, OpenLineageConnectionSpec, OpenLineageJob, + }, + }; + + use super::*; + + const NAMESPACE: &str = "default"; + + fn connection(tls: TlsClientDetails) -> OpenLineageConnectionSpec { + OpenLineageConnectionSpec { + host: "marquez".to_string(), + port: 5000, + tls, + credentials_secret_name: None, + } + } + + fn job(connection: OpenLineageConnectionSpec, namespace: Option) -> OpenLineageJob { + OpenLineageJob { + connection: InlineConnectionOrReference::Inline(connection), + namespace, + app_name: None, + } + } + + fn env_value<'a>(config: &'a ResolvedOpenLineageConfig, name: &str) -> Option<&'a str> { + config + .env_vars + .iter() + .find(|e| e.name == name) + .and_then(|e| e.value.as_deref()) + } + + fn no_tls() -> TlsClientDetails { + TlsClientDetails { tls: None } + } + + fn secret_class_tls() -> TlsClientDetails { + TlsClientDetails { + tls: Some(Tls { + verification: TlsVerification::Server(TlsServerVerification { + ca_cert: CaCert::SecretClass("openlineage-cert".to_string()), + }), + }), + } + } + + fn web_pki_tls() -> TlsClientDetails { + TlsClientDetails { + tls: Some(Tls { + verification: TlsVerification::Server(TlsServerVerification { + ca_cert: CaCert::WebPki {}, + }), + }), + } + } + + fn no_verification_tls() -> TlsClientDetails { + TlsClientDetails { + tls: Some(Tls { + verification: TlsVerification::None {}, + }), + } + } + + #[test] + fn plain_http_transport_without_tls_or_auth() { + let config = ResolvedOpenLineageConfig::build( + &connection(no_tls()), + &job(connection(no_tls()), None), + NAMESPACE, + None, + ) + .unwrap(); + + assert_eq!(env_value(&config, OPENLINEAGE_TRANSPORT_TYPE), Some("http")); + assert_eq!( + env_value(&config, OPENLINEAGE_TRANSPORT_URL), + Some("http://marquez:5000") + ); + assert_eq!( + env_value(&config, OPENLINEAGE_TRANSPORT_ENDPOINT), + Some("api/v1/lineage") + ); + assert_eq!( + env_value(&config, AIRFLOW_OPENLINEAGE_NAMESPACE), + Some("default") + ); + assert!(config.volumes.is_empty()); + assert!(config.volume_mounts.is_empty()); + assert!(env_value(&config, OPENLINEAGE_TRANSPORT_AUTH_TYPE).is_none()); + assert!(env_value(&config, REQUESTS_CA_BUNDLE).is_none()); + assert!(env_value(&config, OPENLINEAGE_TRANSPORT_VERIFY).is_none()); + } + + #[test] + fn explicit_namespace_overrides_kubernetes_namespace() { + let conn = connection(no_tls()); + let config = ResolvedOpenLineageConfig::build( + &conn, + &job(conn.clone(), Some("lineage-ns".to_string())), + NAMESPACE, + None, + ) + .unwrap(); + + assert_eq!( + env_value(&config, AIRFLOW_OPENLINEAGE_NAMESPACE), + Some("lineage-ns") + ); + } + + #[test] + fn secret_class_tls_mounts_ca_and_sets_bundle() { + let conn = connection(secret_class_tls()); + let config = + ResolvedOpenLineageConfig::build(&conn, &job(conn.clone(), None), NAMESPACE, None) + .unwrap(); + + assert_eq!( + env_value(&config, OPENLINEAGE_TRANSPORT_URL), + Some("https://marquez:5000") + ); + assert_eq!( + env_value(&config, REQUESTS_CA_BUNDLE), + Some("/stackable/secrets/openlineage-cert/ca.crt") + ); + assert_eq!(config.volumes.len(), 1); + assert_eq!(config.volume_mounts.len(), 1); + assert!(env_value(&config, OPENLINEAGE_TRANSPORT_VERIFY).is_none()); + } + + #[test] + fn web_pki_tls_uses_https_without_mounts() { + let conn = connection(web_pki_tls()); + let config = + ResolvedOpenLineageConfig::build(&conn, &job(conn.clone(), None), NAMESPACE, None) + .unwrap(); + + assert_eq!( + env_value(&config, OPENLINEAGE_TRANSPORT_URL), + Some("https://marquez:5000") + ); + assert!(config.volumes.is_empty()); + assert!(env_value(&config, REQUESTS_CA_BUNDLE).is_none()); + assert!(env_value(&config, OPENLINEAGE_TRANSPORT_VERIFY).is_none()); + } + + #[test] + fn tls_without_verification_disables_verify() { + let conn = connection(no_verification_tls()); + let config = + ResolvedOpenLineageConfig::build(&conn, &job(conn.clone(), None), NAMESPACE, None) + .unwrap(); + + assert_eq!( + env_value(&config, OPENLINEAGE_TRANSPORT_VERIFY), + Some("false") + ); + assert!(config.volumes.is_empty()); + assert!(env_value(&config, REQUESTS_CA_BUNDLE).is_none()); + } + + #[test] + fn auth_adds_secret_backed_api_key() { + let conn = connection(no_tls()); + let config = ResolvedOpenLineageConfig::build( + &conn, + &job(conn.clone(), None), + NAMESPACE, + Some("openlineage-auth-secret".to_string()), + ) + .unwrap(); + + assert_eq!( + env_value(&config, OPENLINEAGE_TRANSPORT_AUTH_TYPE), + Some("api_key") + ); + + let api_key = config + .env_vars + .iter() + .find(|e| e.name == OPENLINEAGE_TRANSPORT_AUTH_API_KEY) + .expect("api key env var must be present"); + // The token is Secret-backed: never a plaintext value. + assert!(api_key.value.is_none()); + let secret_key_ref = api_key + .value_from + .as_ref() + .and_then(|s| s.secret_key_ref.as_ref()) + .expect("api key must be a secretKeyRef"); + assert_eq!(secret_key_ref.name, "openlineage-auth-secret"); + assert_eq!(secret_key_ref.key, OPENLINEAGE_AUTH_SECRET_KEY); + } +} diff --git a/rust/operator-binary/src/controller/build/properties/env_vars.rs b/rust/operator-binary/src/controller/build/properties/env_vars.rs index 1d4ec9b7..041672a9 100644 --- a/rust/operator-binary/src/controller/build/properties/env_vars.rs +++ b/rust/operator-binary/src/controller/build/properties/env_vars.rs @@ -254,6 +254,14 @@ pub fn build_airflow_statefulset_envs( _ => {} } + // OpenLineage transport config (applied to every role), inserted before overrides so users can + // still override individual values via `envOverrides`. + if let Some(open_lineage) = &cluster.cluster_config.open_lineage { + for env_var in &open_lineage.env_vars { + env.insert(env_var.name.clone(), env_var.clone()); + } + } + // apply overrides last of all; `EnvVarSet` is keyed by name, so iteration is already // in a fixed (sorted-by-name) order for env_var in env_overrides.clone() { @@ -431,6 +439,14 @@ pub fn build_airflow_template_envs( ); } + // OpenLineage transport config for the tasks executed by the Kubernetes executor, inserted + // before overrides so users can still override individual values via `envOverrides`. + if let Some(open_lineage) = &cluster.cluster_config.open_lineage { + for env_var in &open_lineage.env_vars { + env.insert(env_var.name.clone(), env_var.clone()); + } + } + // iterate over a BTreeMap to ensure the vars are written in a predictable order for (k, v) in env_overrides.iter().collect::>() { env.insert( diff --git a/rust/operator-binary/src/controller/build/resource/executor.rs b/rust/operator-binary/src/controller/build/resource/executor.rs index b4b6830d..e7e865bd 100644 --- a/rust/operator-binary/src/controller/build/resource/executor.rs +++ b/rust/operator-binary/src/controller/build/resource/executor.rs @@ -143,6 +143,15 @@ pub fn build_executor_template_config_map( ) .context(PodSnafu)?; + // Mount the OpenLineage TLS CA certificate (only present when a SecretClass CA is configured). + if let Some(open_lineage) = &cluster.cluster_config.open_lineage { + airflow_container + .add_volume_mounts(open_lineage.volume_mounts.clone()) + .context(AddVolumeMountSnafu)?; + pb.add_volumes(open_lineage.volumes.clone()) + .context(AddVolumeSnafu)?; + } + cluster .metadata_database_connection_details() .add_to_container(&mut airflow_container); diff --git a/rust/operator-binary/src/controller/build/resource/statefulset.rs b/rust/operator-binary/src/controller/build/resource/statefulset.rs index b357b93a..53efc22f 100644 --- a/rust/operator-binary/src/controller/build/resource/statefulset.rs +++ b/rust/operator-binary/src/controller/build/resource/statefulset.rs @@ -256,6 +256,15 @@ pub fn build_server_rolegroup_statefulset( ) .context(PodSnafu)?; + // Mount the OpenLineage TLS CA certificate (only present when a SecretClass CA is configured). + if let Some(open_lineage) = &validated_cluster.cluster_config.open_lineage { + airflow_container + .add_volume_mounts(open_lineage.volume_mounts.clone()) + .context(AddVolumeMountSnafu)?; + pb.add_volumes(open_lineage.volumes.clone()) + .context(AddVolumeSnafu)?; + } + validated_cluster .metadata_database_connection_details() .add_to_container(&mut airflow_container); diff --git a/rust/operator-binary/src/controller/dereference.rs b/rust/operator-binary/src/controller/dereference.rs index 64e38d70..0832d7d5 100644 --- a/rust/operator-binary/src/controller/dereference.rs +++ b/rust/operator-binary/src/controller/dereference.rs @@ -1,8 +1,12 @@ use snafu::{ResultExt, Snafu}; +use stackable_operator::v2::controller_utils::get_namespace; -use crate::crd::{ - authentication::AirflowClientAuthenticationDetailsResolved, - authorization::AirflowAuthorizationResolved, v1alpha2, +use crate::{ + controller::build::openlineage::ResolvedOpenLineageConfig, + crd::{ + authentication::AirflowClientAuthenticationDetailsResolved, + authorization::AirflowAuthorizationResolved, v1alpha2, + }, }; #[derive(Snafu, Debug)] @@ -16,12 +20,24 @@ pub enum Error { AuthorizationConfig { source: stackable_operator::commons::opa::Error, }, + + #[snafu(display("failed to resolve namespace"))] + ResolveNamespace { + source: stackable_operator::v2::controller_utils::Error, + }, + + #[snafu(display("failed to resolve OpenLineage configuration"))] + OpenLineageConfig { + source: crate::controller::build::openlineage::Error, + }, } /// External references resolved during the dereference step. pub struct DereferencedObjects { pub authentication_config: AirflowClientAuthenticationDetailsResolved, pub authorization_config: AirflowAuthorizationResolved, + /// The resolved OpenLineage configuration (`spec.clusterConfig.openLineage`), when configured. + pub resolved_open_lineage_config: Option, } pub async fn dereference( @@ -43,8 +59,23 @@ pub async fn dereference( .await .context(AuthorizationConfigSnafu)?; + let resolved_open_lineage_config = + if let Some(open_lineage) = &airflow.spec.cluster_config.open_lineage { + let namespace = get_namespace(airflow) + .context(ResolveNamespaceSnafu)? + .to_string(); + Some( + ResolvedOpenLineageConfig::from_config(open_lineage, client, &namespace) + .await + .context(OpenLineageConfigSnafu)?, + ) + } else { + None + }; + Ok(DereferencedObjects { authentication_config, authorization_config, + resolved_open_lineage_config, }) } diff --git a/rust/operator-binary/src/controller/mod.rs b/rust/operator-binary/src/controller/mod.rs index d59e7b39..b6e79a53 100644 --- a/rust/operator-binary/src/controller/mod.rs +++ b/rust/operator-binary/src/controller/mod.rs @@ -47,6 +47,7 @@ use stackable_operator::{ use crate::{ airflow_controller::AIRFLOW_CONTROLLER_NAME, + controller::build::openlineage::ResolvedOpenLineageConfig, crd::{ APP_NAME, AirflowConfig, AirflowConfigOverrides, AirflowExecutor, AirflowRole, AirflowStorageConfig, ExecutorConfig, OPERATOR_NAME, @@ -163,6 +164,8 @@ pub struct ValidatedClusterConfig { pub executor_template: Option, pub authentication_config: AirflowClientAuthenticationDetailsResolved, pub authorization_config: AirflowAuthorizationResolved, + /// The resolved OpenLineage configuration (`spec.clusterConfig.openLineage`), when configured. + pub open_lineage: Option, pub credentials_secret_name: SecretName, pub load_examples: bool, pub expose_config: bool, diff --git a/rust/operator-binary/src/controller/validate.rs b/rust/operator-binary/src/controller/validate.rs index 971ed425..adbeb732 100644 --- a/rust/operator-binary/src/controller/validate.rs +++ b/rust/operator-binary/src/controller/validate.rs @@ -174,6 +174,7 @@ pub fn validate_cluster( let DereferencedObjects { authentication_config, authorization_config, + resolved_open_lineage_config, } = dereferenced; // The Celery result-backend and broker only work with configured celeryExecutors. Emit a @@ -240,6 +241,7 @@ pub fn validate_cluster( executor_template, authentication_config, authorization_config, + open_lineage: resolved_open_lineage_config, credentials_secret_name: airflow.spec.cluster_config.credentials_secret_name.clone(), metadata_database: airflow.spec.cluster_config.metadata_database.clone(), celery_results_backend: airflow.spec.cluster_config.celery_results_backend.clone(), diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index 8da1ef1a..ab52965f 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -18,7 +18,7 @@ use stackable_operator::{ fragment::{self, Fragment, ValidationError}, merge::Merge, }, - crd::git_sync, + crd::{git_sync, openlineage}, deep_merger::ObjectOverrides, k8s_openapi::{ api::core::v1::{Volume, VolumeMount}, @@ -283,6 +283,13 @@ pub mod versioned { )] pub dags_git_sync: Vec, + /// Emit [OpenLineage](https://openlineage.io/) lineage events for this cluster. The + /// [OpenLineage provider](https://airflow.apache.org/docs/apache-airflow-providers-openlineage/stable/) + /// must be installed in the Airflow image. Learn more in the + /// [OpenLineage usage guide](DOCS_BASE_URL_PLACEHOLDER/airflow/usage-guide/openlineage). + #[serde(default, skip_serializing_if = "Option::is_none")] + pub open_lineage: Option, + /// For internal use only - not for production use. #[serde(default)] pub expose_config: bool, diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index cb222fa8..d428fd5d 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -10,7 +10,7 @@ use futures::{FutureExt, StreamExt, TryFutureExt}; use stackable_operator::{ YamlSchema, cli::{Command, RunArguments}, - crd::authentication::core as auth_core, + crd::{authentication::core as auth_core, openlineage}, eos::EndOfSupportChecker, k8s_openapi::api::{ apps::v1::StatefulSet, @@ -128,6 +128,7 @@ async fn main() -> anyhow::Result<()> { let authentication_class_store = airflow_controller.store(); let config_map_store = airflow_controller.store(); + let open_lineage_connection_store = airflow_controller.store(); let airflow_controller = airflow_controller .owns( watch_namespace.get_api::(&client), @@ -164,6 +165,25 @@ async fn main() -> anyhow::Result<()> { .map(|airflow| ObjectRef::from_obj(&*airflow)) }, ) + .watches( + watch_namespace + .get_api::>( + &client, + ), + watcher::Config::default(), + move |open_lineage_connection| { + open_lineage_connection_store + .state() + .into_iter() + .filter(move |airflow| { + references_open_lineage_connection( + airflow, + &open_lineage_connection, + ) + }) + .map(|airflow| ObjectRef::from_obj(&*airflow)) + }, + ) .graceful_shutdown_on(sigterm_watcher.handle()) .run( airflow_controller::reconcile_airflow, @@ -222,6 +242,24 @@ fn references_authentication_class( .any(|c| c.common.authentication_class_name() == &authentication_class_name) } +fn references_open_lineage_connection( + airflow: &DeserializeGuard, + open_lineage_connection: &DeserializeGuard, +) -> bool { + let Ok(airflow) = &airflow.0 else { + return false; + }; + + match &airflow.spec.cluster_config.open_lineage { + Some(open_lineage) => matches!( + &open_lineage.connection, + openlineage::v1alpha1::InlineConnectionOrReference::Reference(name) + if name == &open_lineage_connection.name_any() + ), + None => false, + } +} + fn references_config_map( airflow: &DeserializeGuard, config_map: &DeserializeGuard, diff --git a/rust/operator-binary/src/webhooks/conversion.rs b/rust/operator-binary/src/webhooks/conversion.rs index f75a570e..c0330a1f 100644 --- a/rust/operator-binary/src/webhooks/conversion.rs +++ b/rust/operator-binary/src/webhooks/conversion.rs @@ -4,7 +4,7 @@ use stackable_operator::{ kube::{Client, core::crd::MergeError}, webhook::{ WebhookServer, WebhookServerError, WebhookServerOptions, - webhooks::{ConversionWebhook, ConversionWebhookOptions}, + webhooks::{ConversionReview, ConversionWebhook, ConversionWebhookOptions}, }, }; @@ -27,9 +27,11 @@ pub async fn create_webhook_server( disable_crd_maintenance: bool, client: Client, ) -> Result { + // The conversion handlers are cast to fn pointers so both CRD entries share a single element + // type (each `fn` item otherwise has its own unique type). let crds_and_handlers = vec![( AirflowCluster::merged_crd(AirflowClusterVersion::V1Alpha2).context(MergeCrdSnafu)?, - AirflowCluster::try_convert, + AirflowCluster::try_convert as fn(ConversionReview) -> ConversionReview, )]; let conversion_webhook_options = ConversionWebhookOptions { diff --git a/tests/templates/kuttl/openlineage/00-patch-ns.yaml.j2 b/tests/templates/kuttl/openlineage/00-patch-ns.yaml.j2 new file mode 100644 index 00000000..67185acf --- /dev/null +++ b/tests/templates/kuttl/openlineage/00-patch-ns.yaml.j2 @@ -0,0 +1,9 @@ +{% if test_scenario['values']['openshift'] == 'true' %} +# see https://github.com/stackabletech/issues/issues/566 +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: kubectl patch namespace $NAMESPACE -p '{"metadata":{"labels":{"pod-security.kubernetes.io/enforce":"privileged"}}}' + timeout: 120 +{% endif %} diff --git a/tests/templates/kuttl/openlineage/00-rbac.yaml.j2 b/tests/templates/kuttl/openlineage/00-rbac.yaml.j2 new file mode 100644 index 00000000..0b9df7d2 --- /dev/null +++ b/tests/templates/kuttl/openlineage/00-rbac.yaml.j2 @@ -0,0 +1,38 @@ +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: use-integration-tests-scc +rules: + - apiGroups: + - "" + resources: + - configmaps + - secrets + verbs: + - create + - get + - patch +{% if test_scenario['values']['openshift'] == "true" %} + - apiGroups: ["security.openshift.io"] + resources: ["securitycontextconstraints"] + resourceNames: ["privileged"] + verbs: ["use"] +{% endif %} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: integration-tests-sa +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: use-integration-tests-scc +subjects: + - kind: ServiceAccount + name: integration-tests-sa +roleRef: + kind: Role + name: use-integration-tests-scc + apiGroup: rbac.authorization.k8s.io diff --git a/tests/templates/kuttl/openlineage/01-assert.yaml b/tests/templates/kuttl/openlineage/01-assert.yaml new file mode 100644 index 00000000..319e927a --- /dev/null +++ b/tests/templates/kuttl/openlineage/01-assert.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: test-airflow-postgresql +timeout: 480 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airflow-postgresql +status: + readyReplicas: 1 + replicas: 1 diff --git a/tests/templates/kuttl/openlineage/01-install-postgresql.yaml b/tests/templates/kuttl/openlineage/01-install-postgresql.yaml new file mode 100644 index 00000000..dc25ba20 --- /dev/null +++ b/tests/templates/kuttl/openlineage/01-install-postgresql.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: >- + helm install airflow-postgresql + --namespace $NAMESPACE + --version 16.4.2 + -f helm-bitnami-postgresql-values.yaml + oci://registry-1.docker.io/bitnamicharts/postgresql + timeout: 600 diff --git a/tests/templates/kuttl/openlineage/02-assert.yaml.j2 b/tests/templates/kuttl/openlineage/02-assert.yaml.j2 new file mode 100644 index 00000000..8d585401 --- /dev/null +++ b/tests/templates/kuttl/openlineage/02-assert.yaml.j2 @@ -0,0 +1,24 @@ +{% if test_scenario['values']['executor'] == 'celery' %} +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: test-airflow-redis +timeout: 360 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airflow-redis-master +status: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airflow-redis-replicas +status: + readyReplicas: 1 + replicas: 1 +{% endif %} diff --git a/tests/templates/kuttl/openlineage/02-install-redis.yaml.j2 b/tests/templates/kuttl/openlineage/02-install-redis.yaml.j2 new file mode 100644 index 00000000..aae9a14f --- /dev/null +++ b/tests/templates/kuttl/openlineage/02-install-redis.yaml.j2 @@ -0,0 +1,13 @@ +{% if test_scenario['values']['executor'] == 'celery' %} +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: >- + helm install airflow-redis + --namespace $NAMESPACE + --version 17.11.3 + -f helm-bitnami-redis-values.yaml + --repo https://charts.bitnami.com/bitnami redis + timeout: 600 +{% endif %} diff --git a/tests/templates/kuttl/openlineage/03-install-vector-aggregator-discovery-configmap.yaml.j2 b/tests/templates/kuttl/openlineage/03-install-vector-aggregator-discovery-configmap.yaml.j2 new file mode 100644 index 00000000..2d6a0df5 --- /dev/null +++ b/tests/templates/kuttl/openlineage/03-install-vector-aggregator-discovery-configmap.yaml.j2 @@ -0,0 +1,9 @@ +{% if lookup('env', 'VECTOR_AGGREGATOR') %} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: vector-aggregator-discovery +data: + ADDRESS: {{ lookup('env', 'VECTOR_AGGREGATOR') }} +{% endif %} diff --git a/tests/templates/kuttl/openlineage/10-install-secretclass-auth-connection.yaml.j2 b/tests/templates/kuttl/openlineage/10-install-secretclass-auth-connection.yaml.j2 new file mode 100644 index 00000000..435901ee --- /dev/null +++ b/tests/templates/kuttl/openlineage/10-install-secretclass-auth-connection.yaml.j2 @@ -0,0 +1,55 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +metadata: + name: openlineage-secretclass-auth-connection +commands: + - script: | + kubectl apply -n "$NAMESPACE" -f - <.svc.cluster.local) as a SAN, so it + # matches the host the Airflow OpenLineage client connects to. + - name: tls + ephemeral: + volumeClaimTemplate: + metadata: + annotations: + secrets.stackable.tech/class: openlineage-ca-cert + secrets.stackable.tech/scope: service=openlineage-receiver + spec: + storageClassName: secrets.stackable.tech + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "1" +{% endif %} +--- +apiVersion: v1 +kind: Service +metadata: + name: openlineage-receiver +spec: + selector: + app: openlineage-receiver + ports: + - port: 5000 + targetPort: 5000 diff --git a/tests/templates/kuttl/openlineage/20-assert.yaml.j2 b/tests/templates/kuttl/openlineage/20-assert.yaml.j2 new file mode 100644 index 00000000..e08b6e99 --- /dev/null +++ b/tests/templates/kuttl/openlineage/20-assert.yaml.j2 @@ -0,0 +1,40 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: test-airflow-cluster +timeout: 1200 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airflow-webserver-default +status: + readyReplicas: 1 + replicas: 1 +{% if test_scenario['values']['executor'] == 'celery' %} +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airflow-worker-default +status: + readyReplicas: 1 + replicas: 1 +{% endif %} +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airflow-scheduler-default +status: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: airflow-dagprocessor-default +status: + readyReplicas: 1 + replicas: 1 diff --git a/tests/templates/kuttl/openlineage/20-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/openlineage/20-install-airflow-cluster.yaml.j2 new file mode 100644 index 00000000..2d436478 --- /dev/null +++ b/tests/templates/kuttl/openlineage/20-install-airflow-cluster.yaml.j2 @@ -0,0 +1,157 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +metadata: + name: install-airflow +timeout: 480 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-admin-credentials +type: Opaque +stringData: + adminUser.username: airflow + adminUser.firstname: Airflow + adminUser.lastname: Admin + adminUser.email: airflow@airflow.com + adminUser.password: airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow +{% if test_scenario['values']['executor'] == 'celery' %} +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis +{% endif %} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: test-cm-dag +data: + openlineage_test_dag.py: | + import pendulum + from airflow import DAG + from airflow.operators.bash import BashOperator + + with DAG( + dag_id="openlineage_test_dag", + start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), + catchup=False, + schedule=None, + tags=["openlineage"], + ) as dag: + BashOperator( + task_id="emit_lineage", + bash_command="echo 'emitting openlineage events'", + ) +--- +apiVersion: airflow.stackable.tech/v1alpha2 +kind: AirflowCluster +metadata: + name: airflow +spec: + image: +{% if test_scenario['values']['airflow-latest'].find(",") > 0 %} + custom: "{{ test_scenario['values']['airflow-latest'].split(',')[1] }}" + productVersion: "{{ test_scenario['values']['airflow-latest'].split(',')[0] }}" +{% else %} + productVersion: "{{ test_scenario['values']['airflow-latest'] }}" +{% endif %} + pullPolicy: IfNotPresent + clusterConfig: +{% if lookup('env', 'VECTOR_AGGREGATOR') %} + vectorAggregatorConfigMapName: vector-aggregator-discovery +{% endif %} + credentialsSecretName: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecretName: airflow-postgresql-credentials +{% if test_scenario['values']['executor'] == 'celery' %} + celeryResultsBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecretName: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecretName: airflow-redis-credentials +{% endif %} + openLineage: + # `appName` is not used by Airflow (job names are derived per DAG/task); set here to + # exercise the ignore-and-document path. + appName: airflow-openlineage-test + # Reference the OpenLineageConnection created in step 10 (also exercises the reference path, + # its RBAC and the reconcile watch). TLS/auth are configured on that resource. + connection: + reference: openlineage-receiver-connection + volumes: + - name: test-cm-dag + configMap: + name: test-cm-dag + volumeMounts: + - name: test-cm-dag + mountPath: /dags/openlineage_test_dag.py + subPath: openlineage_test_dag.py + webservers: + roleConfig: + listenerClass: external-unstable + config: + logging: + enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} + roleGroups: + default: + envOverrides: + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + replicas: 1 +{% if test_scenario['values']['executor'] == 'celery' %} + celeryExecutors: + config: + logging: + enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} + roleGroups: + default: + envOverrides: + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + replicas: 1 +{% elif test_scenario['values']['executor'] == 'kubernetes' %} + kubernetesExecutors: + envOverrides: + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + config: + logging: + enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} +{% endif %} + schedulers: + config: + gracefulShutdownTimeout: 10s + logging: + enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} + roleGroups: + default: + envOverrides: + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + replicas: 1 + dagProcessors: + config: + gracefulShutdownTimeout: 10s + logging: + enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} + roleGroups: + default: + envOverrides: + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + replicas: 1 diff --git a/tests/templates/kuttl/openlineage/30-assert.yaml b/tests/templates/kuttl/openlineage/30-assert.yaml new file mode 100644 index 00000000..6edaa3c3 --- /dev/null +++ b/tests/templates/kuttl/openlineage/30-assert.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: test-airflow-python +timeout: 240 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: test-airflow-python +status: + readyReplicas: 1 + replicas: 1 diff --git a/tests/templates/kuttl/openlineage/30-install-airflow-python.yaml b/tests/templates/kuttl/openlineage/30-install-airflow-python.yaml new file mode 100644 index 00000000..9727ea56 --- /dev/null +++ b/tests/templates/kuttl/openlineage/30-install-airflow-python.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: test-airflow-python + labels: + app: test-airflow-python +spec: + replicas: 1 + selector: + matchLabels: + app: test-airflow-python + template: + metadata: + labels: + app: test-airflow-python + spec: + containers: + - name: test-airflow-python + image: oci.stackable.tech/sdp/testing-tools:0.3.0-stackable0.0.0-dev + imagePullPolicy: IfNotPresent + stdin: true + tty: true diff --git a/tests/templates/kuttl/openlineage/40-assert.yaml.j2 b/tests/templates/kuttl/openlineage/40-assert.yaml.j2 new file mode 100644 index 00000000..b85052aa --- /dev/null +++ b/tests/templates/kuttl/openlineage/40-assert.yaml.j2 @@ -0,0 +1,12 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: test-airflow-webserver-health-check +timeout: 480 +commands: +{% if test_scenario['values']['airflow-latest'].find(",") > 0 %} + - script: kubectl exec -n $NAMESPACE test-airflow-python-0 -- python /tmp/health.py --airflow-version "{{ test_scenario['values']['airflow-latest'].split(',')[0] }}" +{% else %} + - script: kubectl exec -n $NAMESPACE test-airflow-python-0 -- python /tmp/health.py --airflow-version "{{ test_scenario['values']['airflow-latest'] }}" +{% endif %} diff --git a/tests/templates/kuttl/openlineage/40-health-check.yaml b/tests/templates/kuttl/openlineage/40-health-check.yaml new file mode 100644 index 00000000..f4e1b83e --- /dev/null +++ b/tests/templates/kuttl/openlineage/40-health-check.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 480 +commands: + - script: kubectl cp -n $NAMESPACE ../../../../templates/kuttl/commons/health.py test-airflow-python-0:/tmp + timeout: 240 + - script: kubectl cp -n $NAMESPACE ./check_lineage.py test-airflow-python-0:/tmp + timeout: 240 diff --git a/tests/templates/kuttl/openlineage/50-assert.yaml.j2 b/tests/templates/kuttl/openlineage/50-assert.yaml.j2 new file mode 100644 index 00000000..f74b8fd1 --- /dev/null +++ b/tests/templates/kuttl/openlineage/50-assert.yaml.j2 @@ -0,0 +1,12 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: check-openlineage-events +timeout: 480 +commands: +{% if test_scenario['values']['openlineage-use-tls'] == 'true' %} + - script: kubectl exec -n $NAMESPACE test-airflow-python-0 -- python /tmp/check_lineage.py --receiver-url https://openlineage-receiver:5000 +{% else %} + - script: kubectl exec -n $NAMESPACE test-airflow-python-0 -- python /tmp/check_lineage.py --receiver-url http://openlineage-receiver:5000 +{% endif %} diff --git a/tests/templates/kuttl/openlineage/90-cleanup-executor-pods.yaml.j2 b/tests/templates/kuttl/openlineage/90-cleanup-executor-pods.yaml.j2 new file mode 100644 index 00000000..f2ad3209 --- /dev/null +++ b/tests/templates/kuttl/openlineage/90-cleanup-executor-pods.yaml.j2 @@ -0,0 +1,20 @@ +{% if test_scenario['values']['executor'] == 'kubernetes' %} +--- +# Force-delete KubernetesExecutor DAG task pods before kuttl deletes the namespace. +# Their Vector sidecar does not respond to SIGTERM (it is not PID 1), so these pods +# sit in Terminating for the full terminationGracePeriodSeconds (300s), blocking +# namespace deletion past kuttl's timeout. +# The proper fix is in operator-rs (making Vector PID 1 via exec). +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 600 +commands: + - script: | + kubectl delete airflowcluster airflow -n $NAMESPACE --wait=false 2>/dev/null || true + - script: | + if kubectl wait --for=delete pod -l app.kubernetes.io/name=airflow -n $NAMESPACE --timeout=120s 2>/dev/null; then + exit 0 + fi + kubectl delete pods -l app.kubernetes.io/name=airflow -n $NAMESPACE --grace-period=0 --force 2>/dev/null || true + kubectl wait --for=delete pod -l app.kubernetes.io/name=airflow -n $NAMESPACE --timeout=300s +{% endif %} diff --git a/tests/templates/kuttl/openlineage/check_lineage.py b/tests/templates/kuttl/openlineage/check_lineage.py new file mode 100644 index 00000000..274898d9 --- /dev/null +++ b/tests/templates/kuttl/openlineage/check_lineage.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +"""Trigger a DAG run and assert that OpenLineage events reached the test receiver. + +Runs inside the `test-airflow-python` pod. Triggers `openlineage_test_dag`, then polls the +test receiver's `/events` endpoint until it has captured lineage events for that DAG, +including a terminal `COMPLETE` event. +""" + +import argparse +import sys +import time +from datetime import datetime, timezone + +import requests +import urllib3 + +DAG_ID = "openlineage_test_dag" + + +def get_token(base_url: str) -> str: + resp = requests.post( + f"{base_url}/auth/token", + headers={"Content-Type": "application/json"}, + json={"username": "airflow", "password": "airflow"}, + timeout=10, + ) + resp.raise_for_status() + return resp.json()["access_token"] + + +def trigger_dag(base_url: str, headers: dict) -> bool: + # Unpause the DAG, then trigger a run. Mirrors the working commons/metrics.py trigger: the + # Airflow 3 API expects an ISO logical_date (a null value can be rejected with a 422). + # Returns True only if the run was actually accepted (2xx); the DAG may not be registered yet + # (ConfigMap mount + dag-processor parse takes time), in which case the caller must retry. + now = datetime.now(timezone.utc) + logical_date = now.strftime("%Y-%m-%dT%H:%M:%S.%f") + now.strftime("%z") + patch_resp = requests.patch( + f"{base_url}/api/v2/dags/{DAG_ID}", + headers=headers, + json={"is_paused": False}, + timeout=10, + ) + if patch_resp.status_code >= 300: + print(f"Unpause not ready yet: {patch_resp.status_code} {patch_resp.text}") + return False + resp = requests.post( + f"{base_url}/api/v2/dags/{DAG_ID}/dagRuns", + headers=headers, + json={"logical_date": logical_date, "conf": {}}, + timeout=10, + ) + print(f"Trigger response: {resp.status_code} {resp.text}") + return resp.status_code < 300 + + +def receiver_has_lineage(receiver_url: str) -> bool: + resp = requests.get(f"{receiver_url}/events", timeout=10, verify=False) + if resp.status_code != 200: + return False + body = resp.text + return DAG_ID in body and "COMPLETE" in body + + +if __name__ == "__main__": + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + parser = argparse.ArgumentParser(description="OpenLineage lineage check") + parser.add_argument( + "--webserver-url", + default="http://airflow-webserver-default-headless:8080", + ) + parser.add_argument( + "--receiver-url", + required=True, + help="Base URL of the OpenLineage test receiver, e.g. http://openlineage-receiver:5000", + ) + opts = parser.parse_args() + + # Allow a few moments for the DAG to be registered on all roles. + time.sleep(15) + + triggered = False + deadline = time.time() + 300 + while time.time() < deadline: + try: + if not triggered: + token = get_token(opts.webserver_url) + headers = { + "Authorization": f"Bearer {token}", + "Content-Type": "application/json", + } + # Keep retrying until the run is actually accepted - the DAG may not be + # registered yet on the first attempts. + triggered = trigger_dag(opts.webserver_url, headers) + + if triggered and receiver_has_lineage(opts.receiver_url): + print("OpenLineage events for the DAG were received.") + sys.exit(0) + except Exception as e: # noqa: BLE001 + print(f"Retrying after error: {e}") + + time.sleep(10) + + print("Timed out waiting for OpenLineage events at the receiver.") + sys.exit(1) diff --git a/tests/templates/kuttl/openlineage/helm-bitnami-postgresql-values.yaml.j2 b/tests/templates/kuttl/openlineage/helm-bitnami-postgresql-values.yaml.j2 new file mode 100644 index 00000000..80c50924 --- /dev/null +++ b/tests/templates/kuttl/openlineage/helm-bitnami-postgresql-values.yaml.j2 @@ -0,0 +1,37 @@ +--- +global: + security: + allowInsecureImages: true + +image: + repository: bitnamilegacy/postgresql + +volumePermissions: + enabled: false + image: + repository: bitnamilegacy/os-shell + securityContext: + runAsUser: auto + +metrics: + image: + repository: bitnamilegacy/postgres-exporter + +primary: + podSecurityContext: +{% if test_scenario['values']['openshift'] == 'true' %} + enabled: false +{% else %} + enabled: true +{% endif %} + containerSecurityContext: + enabled: false + +shmVolume: + chmod: + enabled: false + +auth: + username: airflow + password: airflow + database: airflow diff --git a/tests/templates/kuttl/openlineage/helm-bitnami-redis-values.yaml.j2 b/tests/templates/kuttl/openlineage/helm-bitnami-redis-values.yaml.j2 new file mode 100644 index 00000000..0198dc51 --- /dev/null +++ b/tests/templates/kuttl/openlineage/helm-bitnami-redis-values.yaml.j2 @@ -0,0 +1,49 @@ +--- +global: + security: + allowInsecureImages: true # needed starting with Chart version 20.5.0 if modifying images +image: + repository: bitnamilegacy/redis +sentinel: + image: + repository: bitnamilegacy/redis-sentinel +metrics: + image: + repository: bitnamilegacy/redis-exporter +kubectl: + image: + repository: bitnamilegacy/kubectl +sysctl: + image: + repository: bitnamilegacy/os-shell + +volumePermissions: + enabled: false + image: + repository: bitnamilegacy/os-shell + containerSecurityContext: + runAsUser: auto + +master: + podSecurityContext: +{% if test_scenario['values']['openshift'] == 'true' %} + enabled: false +{% else %} + enabled: true +{% endif %} + containerSecurityContext: + enabled: false + +replica: + replicaCount: 1 + podSecurityContext: +{% if test_scenario['values']['openshift'] == 'true' %} + enabled: false +{% else %} + enabled: true +{% endif %} + containerSecurityContext: + enabled: false + +auth: + password: redis diff --git a/tests/test-definition.yaml b/tests/test-definition.yaml index 52c8b1a1..cc28f217 100644 --- a/tests/test-definition.yaml +++ b/tests/test-definition.yaml @@ -37,6 +37,14 @@ dimensions: values: - https - ssh + - name: openlineage-use-tls + values: + - "false" + - "true" + - name: openlineage-use-auth + values: + - "false" + - "true" tests: - name: smoke dimensions: @@ -118,6 +126,13 @@ tests: dimensions: - airflow-latest - openshift + - name: openlineage + dimensions: + - airflow-latest + - openshift + - executor + - openlineage-use-tls + - openlineage-use-auth suites: - name: nightly # Run nightly with the latest airflow