From b0b0c798074a87551f509935fcc57e446a816c52 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Wed, 8 Jan 2025 15:15:30 +0100 Subject: [PATCH 01/30] wip: added olm-deployer --- Cargo.lock | 3994 --------------------------------- Cargo.toml | 5 +- rust/olm-deployer/Cargo.toml | 23 + rust/olm-deployer/build.rs | 3 + rust/olm-deployer/src/main.rs | 122 + 5 files changed, 152 insertions(+), 3995 deletions(-) delete mode 100644 Cargo.lock create mode 100644 rust/olm-deployer/Cargo.toml create mode 100644 rust/olm-deployer/build.rs create mode 100644 rust/olm-deployer/src/main.rs diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index b88c18c3..00000000 --- a/Cargo.lock +++ /dev/null @@ -1,3994 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" -dependencies = [ - "anstyle", - "windows-sys 0.59.0", -] - -[[package]] -name = "anyhow" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" - -[[package]] -name = "async-broadcast" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "async-trait" -version = "0.1.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", -] - -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "getrandom", - "instant", - "rand", -] - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.6.0", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.90", - "which", -] - -[[package]] -name = "bindgen" -version = "0.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" -dependencies = [ - "bitflags 2.6.0", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.90", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "built" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" -dependencies = [ - "chrono", - "git2", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cc" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" -dependencies = [ - "libc", -] - -[[package]] -name = "cross-krb5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ea465841101b566a7d00627150a42762c4e9497ca4941856d93e1f8d7691ba" -dependencies = [ - "anyhow", - "bitflags 2.6.0", - "bytes", - "libgssapi 0.8.1", - "windows", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.90", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "delegate" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2323e10c92e1cf4d86e11538512e6dc03ceb586842970b6332af3d4046a046" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "des" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" -dependencies = [ - "cipher", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "dockerfile-parser" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75799314f5fa405629a365a1f97d80f81edd17f22a0fc9c8ddb3ad191ad8dc08" -dependencies = [ - "enquote", - "lazy_static", - "pest", - "pest_derive", - "regex", - "snafu 0.6.10", -] - -[[package]] -name = "dyn-clone" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enquote" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c36cb11dbde389f4096111698d8b567c0720e3452fd5ac3e6b4e47e1939932" -dependencies = [ - "thiserror 1.0.69", -] - -[[package]] -name = "enum-ordinalize" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "fancy-regex" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" -dependencies = [ - "bit-set", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "fluent-uri" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures 0.1.31", - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "git2" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" -dependencies = [ - "bitflags 2.6.0", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "h2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.7.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" - -[[package]] -name = "headers" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" -dependencies = [ - "base64 0.21.7", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" -dependencies = [ - "http", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "http" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-http-proxy" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d06dbdfbacf34d996c6fb540a71a684a7aae9056c71951163af8a8a4c07b9a4" -dependencies = [ - "bytes", - "futures-util", - "headers", - "http", - "hyper", - "hyper-rustls", - "hyper-util", - "pin-project-lite", - "rustls-native-certs 0.7.3", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "log", - "rustls", - "rustls-native-certs 0.8.1", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core 0.52.0", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" -dependencies = [ - "equivalent", - "hashbrown 0.15.2", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "java-properties" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37bf6f484471c451f2b51eabd9e66b3fa7274550c5ec4b6c3d6070840945117f" -dependencies = [ - "encoding_rs", - "lazy_static", - "regex", -] - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "json-patch" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" -dependencies = [ - "jsonptr", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonpath-rust" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d8fe85bd70ff715f31ce8c739194b423d79811a19602115d611a3ec85d6200" -dependencies = [ - "lazy_static", - "once_cell", - "pest", - "pest_derive", - "regex", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonptr" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" -dependencies = [ - "fluent-uri", - "serde", - "serde_json", -] - -[[package]] -name = "k8s-openapi" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8847402328d8301354c94d605481f25a6bdc1ed65471fd96af8eca71141b13" -dependencies = [ - "base64 0.22.1", - "chrono", - "schemars", - "serde", - "serde-value", - "serde_json", -] - -[[package]] -name = "krb5" -version = "0.0.0-dev" -dependencies = [ - "krb5-sys", - "snafu 0.8.5", -] - -[[package]] -name = "krb5-sys" -version = "0.0.0-dev" -dependencies = [ - "bindgen 0.70.1", - "pkg-config", -] - -[[package]] -name = "kube" -version = "0.96.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efffeb3df0bd4ef3e5d65044573499c0e4889b988070b08c50b25b1329289a1f" -dependencies = [ - "k8s-openapi", - "kube-client", - "kube-core", - "kube-derive", - "kube-runtime", -] - -[[package]] -name = "kube-client" -version = "0.96.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf471ece8ff8d24735ce78dac4d091e9fcb8d74811aeb6b75de4d1c3f5de0f1" -dependencies = [ - "base64 0.22.1", - "bytes", - "chrono", - "either", - "futures 0.3.31", - "home", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-http-proxy", - "hyper-rustls", - "hyper-timeout", - "hyper-util", - "jsonpath-rust", - "k8s-openapi", - "kube-core", - "pem", - "rustls", - "rustls-pemfile", - "secrecy", - "serde", - "serde_json", - "serde_yaml", - "thiserror 1.0.69", - "tokio", - "tokio-util", - "tower 0.5.2", - "tower-http", - "tracing", -] - -[[package]] -name = "kube-core" -version = "0.96.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f42346d30bb34d1d7adc5c549b691bce7aa3a1e60254e68fab7e2d7b26fe3d77" -dependencies = [ - "chrono", - "form_urlencoded", - "http", - "json-patch", - "k8s-openapi", - "schemars", - "serde", - "serde-value", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "kube-derive" -version = "0.96.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9364e04cc5e0482136c6ee8b7fb7551812da25802249f35b3def7aaa31e82ad" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.90", -] - -[[package]] -name = "kube-runtime" -version = "0.96.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fbf1f6ffa98e65f1d2a9a69338bb60605d46be7edf00237784b89e62c9bd44" -dependencies = [ - "ahash", - "async-broadcast", - "async-stream", - "async-trait", - "backoff", - "educe", - "futures 0.3.31", - "hashbrown 0.14.5", - "json-patch", - "jsonptr", - "k8s-openapi", - "kube-client", - "parking_lot", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "lber" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2df7f9fd9f64cf8f59e1a4a0753fe7d575a5b38d3d7ac5758dcee9357d83ef0a" -dependencies = [ - "bytes", - "nom", -] - -[[package]] -name = "ldap3" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "166199a8207874a275144c8a94ff6eed5fcbf5c52303e4d9b4d53a0c7ac76554" -dependencies = [ - "async-trait", - "bytes", - "cross-krb5", - "futures 0.3.31", - "futures-util", - "lazy_static", - "lber", - "libgssapi 0.7.2", - "log", - "native-tls", - "nom", - "percent-encoding", - "thiserror 1.0.69", - "tokio", - "tokio-native-tls", - "tokio-stream", - "tokio-util", - "url", -] - -[[package]] -name = "libc" -version = "0.2.168" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" - -[[package]] -name = "libgit2-sys" -version = "0.17.0+1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libgssapi" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8663f3a3a93dd394b669dd9b213b457c5e0d2bc5a1b13a0950bd733c6fb6e37" -dependencies = [ - "bitflags 2.6.0", - "bytes", - "lazy_static", - "libgssapi-sys", -] - -[[package]] -name = "libgssapi" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7fb6c6c20f2c535a7d02bf6bcc0a5955878f4966805b47c31f9831ab88fd55" -dependencies = [ - "bitflags 2.6.0", - "bytes", - "lazy_static", - "libgssapi-sys", -] - -[[package]] -name = "libgssapi-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fa96e2c0ea19e1a2c21d8983a2bf1162818973411d87749c8f81c83ac76155" -dependencies = [ - "bindgen 0.69.5", - "pkg-config", -] - -[[package]] -name = "libloading" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" -dependencies = [ - "cfg-if", - "windows-targets", -] - -[[package]] -name = "libz-sys" -version = "1.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "litemap" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef2593ffb6958c941575cee70c8e257438749971869c4ae5acf6f91a168a61" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.36.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "openssl" -version = "0.10.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "opentelemetry" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b69a91d4893e713e06f724597ad630f1fa76057a5e1026c0ca67054a9032a76" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "once_cell", - "pin-project-lite", - "thiserror 1.0.69", -] - -[[package]] -name = "opentelemetry-jaeger" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501b471b67b746d9a07d4c29f8be00f952d1a2eca356922ede0098cbaddff19f" -dependencies = [ - "async-trait", - "futures-core", - "futures-util", - "opentelemetry", - "opentelemetry-semantic-conventions", - "opentelemetry_sdk", - "thrift", - "tokio", -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1869fb4bb9b35c5ba8a1e40c9b128a7b4c010d07091e864a29da19e4fe2ca4d7" - -[[package]] -name = "opentelemetry_sdk" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae312d58eaa90a82d2e627fd86e075cf5230b3f11794e2ed74199ebbe572d4fd" -dependencies = [ - "async-trait", - "futures-channel", - "futures-executor", - "futures-util", - "glob", - "lazy_static", - "once_cell", - "opentelemetry", - "ordered-float 4.5.0", - "percent-encoding", - "rand", - "thiserror 1.0.69", - "tokio", - "tokio-stream", -] - -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - -[[package]] -name = "ordered-float" -version = "4.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" -dependencies = [ - "num-traits", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "p12" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4873306de53fe82e7e484df31e1e947d61514b6ea2ed6cd7b45d63006fd9224" -dependencies = [ - "cbc", - "cipher", - "des", - "getrandom", - "hmac", - "lazy_static", - "rc2", - "sha1", - "yasna", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "pem" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" -dependencies = [ - "base64 0.22.1", - "serde", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" -dependencies = [ - "memchr", - "thiserror 2.0.7", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "pest_meta" -version = "2.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" -dependencies = [ - "once_cell", - "pest", - "sha2", -] - -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.7.0", -] - -[[package]] -name = "pin-project" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" -dependencies = [ - "proc-macro2", - "syn 2.0.90", -] - -[[package]] -name = "proc-macro2" -version = "1.0.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "product-config" -version = "0.7.0" -source = "git+https://github.com/stackabletech/product-config.git?tag=0.7.0#d61d4c7542c942da2ba0e9af4e5e3c3113abb0cf" -dependencies = [ - "fancy-regex", - "java-properties", - "schemars", - "semver", - "serde", - "serde_json", - "serde_yaml", - "snafu 0.8.5", - "xml-rs", -] - -[[package]] -name = "prost" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" -dependencies = [ - "heck", - "itertools 0.13.0", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.90", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" -dependencies = [ - "anyhow", - "itertools 0.13.0", - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "prost-types" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" -dependencies = [ - "prost", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rc2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" -dependencies = [ - "cipher", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustix" -version = "0.38.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "rustls-pki-types", - "schannel", - "security-framework 2.11.1", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.0.1", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "schemars" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" -dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", - "url", -] - -[[package]] -name = "schemars_derive" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.90", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "secrecy" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" -dependencies = [ - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" -dependencies = [ - "bitflags 2.6.0", - "core-foundation 0.10.0", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" - -[[package]] -name = "serde" -version = "1.0.216" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" -dependencies = [ - "ordered-float 2.10.1", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.216" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "serde_json" -version = "1.0.133" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap 2.7.0", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "smart-default" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "snafu" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab12d3c261b2308b0d80c26fffb58d17eba81a4be97890101f416b478c79ca7" -dependencies = [ - "doc-comment", - "snafu-derive 0.6.10", -] - -[[package]] -name = "snafu" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" -dependencies = [ - "snafu-derive 0.8.5", -] - -[[package]] -name = "snafu-derive" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1508efa03c362e23817f96cde18abed596a25219a8b2c66e8db33c03543d315b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "snafu-derive" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "socket2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stackable-krb5-provision-keytab" -version = "0.0.0-dev" -dependencies = [ - "byteorder", - "futures 0.3.31", - "krb5", - "ldap3", - "native-tls", - "rand", - "serde", - "serde_json", - "snafu 0.8.5", - "stackable-operator", - "stackable-secret-operator-crd-utils", - "tokio", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "stackable-operator" -version = "0.83.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.83.0#3ce7bcbdb58097cde0c0f19488a104c96f69dbc3" -dependencies = [ - "chrono", - "clap", - "const_format", - "delegate", - "dockerfile-parser", - "educe", - "either", - "futures 0.3.31", - "indexmap 2.7.0", - "json-patch", - "k8s-openapi", - "kube", - "opentelemetry-jaeger", - "opentelemetry_sdk", - "product-config", - "regex", - "schemars", - "semver", - "serde", - "serde_json", - "serde_yaml", - "snafu 0.8.5", - "stackable-operator-derive", - "stackable-shared", - "strum", - "time", - "tokio", - "tracing", - "tracing-appender", - "tracing-opentelemetry", - "tracing-subscriber", - "url", -] - -[[package]] -name = "stackable-operator-derive" -version = "0.3.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.83.0#3ce7bcbdb58097cde0c0f19488a104c96f69dbc3" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "stackable-secret-operator" -version = "0.0.0-dev" -dependencies = [ - "anyhow", - "async-trait", - "built", - "clap", - "futures 0.3.31", - "h2", - "libc", - "openssl", - "p12", - "pin-project", - "prost", - "prost-types", - "rand", - "serde", - "serde_json", - "serde_yaml", - "snafu 0.8.5", - "socket2", - "stackable-krb5-provision-keytab", - "stackable-operator", - "stackable-secret-operator-crd-utils", - "strum", - "sys-mount", - "tempfile", - "time", - "tokio", - "tokio-stream", - "tonic", - "tonic-build", - "tonic-reflection", - "tracing", - "uuid", - "yasna", -] - -[[package]] -name = "stackable-secret-operator-crd-utils" -version = "0.0.0-dev" -dependencies = [ - "serde", - "stackable-operator", -] - -[[package]] -name = "stackable-shared" -version = "0.0.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.83.0#3ce7bcbdb58097cde0c0f19488a104c96f69dbc3" -dependencies = [ - "kube", - "semver", - "serde", - "serde_yaml", - "snafu 0.8.5", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.90", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "sys-mount" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6acb8bb63826062d5a44b68298cf2e25b84bc151bc0c31c35a83b61f818682a" -dependencies = [ - "bitflags 2.6.0", - "libc", - "smart-default", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "tempfile" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93605438cbd668185516ab499d589afb7ee1859ea3d5fc8f6b0755e1c7443767" -dependencies = [ - "thiserror-impl 2.0.7", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d8749b4531af2117677a5fcd12b1348a3fe2b81e36e61ffeac5c4aa3273e36" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "thrift" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" -dependencies = [ - "byteorder", - "integer-encoding", - "log", - "ordered-float 2.10.1", - "threadpool", -] - -[[package]] -name = "time" -version = "0.3.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "slab", - "tokio", -] - -[[package]] -name = "tonic" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.22.1", - "bytes", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "prost", - "socket2", - "tokio", - "tokio-stream", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic-build" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" -dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "tonic-reflection" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878d81f52e7fcfd80026b7fdb6a9b578b3c3653ba987f87f0dce4b64043cba27" -dependencies = [ - "prost", - "prost-types", - "tokio", - "tokio-stream", - "tonic", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" -dependencies = [ - "base64 0.22.1", - "bitflags 2.6.0", - "bytes", - "http", - "http-body", - "mime", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror 1.0.69", - "time", - "tracing-subscriber", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f68803492bf28ab40aeccaecc7021096bd256baf7ca77c3d425d89b35a7be4e4" -dependencies = [ - "js-sys", - "once_cell", - "opentelemetry", - "opentelemetry_sdk", - "smallvec", - "tracing", - "tracing-core", - "tracing-log", - "tracing-subscriber", - "web-time", -] - -[[package]] -name = "tracing-serde" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "unicode-ident" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" -dependencies = [ - "getrandom", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.90", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-strings", - "windows-targets", -] - -[[package]] -name = "windows-implement" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "xml-rs" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" - -[[package]] -name = "yasna" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] diff --git a/Cargo.toml b/Cargo.toml index a9ed984e..0e3247d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,9 @@ serde_json = "1.0" serde_yaml = "0.9" snafu = "0.8" socket2 = { version = "0.5", features = ["all"] } -stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.83.0", features = ["time"] } +stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.83.0", features = [ + "time", +] } strum = { version = "0.26", features = ["derive"] } sys-mount = { version = "3.0", default-features = false } tempfile = "3.12" @@ -49,6 +51,7 @@ tonic-build = "0.12" tonic-reflection = "0.12" tracing = "0.1" tracing-subscriber = "0.3" +walkdir = "2.5.0" uuid = { version = "1.10.0", features = ["v4"] } yasna = "0.5" diff --git a/rust/olm-deployer/Cargo.toml b/rust/olm-deployer/Cargo.toml new file mode 100644 index 00000000..d9e8462c --- /dev/null +++ b/rust/olm-deployer/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "olm-deployer" +description = "OLM deployment helper." +version.workspace = true +authors.workspace = true +license.workspace = true +edition.workspace = true +repository.workspace = true +publish = false + +[dependencies] +anyhow.workspace = true +clap.workspace = true +tokio.workspace = true +tracing.workspace = true +stackable-operator.workspace = true +serde.workspace = true +serde_json.workspace = true +serde_yaml.workspace = true +walkdir.workspace = true + +[build-dependencies] +built.workspace = true diff --git a/rust/olm-deployer/build.rs b/rust/olm-deployer/build.rs new file mode 100644 index 00000000..fa809bfd --- /dev/null +++ b/rust/olm-deployer/build.rs @@ -0,0 +1,3 @@ +fn main() { + built::write_built_file().unwrap(); +} diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs new file mode 100644 index 00000000..d5f293c4 --- /dev/null +++ b/rust/olm-deployer/src/main.rs @@ -0,0 +1,122 @@ +use anyhow::{bail, Context, Result}; +use clap::{crate_description, crate_version, Parser}; +use stackable_operator::cli::Command; +use stackable_operator::client; +use stackable_operator::kube::api::{Api, DynamicObject, Patch, PatchParams, ResourceExt}; +use stackable_operator::kube::discovery::{ApiResource, Discovery}; + +use stackable_operator::kube::core::GroupVersionKind; +use stackable_operator::logging; +use stackable_operator::utils; +use stackable_operator::utils::cluster_info::KubernetesClusterInfoOpts; + +pub const APP_NAME: &str = "stkbl-secret-olm-deployer"; +pub const ENV_VAR_LOGGING: &str = "STKBL_SECRET_OLM_DEPLOYER_LOG"; + +mod built_info { + include!(concat!(env!("OUT_DIR"), "/built.rs")); +} + +#[derive(clap::Parser)] +#[clap(author, version)] +struct Opts { + #[clap(subcommand)] + cmd: Command, +} + +#[derive(clap::Parser)] +struct OlmDeployerRun { + #[arg(long, short)] + dir: std::path::PathBuf, + /// Tracing log collector system + #[arg(long, env, default_value_t, value_enum)] + pub tracing_target: logging::TracingTarget, + #[command(flatten)] + pub cluster_info_opts: KubernetesClusterInfoOpts, +} + +#[tokio::main] +async fn main() -> Result<()> { + let opts = Opts::parse(); + if let Command::Run(OlmDeployerRun { + dir, + tracing_target, + cluster_info_opts, + }) = opts.cmd + { + logging::initialize_logging(ENV_VAR_LOGGING, APP_NAME, tracing_target); + utils::print_startup_string( + crate_description!(), + crate_version!(), + built_info::GIT_VERSION, + built_info::TARGET, + built_info::BUILT_TIME_UTC, + built_info::RUSTC_VERSION, + ); + + let client = + client::initialize_operator(Some(APP_NAME.to_string()), &cluster_info_opts).await?; + + // discovery (to be able to infer apis from kind/plural only) + let discovery = Discovery::new(client.as_kube_client()).run().await?; + + for entry in walkdir::WalkDir::new(&dir) { + match entry { + Ok(manifest_file) => { + if manifest_file.file_type().is_file() { + let path = manifest_file.path(); + tracing::info!("Applied manifest file: {}", path.display()); + apply(path, &client, &discovery).await?; + } + } + Err(e) => { + tracing::error!("Error reading manifest file: {}", e); + } + } + } + } + + Ok(()) +} + +async fn apply( + pth: &std::path::Path, + client: &client::Client, + discovery: &Discovery, +) -> Result<()> { + let ssapply = PatchParams::apply(APP_NAME).force(); + let yaml = std::fs::read_to_string(pth) + .with_context(|| format!("Failed to read {}", pth.display()))?; + for doc in multidoc_deserialize(&yaml)? { + let obj: DynamicObject = serde_yaml::from_value(doc)?; + let gvk = if let Some(tm) = &obj.types { + GroupVersionKind::try_from(tm)? + } else { + bail!("cannot apply object without valid TypeMeta {:?}", obj); + }; + let name = obj.name_any(); + if let Some((ar, _caps)) = discovery.resolve_gvk(&gvk) { + let api = dynamic_api(ar, client); + tracing::trace!("Applying {}: \n{}", gvk.kind, serde_yaml::to_string(&obj)?); + let data: serde_json::Value = serde_json::to_value(&obj)?; + let _r = api.patch(&name, &ssapply, &Patch::Apply(data)).await?; + tracing::info!("applied {} {}", gvk.kind, name); + } else { + tracing::warn!("Cannot apply document for unknown {:?}", gvk); + } + } + Ok(()) +} + +fn multidoc_deserialize(data: &str) -> Result> { + use serde::Deserialize; + let mut docs = vec![]; + for de in serde_yaml::Deserializer::from_str(data) { + docs.push(serde_yaml::Value::deserialize(de)?); + } + Ok(docs) +} + +fn dynamic_api(ar: ApiResource, client: &client::Client) -> Api { + Api::default_namespaced_with(client.as_kube_client(), &ar) +} From fa1166830b2c9a9e10f6207927012b81f140c904 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:20:42 +0100 Subject: [PATCH 02/30] wip --- Cargo.lock | 4039 +++++++++++++++++++++++++++++++++ rust/olm-deployer/src/main.rs | 285 +++ 2 files changed, 4324 insertions(+) create mode 100644 Cargo.lock diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..b8c5e842 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,4039 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "async-trait" +version = "0.1.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom", + "instant", + "rand", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.95", + "which", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.95", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" +dependencies = [ + "chrono", + "git2", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9560b07a799281c7e0958b9296854d6fafd4c5f31444a7e5bb1ad6dde5ccf1bd" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874e0dd3eb68bf99058751ac9712f622e61e6f393a94f7128fa26e3f02f5c7cd" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "cross-krb5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96ea465841101b566a7d00627150a42762c4e9497ca4941856d93e1f8d7691ba" +dependencies = [ + "anyhow", + "bitflags 2.6.0", + "bytes", + "libgssapi 0.8.1", + "windows", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.95", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "delegate" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc2323e10c92e1cf4d86e11538512e6dc03ceb586842970b6332af3d4046a046" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "des" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" +dependencies = [ + "cipher", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "dockerfile-parser" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75799314f5fa405629a365a1f97d80f81edd17f22a0fc9c8ddb3ad191ad8dc08" +dependencies = [ + "enquote", + "lazy_static", + "pest", + "pest_derive", + "regex", + "snafu 0.6.10", +] + +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enquote" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c36cb11dbde389f4096111698d8b567c0720e3452fd5ac3e6b4e47e1939932" +dependencies = [ + "thiserror 1.0.69", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fancy-regex" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" +dependencies = [ + "bit-set", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures 0.1.31", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "git2" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" +dependencies = [ + "bitflags 2.6.0", + "libc", + "libgit2-sys", + "log", + "url", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.7.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "headers" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" +dependencies = [ + "base64 0.21.7", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-http-proxy" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d06dbdfbacf34d996c6fb540a71a684a7aae9056c71951163af8a8a4c07b9a4" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http", + "hyper", + "hyper-rustls", + "hyper-util", + "pin-project-lite", + "rustls-native-certs 0.7.3", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs 0.8.1", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "java-properties" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37bf6f484471c451f2b51eabd9e66b3fa7274550c5ec4b6c3d6070840945117f" +dependencies = [ + "encoding_rs", + "lazy_static", + "regex", +] + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonpath-rust" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d8fe85bd70ff715f31ce8c739194b423d79811a19602115d611a3ec85d6200" +dependencies = [ + "lazy_static", + "once_cell", + "pest", + "pest_derive", + "regex", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +dependencies = [ + "fluent-uri", + "serde", + "serde_json", +] + +[[package]] +name = "k8s-openapi" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8847402328d8301354c94d605481f25a6bdc1ed65471fd96af8eca71141b13" +dependencies = [ + "base64 0.22.1", + "chrono", + "schemars", + "serde", + "serde-value", + "serde_json", +] + +[[package]] +name = "krb5" +version = "0.0.0-dev" +dependencies = [ + "krb5-sys", + "snafu 0.8.5", +] + +[[package]] +name = "krb5-sys" +version = "0.0.0-dev" +dependencies = [ + "bindgen 0.70.1", + "pkg-config", +] + +[[package]] +name = "kube" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efffeb3df0bd4ef3e5d65044573499c0e4889b988070b08c50b25b1329289a1f" +dependencies = [ + "k8s-openapi", + "kube-client", + "kube-core", + "kube-derive", + "kube-runtime", +] + +[[package]] +name = "kube-client" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf471ece8ff8d24735ce78dac4d091e9fcb8d74811aeb6b75de4d1c3f5de0f1" +dependencies = [ + "base64 0.22.1", + "bytes", + "chrono", + "either", + "futures 0.3.31", + "home", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-http-proxy", + "hyper-rustls", + "hyper-timeout", + "hyper-util", + "jsonpath-rust", + "k8s-openapi", + "kube-core", + "pem", + "rustls", + "rustls-pemfile", + "secrecy", + "serde", + "serde_json", + "serde_yaml", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "tower 0.5.2", + "tower-http", + "tracing", +] + +[[package]] +name = "kube-core" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f42346d30bb34d1d7adc5c549b691bce7aa3a1e60254e68fab7e2d7b26fe3d77" +dependencies = [ + "chrono", + "form_urlencoded", + "http", + "json-patch", + "k8s-openapi", + "schemars", + "serde", + "serde-value", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "kube-derive" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9364e04cc5e0482136c6ee8b7fb7551812da25802249f35b3def7aaa31e82ad" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.95", +] + +[[package]] +name = "kube-runtime" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fbf1f6ffa98e65f1d2a9a69338bb60605d46be7edf00237784b89e62c9bd44" +dependencies = [ + "ahash", + "async-broadcast", + "async-stream", + "async-trait", + "backoff", + "educe", + "futures 0.3.31", + "hashbrown 0.14.5", + "json-patch", + "jsonptr", + "k8s-openapi", + "kube-client", + "parking_lot", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lber" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2df7f9fd9f64cf8f59e1a4a0753fe7d575a5b38d3d7ac5758dcee9357d83ef0a" +dependencies = [ + "bytes", + "nom", +] + +[[package]] +name = "ldap3" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "166199a8207874a275144c8a94ff6eed5fcbf5c52303e4d9b4d53a0c7ac76554" +dependencies = [ + "async-trait", + "bytes", + "cross-krb5", + "futures 0.3.31", + "futures-util", + "lazy_static", + "lber", + "libgssapi 0.7.2", + "log", + "native-tls", + "nom", + "percent-encoding", + "thiserror 1.0.69", + "tokio", + "tokio-native-tls", + "tokio-stream", + "tokio-util", + "url", +] + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "libgit2-sys" +version = "0.17.0+1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + +[[package]] +name = "libgssapi" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8663f3a3a93dd394b669dd9b213b457c5e0d2bc5a1b13a0950bd733c6fb6e37" +dependencies = [ + "bitflags 2.6.0", + "bytes", + "lazy_static", + "libgssapi-sys", +] + +[[package]] +name = "libgssapi" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7fb6c6c20f2c535a7d02bf6bcc0a5955878f4966805b47c31f9831ab88fd55" +dependencies = [ + "bitflags 2.6.0", + "bytes", + "lazy_static", + "libgssapi-sys", +] + +[[package]] +name = "libgssapi-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fa96e2c0ea19e1a2c21d8983a2bf1162818973411d87749c8f81c83ac76155" +dependencies = [ + "bindgen 0.69.5", + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "libz-sys" +version = "1.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "olm-deployer" +version = "0.0.0-dev" +dependencies = [ + "anyhow", + "built", + "clap", + "serde", + "serde_json", + "serde_yaml", + "stackable-operator", + "tokio", + "tracing", + "walkdir", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "openssl" +version = "0.10.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opentelemetry" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b69a91d4893e713e06f724597ad630f1fa76057a5e1026c0ca67054a9032a76" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror 1.0.69", +] + +[[package]] +name = "opentelemetry-jaeger" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501b471b67b746d9a07d4c29f8be00f952d1a2eca356922ede0098cbaddff19f" +dependencies = [ + "async-trait", + "futures-core", + "futures-util", + "opentelemetry", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "thrift", + "tokio", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1869fb4bb9b35c5ba8a1e40c9b128a7b4c010d07091e864a29da19e4fe2ca4d7" + +[[package]] +name = "opentelemetry_sdk" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae312d58eaa90a82d2e627fd86e075cf5230b3f11794e2ed74199ebbe572d4fd" +dependencies = [ + "async-trait", + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "lazy_static", + "once_cell", + "opentelemetry", + "ordered-float 4.6.0", + "percent-encoding", + "rand", + "thiserror 1.0.69", + "tokio", + "tokio-stream", +] + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p12" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4873306de53fe82e7e484df31e1e947d61514b6ea2ed6cd7b45d63006fd9224" +dependencies = [ + "cbc", + "cipher", + "des", + "getrandom", + "hmac", + "lazy_static", + "rc2", + "sha1", + "yasna", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +dependencies = [ + "memchr", + "thiserror 2.0.9", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "pest_meta" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.7.0", +] + +[[package]] +name = "pin-project" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705" +dependencies = [ + "proc-macro2", + "syn 2.0.95", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "product-config" +version = "0.7.0" +source = "git+https://github.com/stackabletech/product-config.git?tag=0.7.0#d61d4c7542c942da2ba0e9af4e5e3c3113abb0cf" +dependencies = [ + "fancy-regex", + "java-properties", + "schemars", + "semver", + "serde", + "serde_json", + "serde_yaml", + "snafu 0.8.5", + "xml-rs", +] + +[[package]] +name = "prost" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" +dependencies = [ + "heck", + "itertools 0.13.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.95", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" +dependencies = [ + "anyhow", + "itertools 0.13.0", + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "prost-types" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" +dependencies = [ + "prost", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rc2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" +dependencies = [ + "cipher", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", + "url", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.95", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" + +[[package]] +name = "serde" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float 2.10.1", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.217" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "serde_json" +version = "1.0.135" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.7.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smart-default" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "snafu" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab12d3c261b2308b0d80c26fffb58d17eba81a4be97890101f416b478c79ca7" +dependencies = [ + "doc-comment", + "snafu-derive 0.6.10", +] + +[[package]] +name = "snafu" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" +dependencies = [ + "snafu-derive 0.8.5", +] + +[[package]] +name = "snafu-derive" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1508efa03c362e23817f96cde18abed596a25219a8b2c66e8db33c03543d315b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "snafu-derive" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "stackable-krb5-provision-keytab" +version = "0.0.0-dev" +dependencies = [ + "byteorder", + "futures 0.3.31", + "krb5", + "ldap3", + "native-tls", + "rand", + "serde", + "serde_json", + "snafu 0.8.5", + "stackable-operator", + "stackable-secret-operator-crd-utils", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "stackable-operator" +version = "0.83.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.83.0#3ce7bcbdb58097cde0c0f19488a104c96f69dbc3" +dependencies = [ + "chrono", + "clap", + "const_format", + "delegate", + "dockerfile-parser", + "educe", + "either", + "futures 0.3.31", + "indexmap 2.7.0", + "json-patch", + "k8s-openapi", + "kube", + "opentelemetry-jaeger", + "opentelemetry_sdk", + "product-config", + "regex", + "schemars", + "semver", + "serde", + "serde_json", + "serde_yaml", + "snafu 0.8.5", + "stackable-operator-derive", + "stackable-shared", + "strum", + "time", + "tokio", + "tracing", + "tracing-appender", + "tracing-opentelemetry", + "tracing-subscriber", + "url", +] + +[[package]] +name = "stackable-operator-derive" +version = "0.3.1" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.83.0#3ce7bcbdb58097cde0c0f19488a104c96f69dbc3" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "stackable-secret-operator" +version = "0.0.0-dev" +dependencies = [ + "anyhow", + "async-trait", + "built", + "clap", + "futures 0.3.31", + "h2", + "libc", + "openssl", + "p12", + "pin-project", + "prost", + "prost-types", + "rand", + "serde", + "serde_json", + "serde_yaml", + "snafu 0.8.5", + "socket2", + "stackable-krb5-provision-keytab", + "stackable-operator", + "stackable-secret-operator-crd-utils", + "strum", + "sys-mount", + "tempfile", + "time", + "tokio", + "tokio-stream", + "tonic", + "tonic-build", + "tonic-reflection", + "tracing", + "uuid", + "yasna", +] + +[[package]] +name = "stackable-secret-operator-crd-utils" +version = "0.0.0-dev" +dependencies = [ + "serde", + "stackable-operator", +] + +[[package]] +name = "stackable-shared" +version = "0.0.1" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.83.0#3ce7bcbdb58097cde0c0f19488a104c96f69dbc3" +dependencies = [ + "kube", + "semver", + "serde", + "serde_yaml", + "snafu 0.8.5", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.95", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "sys-mount" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6acb8bb63826062d5a44b68298cf2e25b84bc151bc0c31c35a83b61f818682a" +dependencies = [ + "bitflags 2.6.0", + "libc", + "smart-default", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "tempfile" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +dependencies = [ + "cfg-if", + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "thrift" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" +dependencies = [ + "byteorder", + "integer-encoding", + "log", + "ordered-float 2.10.1", + "threadpool", +] + +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "socket2", + "tokio", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "tonic-reflection" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878d81f52e7fcfd80026b7fdb6a9b578b3c3653ba987f87f0dce4b64043cba27" +dependencies = [ + "prost", + "prost-types", + "tokio", + "tokio-stream", + "tonic", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" +dependencies = [ + "base64 0.22.1", + "bitflags 2.6.0", + "bytes", + "http", + "http-body", + "mime", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror 1.0.69", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f68803492bf28ab40aeccaecc7021096bd256baf7ca77c3d425d89b35a7be4e4" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry", + "opentelemetry_sdk", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", + "web-time", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.95", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "xml-rs" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index d5f293c4..6b209d6a 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -1,3 +1,9 @@ +// TODO: +// +// - get the deployment object for the olm helper +// - get the env, tolerations, etc from the deployment +// - filter out the secret daemonset from the given manifest files +// - add env, tolerations, etc to the daemonset use anyhow::{bail, Context, Result}; use clap::{crate_description, crate_version, Parser}; use stackable_operator::cli::Command; @@ -26,6 +32,8 @@ struct Opts { #[derive(clap::Parser)] struct OlmDeployerRun { + #[arg(long, short)] + namespace: String, #[arg(long, short)] dir: std::path::PathBuf, /// Tracing log collector system @@ -39,6 +47,7 @@ struct OlmDeployerRun { async fn main() -> Result<()> { let opts = Opts::parse(); if let Command::Run(OlmDeployerRun { + namespace, dir, tracing_target, cluster_info_opts, @@ -120,3 +129,279 @@ fn multidoc_deserialize(data: &str) -> Result> { fn dynamic_api(ar: ApiResource, client: &client::Client) -> Api { Api::default_namespaced_with(client.as_kube_client(), &ar) } + +#[cfg(test)] +mod test { + use anyhow::Result; + use serde::Deserialize; + use stackable_operator::{ + k8s_openapi::{ + api::{ + apps::v1::{DaemonSet, Deployment}, + core::v1::Toleration, + }, + Resource, + }, + kube::api::DynamicObject, + }; + + const DAEMONSET: &str = r#" +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: secret-operator-daemonset + labels: + app.kubernetes.io/instance: secret-operator + app.kubernetes.io/name: secret-operator + app.kubernetes.io/version: "24.11.0" + stackable.tech/vendor: Stackable +spec: + selector: + matchLabels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + template: + metadata: + labels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + spec: + serviceAccountName: secret-operator-serviceaccount + securityContext: {} + containers: + - name: secret-operator + securityContext: + privileged: true + runAsUser: 0 + image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + env: + - name: CSI_ENDPOINT + value: /csi/csi.sock + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: PRIVILEGED + value: "true" + volumeMounts: + - name: csi + mountPath: /csi + - name: mountpoint + mountPath: /var/lib/kubelet/pods + mountPropagation: Bidirectional + - name: tmp + mountPath: /tmp + - name: external-provisioner + image: "quay.io/stackable/sig-storage/csi-provisioner@sha256:dd730457133f619d8759269abcfa79d7aeb817e01ba7af2d3aa1417df406ea56" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + args: + - --csi-address=/csi/csi.sock + - --feature-gates=Topology=true + - --extra-create-metadata + volumeMounts: + - name: csi + mountPath: /csi + - name: node-driver-registrar + image: "quay.io/stackable/sig-storage/csi-node-driver-registrar@sha256:8331d680e6c40c56909f436ea3126fdca39761cf87781cd2db8d05c9082b05f5" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + args: + - --csi-address=/csi/csi.sock + - --kubelet-registration-path=/var/lib/kubelet/plugins/secrets.stackable.tech/csi.sock + volumeMounts: + - name: registration-sock + mountPath: /registration + - name: csi + mountPath: /csi + initContainers: + - name: migrate-longer-csi-registration-path + image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + command: + - /bin/bash + - -euo + - pipefail + - -x + - -c + - | + ls -la /registration + echo "Removing old (long) CSI registration path" + if [ -d "/registration/secrets.stackable.tech-reg.sock" ]; then rmdir /registration/secrets.stackable.tech-reg.sock; fi + ls -la /registration + volumeMounts: + - name: registration-sock + mountPath: /registration + securityContext: + runAsUser: 0 + volumes: + - name: registration-sock + hostPath: + # node-driver-registrar appends a driver-unique filename to this path to avoid conflicts + # see https://github.com/stackabletech/secret-operator/issues/229 for why this path should not be too long + path: /var/lib/kubelet/plugins_registry + - name: csi + hostPath: + path: /var/lib/kubelet/plugins/secrets.stackable.tech/ + - name: mountpoint + hostPath: + path: /var/lib/kubelet/pods/ + - name: tmp + emptyDir: {} +"#; + + const DEPLOYMENT: &str = r#" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: secret-operator-deployer + labels: + app.kubernetes.io/name: secret-operator-deployer + app.kubernetes.io/instance: secret-operator-deployer + stackable.tech/vendor: Stackable +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: secret-operator-deployer + app.kubernetes.io/instance: secret-operator-deployer + stackable.tech/vendor: Stackable + template: + metadata: + labels: + app.kubernetes.io/name: secret-operator-deployer + app.kubernetes.io/instance: secret-operator-deployer + spec: + serviceAccountName: secret-operator-deployer + securityContext: {} + containers: + - name: secret-operator-deployer + securityContext: {} + image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" + imagePullPolicy: IfNotPresent + command: ["/usr/bin/bash", "/manifests/deploy.sh"] + env: + - name: SOME_IMPORTANT_FEATURE_FLAG + value: "turn-it-on" + - name: OP_VERSION + value: '24.11.0' + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + resources: + limits: + cpu: 100m + memory: 512Mi + requests: + cpu: 100m + memory: 512Mi + volumeMounts: + - name: manifests + mountPath: /manifests + volumes: + - name: manifests + configMap: + name: secret-operator-deployer-manifests + tolerations: + - key: keep-out + value: "yes" + operator: Equal + effect: NoSchedule + "#; + + #[test] + fn test_copy_tolerations() -> Result<()> { + let data = serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(DEPLOYMENT))?; + //let do_deployment: DynamicObject = serde_yaml::from_value(data)?; + //let deployment: Deployment =do_deployment.try_parse()?; + let deployment: Deployment = serde_yaml::from_value(data)?; + + let data = serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(DAEMONSET))?; + let daemonset: DynamicObject = serde_yaml::from_value(data)?; + + let daemonset: DaemonSet = maybe_copy_tolerations(&deployment, &daemonset)?.unwrap(); + + assert_eq!( + daemonset_tolerations(&daemonset), + deployment_tolerations(&deployment) + ); + + Ok(()) + } + + fn maybe_copy_tolerations( + deployment: &Deployment, + res: &DynamicObject, + ) -> Result> { + let ds: Result = res.clone().try_parse(); + match ds { + Ok(mut daemonset) => { + if let Some(dts) = deployment_tolerations(deployment) { + if let Some(pod_spec) = daemonset + .spec + .as_mut() + .and_then(|s| s.template.spec.as_mut()) + { + match pod_spec.tolerations.as_mut() { + Some(ta) => ta.extend(dts.clone()), + _ => pod_spec.tolerations = Some(dts.clone()), + } + } + } + + Ok(Some(daemonset)) + } + _ => Ok(None), + } + } + + fn deployment_tolerations(deployment: &Deployment) -> Option<&Vec> { + deployment + .spec + .as_ref() + .and_then(|s| s.template.spec.as_ref()) + .and_then(|ps| ps.tolerations.as_ref()) + } + + fn daemonset_tolerations(res: &DaemonSet) -> Option<&Vec> { + res.spec + .as_ref() + .and_then(|s| s.template.spec.as_ref()) + .and_then(|ps| ps.tolerations.as_ref()) + } +} From 5b75e2a092901fec6edf2a0f862918ae39b93d85 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:57:36 +0100 Subject: [PATCH 03/30] wip: checkpoint --- rust/olm-deployer/src/main.rs | 96 +++++++++++++++++------------------ 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 6b209d6a..1458de59 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -8,13 +8,23 @@ use anyhow::{bail, Context, Result}; use clap::{crate_description, crate_version, Parser}; use stackable_operator::cli::Command; use stackable_operator::client; -use stackable_operator::kube::api::{Api, DynamicObject, Patch, PatchParams, ResourceExt}; +use stackable_operator::kube::api::{Api, Patch, PatchParams, ResourceExt}; use stackable_operator::kube::discovery::{ApiResource, Discovery}; use stackable_operator::kube::core::GroupVersionKind; use stackable_operator::logging; use stackable_operator::utils; use stackable_operator::utils::cluster_info::KubernetesClusterInfoOpts; +use stackable_operator::{ + k8s_openapi::{ + api::{ + apps::v1::{DaemonSet, Deployment}, + core::v1::Toleration, + }, + Resource, + }, + kube::api::DynamicObject, +}; pub const APP_NAME: &str = "stkbl-secret-olm-deployer"; pub const ENV_VAR_LOGGING: &str = "STKBL_SECRET_OLM_DEPLOYER_LOG"; @@ -130,21 +140,45 @@ fn dynamic_api(ar: ApiResource, client: &client::Client) -> Api { Api::default_namespaced_with(client.as_kube_client(), &ar) } +fn maybe_copy_tolerations(deployment: &Deployment, res: DynamicObject) -> Result { + let ds: Result = res.clone().try_parse(); + match ds { + Ok(mut daemonset) => { + if let Some(dts) = deployment_tolerations(deployment) { + if let Some(pod_spec) = daemonset + .spec + .as_mut() + .and_then(|s| s.template.spec.as_mut()) + { + match pod_spec.tolerations.as_mut() { + Some(ta) => ta.extend(dts.clone()), + _ => pod_spec.tolerations = Some(dts.clone()), + } + } + } + + // TODO: halp!! change this to a proper conversion. + let ret: DynamicObject = serde_yaml::from_str(&serde_yaml::to_string(&daemonset)?)?; + + Ok(ret) + } + _ => Ok(res), + } +} + +fn deployment_tolerations(deployment: &Deployment) -> Option<&Vec> { + deployment + .spec + .as_ref() + .and_then(|s| s.template.spec.as_ref()) + .and_then(|ps| ps.tolerations.as_ref()) +} + #[cfg(test)] mod test { + use super::*; use anyhow::Result; use serde::Deserialize; - use stackable_operator::{ - k8s_openapi::{ - api::{ - apps::v1::{DaemonSet, Deployment}, - core::v1::Toleration, - }, - Resource, - }, - kube::api::DynamicObject, - }; - const DAEMONSET: &str = r#" --- apiVersion: apps/v1 @@ -354,50 +388,16 @@ spec: let data = serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(DAEMONSET))?; let daemonset: DynamicObject = serde_yaml::from_value(data)?; - let daemonset: DaemonSet = maybe_copy_tolerations(&deployment, &daemonset)?.unwrap(); + let daemonset = maybe_copy_tolerations(&deployment, daemonset)?; assert_eq!( - daemonset_tolerations(&daemonset), + daemonset_tolerations(&daemonset.try_parse::()?), deployment_tolerations(&deployment) ); Ok(()) } - fn maybe_copy_tolerations( - deployment: &Deployment, - res: &DynamicObject, - ) -> Result> { - let ds: Result = res.clone().try_parse(); - match ds { - Ok(mut daemonset) => { - if let Some(dts) = deployment_tolerations(deployment) { - if let Some(pod_spec) = daemonset - .spec - .as_mut() - .and_then(|s| s.template.spec.as_mut()) - { - match pod_spec.tolerations.as_mut() { - Some(ta) => ta.extend(dts.clone()), - _ => pod_spec.tolerations = Some(dts.clone()), - } - } - } - - Ok(Some(daemonset)) - } - _ => Ok(None), - } - } - - fn deployment_tolerations(deployment: &Deployment) -> Option<&Vec> { - deployment - .spec - .as_ref() - .and_then(|s| s.template.spec.as_ref()) - .and_then(|ps| ps.tolerations.as_ref()) - } - fn daemonset_tolerations(res: &DaemonSet) -> Option<&Vec> { res.spec .as_ref() From bbe076295f9238f963bdc07782d0465ae5a1281a Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:32:52 +0100 Subject: [PATCH 04/30] wip --- rust/olm-deployer/src/main.rs | 51 ++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 1458de59..71e82704 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -8,6 +8,7 @@ use anyhow::{bail, Context, Result}; use clap::{crate_description, crate_version, Parser}; use stackable_operator::cli::Command; use stackable_operator::client; +use stackable_operator::k8s_openapi::api::core::v1::Namespace; use stackable_operator::kube::api::{Api, Patch, PatchParams, ResourceExt}; use stackable_operator::kube::discovery::{ApiResource, Discovery}; @@ -79,13 +80,22 @@ async fn main() -> Result<()> { // discovery (to be able to infer apis from kind/plural only) let discovery = Discovery::new(client.as_kube_client()).run().await?; + let deployment_api = client.get_api::(&namespace); + let deployment: Deployment = deployment_api.get("secret-operator-deployer").await?; + for entry in walkdir::WalkDir::new(&dir) { match entry { Ok(manifest_file) => { if manifest_file.file_type().is_file() { let path = manifest_file.path(); tracing::info!("Applied manifest file: {}", path.display()); - apply(path, &client, &discovery).await?; + let yaml = std::fs::read_to_string(path) + .with_context(|| format!("Failed to read {}", path.display()))?; + for doc in multidoc_deserialize(&yaml)? { + let obj: DynamicObject = serde_yaml::from_value(doc)?; + let obj = maybe_copy_tolerations(&deployment, obj)?; + apply(obj, &client, &discovery).await? + } } } Err(e) => { @@ -98,31 +108,22 @@ async fn main() -> Result<()> { Ok(()) } -async fn apply( - pth: &std::path::Path, - client: &client::Client, - discovery: &Discovery, -) -> Result<()> { +async fn apply(obj: DynamicObject, client: &client::Client, discovery: &Discovery) -> Result<()> { let ssapply = PatchParams::apply(APP_NAME).force(); - let yaml = std::fs::read_to_string(pth) - .with_context(|| format!("Failed to read {}", pth.display()))?; - for doc in multidoc_deserialize(&yaml)? { - let obj: DynamicObject = serde_yaml::from_value(doc)?; - let gvk = if let Some(tm) = &obj.types { - GroupVersionKind::try_from(tm)? - } else { - bail!("cannot apply object without valid TypeMeta {:?}", obj); - }; - let name = obj.name_any(); - if let Some((ar, _caps)) = discovery.resolve_gvk(&gvk) { - let api = dynamic_api(ar, client); - tracing::trace!("Applying {}: \n{}", gvk.kind, serde_yaml::to_string(&obj)?); - let data: serde_json::Value = serde_json::to_value(&obj)?; - let _r = api.patch(&name, &ssapply, &Patch::Apply(data)).await?; - tracing::info!("applied {} {}", gvk.kind, name); - } else { - tracing::warn!("Cannot apply document for unknown {:?}", gvk); - } + let gvk = if let Some(tm) = &obj.types { + GroupVersionKind::try_from(tm)? + } else { + bail!("cannot apply object without valid TypeMeta {:?}", obj); + }; + let name = obj.name_any(); + if let Some((ar, _caps)) = discovery.resolve_gvk(&gvk) { + let api = dynamic_api(ar, client); + tracing::trace!("Applying {}: \n{}", gvk.kind, serde_yaml::to_string(&obj)?); + let data: serde_json::Value = serde_json::to_value(&obj)?; + let _r = api.patch(&name, &ssapply, &Patch::Apply(data)).await?; + tracing::info!("applied {} {}", gvk.kind, name); + } else { + tracing::warn!("Cannot apply document for unknown {:?}", gvk); } Ok(()) } From 31b0372299c5808c45cf4ecbef8edca60f31c184 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:35:17 +0100 Subject: [PATCH 05/30] wip: working version --- nginx-deployment.yaml | 27 ++++ rust/olm-deployer/src/main.rs | 40 ++++-- .../tests/manifests/csi-driver.yaml | 17 +++ .../tests/manifests/daemonset.yaml | 133 ++++++++++++++++++ .../tests/manifests/migration-job.yaml | 53 +++++++ rust/olm-deployer/tests/manifests/roles.yaml | 78 ++++++++++ .../tests/manifests/serviceaccount.yaml | 23 +++ .../tests/manifests/storage-class.yaml | 6 + rust/olm-deployer/tests/manifests/tls.yaml | 18 +++ 9 files changed, 384 insertions(+), 11 deletions(-) create mode 100644 nginx-deployment.yaml create mode 100644 rust/olm-deployer/tests/manifests/csi-driver.yaml create mode 100644 rust/olm-deployer/tests/manifests/daemonset.yaml create mode 100644 rust/olm-deployer/tests/manifests/migration-job.yaml create mode 100644 rust/olm-deployer/tests/manifests/roles.yaml create mode 100644 rust/olm-deployer/tests/manifests/serviceaccount.yaml create mode 100644 rust/olm-deployer/tests/manifests/storage-class.yaml create mode 100644 rust/olm-deployer/tests/manifests/tls.yaml diff --git a/nginx-deployment.yaml b/nginx-deployment.yaml new file mode 100644 index 00000000..69952481 --- /dev/null +++ b/nginx-deployment.yaml @@ -0,0 +1,27 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: secret-operator-deployer + labels: + app: nginx +spec: + replicas: 3 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 + tolerations: + - key: keep-out + value: "yes" + operator: Equal + effect: NoSchedule diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 71e82704..c9eded7d 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -10,8 +10,9 @@ use stackable_operator::cli::Command; use stackable_operator::client; use stackable_operator::k8s_openapi::api::core::v1::Namespace; use stackable_operator::kube::api::{Api, Patch, PatchParams, ResourceExt}; -use stackable_operator::kube::discovery::{ApiResource, Discovery}; +use stackable_operator::kube::discovery::{ApiCapabilities, ApiResource, Discovery, Scope}; +use stackable_operator::kube; use stackable_operator::kube::core::GroupVersionKind; use stackable_operator::logging; use stackable_operator::utils; @@ -77,24 +78,25 @@ async fn main() -> Result<()> { let client = client::initialize_operator(Some(APP_NAME.to_string()), &cluster_info_opts).await?; - // discovery (to be able to infer apis from kind/plural only) - let discovery = Discovery::new(client.as_kube_client()).run().await?; - let deployment_api = client.get_api::(&namespace); let deployment: Deployment = deployment_api.get("secret-operator-deployer").await?; + let kube_client = client.as_kube_client(); + // discovery (to be able to infer apis from kind/plural only) + let discovery = Discovery::new(kube_client.clone()).run().await?; + for entry in walkdir::WalkDir::new(&dir) { match entry { Ok(manifest_file) => { if manifest_file.file_type().is_file() { let path = manifest_file.path(); - tracing::info!("Applied manifest file: {}", path.display()); + tracing::info!("Reading manifest file: {}", path.display()); let yaml = std::fs::read_to_string(path) .with_context(|| format!("Failed to read {}", path.display()))?; for doc in multidoc_deserialize(&yaml)? { let obj: DynamicObject = serde_yaml::from_value(doc)?; let obj = maybe_copy_tolerations(&deployment, obj)?; - apply(obj, &client, &discovery).await? + apply(obj, &kube_client, &discovery, &namespace).await? } } } @@ -108,7 +110,12 @@ async fn main() -> Result<()> { Ok(()) } -async fn apply(obj: DynamicObject, client: &client::Client, discovery: &Discovery) -> Result<()> { +async fn apply( + obj: DynamicObject, + client: &kube::Client, + discovery: &Discovery, + namespace: &str, +) -> Result<()> { let ssapply = PatchParams::apply(APP_NAME).force(); let gvk = if let Some(tm) = &obj.types { GroupVersionKind::try_from(tm)? @@ -116,8 +123,8 @@ async fn apply(obj: DynamicObject, client: &client::Client, discovery: &Discover bail!("cannot apply object without valid TypeMeta {:?}", obj); }; let name = obj.name_any(); - if let Some((ar, _caps)) = discovery.resolve_gvk(&gvk) { - let api = dynamic_api(ar, client); + if let Some((ar, caps)) = discovery.resolve_gvk(&gvk) { + let api = dynamic_api(ar, caps, client.clone(), Some(namespace)); tracing::trace!("Applying {}: \n{}", gvk.kind, serde_yaml::to_string(&obj)?); let data: serde_json::Value = serde_json::to_value(&obj)?; let _r = api.patch(&name, &ssapply, &Patch::Apply(data)).await?; @@ -137,8 +144,19 @@ fn multidoc_deserialize(data: &str) -> Result> { Ok(docs) } -fn dynamic_api(ar: ApiResource, client: &client::Client) -> Api { - Api::default_namespaced_with(client.as_kube_client(), &ar) +fn dynamic_api( + ar: ApiResource, + caps: ApiCapabilities, + client: kube::Client, + ns: Option<&str>, +) -> Api { + if caps.scope == Scope::Cluster { + Api::all_with(client, &ar) + } else if let Some(namespace) = ns { + Api::namespaced_with(client, namespace, &ar) + } else { + Api::default_namespaced_with(client, &ar) + } } fn maybe_copy_tolerations(deployment: &Deployment, res: DynamicObject) -> Result { diff --git a/rust/olm-deployer/tests/manifests/csi-driver.yaml b/rust/olm-deployer/tests/manifests/csi-driver.yaml new file mode 100644 index 00000000..d155d400 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/csi-driver.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: secrets.stackable.tech + labels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + app.kubernetes.io/version: "24.11.0" +spec: + attachRequired: false + podInfoOnMount: true + fsGroupPolicy: File + volumeLifecycleModes: + - Ephemeral + - Persistent diff --git a/rust/olm-deployer/tests/manifests/daemonset.yaml b/rust/olm-deployer/tests/manifests/daemonset.yaml new file mode 100644 index 00000000..ba7537d5 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/daemonset.yaml @@ -0,0 +1,133 @@ +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: secret-operator-daemonset + labels: + app.kubernetes.io/instance: secret-operator + app.kubernetes.io/name: secret-operator + app.kubernetes.io/version: "24.11.0" + stackable.tech/vendor: Stackable +spec: + selector: + matchLabels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + template: + metadata: + labels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + spec: + serviceAccountName: secret-operator-serviceaccount + securityContext: {} + containers: + - name: secret-operator + securityContext: + privileged: true + runAsUser: 0 + image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + env: + - name: CSI_ENDPOINT + value: /csi/csi.sock + - name: NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + - name: PRIVILEGED + value: "true" + volumeMounts: + - name: csi + mountPath: /csi + - name: mountpoint + mountPath: /var/lib/kubelet/pods + mountPropagation: Bidirectional + - name: tmp + mountPath: /tmp + - name: external-provisioner + image: "quay.io/stackable/sig-storage/csi-provisioner@sha256:dd730457133f619d8759269abcfa79d7aeb817e01ba7af2d3aa1417df406ea56" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + args: + - --csi-address=/csi/csi.sock + - --feature-gates=Topology=true + - --extra-create-metadata + volumeMounts: + - name: csi + mountPath: /csi + - name: node-driver-registrar + image: "quay.io/stackable/sig-storage/csi-node-driver-registrar@sha256:8331d680e6c40c56909f436ea3126fdca39761cf87781cd2db8d05c9082b05f5" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + args: + - --csi-address=/csi/csi.sock + - --kubelet-registration-path=/var/lib/kubelet/plugins/secrets.stackable.tech/csi.sock + volumeMounts: + - name: registration-sock + mountPath: /registration + - name: csi + mountPath: /csi + initContainers: + - name: migrate-longer-csi-registration-path + image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + command: + - /bin/bash + - -euo + - pipefail + - -x + - -c + - | + ls -la /registration + echo "Removing old (long) CSI registration path" + if [ -d "/registration/secrets.stackable.tech-reg.sock" ]; then rmdir /registration/secrets.stackable.tech-reg.sock; fi + ls -la /registration + volumeMounts: + - name: registration-sock + mountPath: /registration + securityContext: + runAsUser: 0 + volumes: + - name: registration-sock + hostPath: + # node-driver-registrar appends a driver-unique filename to this path to avoid conflicts + # see https://github.com/stackabletech/secret-operator/issues/229 for why this path should not be too long + path: /var/lib/kubelet/plugins_registry + - name: csi + hostPath: + path: /var/lib/kubelet/plugins/secrets.stackable.tech/ + - name: mountpoint + hostPath: + path: /var/lib/kubelet/pods/ + - name: tmp + emptyDir: {} diff --git a/rust/olm-deployer/tests/manifests/migration-job.yaml b/rust/olm-deployer/tests/manifests/migration-job.yaml new file mode 100644 index 00000000..33599084 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/migration-job.yaml @@ -0,0 +1,53 @@ +--- +# Source: secret-operator/templates/secret_migration_job.yaml +# Migrates the TLS CA key pair from the hard-coded default namespace to the operator namespace +# See https://github.com/stackabletech/secret-operator/issues/453 +apiVersion: batch/v1 +kind: Job +metadata: + name: secret-operator-secret-migration + labels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + app.kubernetes.io/version: "24.11.0" +spec: + template: + metadata: + labels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + spec: + serviceAccountName: secret-operator-secret-migration-serviceaccount + securityContext: {} + containers: + - name: migrate-secret + image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" + imagePullPolicy: IfNotPresent + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 128Mi + command: ["bash", "-c"] + args: + - | + #!/bin/bash + set -euo pipefail + SOURCE_NAMESPACE=default + TARGET_NAMESPACE=$NAMESPACE + + # only continue if secret exists + if source_ca_secret="$(kubectl get secret -n $SOURCE_NAMESPACE secret-provisioner-tls-ca -o json)"; then + echo "secret exists in namespace $SOURCE_NAMESPACE" + # only continue if secret in target namespace does NOT exist + if ! kubectl get secret -n $TARGET_NAMESPACE secret-provisioner-tls-ca; then + echo "secret does not exist in namespace $TARGET_NAMESPACE" + # copy secret from default to default + echo "$source_ca_secret" | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' | kubectl apply -n $TARGET_NAMESPACE -f - + fi + fi + restartPolicy: Never diff --git a/rust/olm-deployer/tests/manifests/roles.yaml b/rust/olm-deployer/tests/manifests/roles.yaml new file mode 100644 index 00000000..1756bca2 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/roles.yaml @@ -0,0 +1,78 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: secret-operator-clusterrole + labels: + stackable.tech/vendor: Stackable +rules: + - apiGroups: + - "" + resources: + - secrets + - events + verbs: + - get + - list + - watch + - create + - patch + - update + - apiGroups: + - "" + resources: + - persistentvolumes + verbs: + - get + - list + - watch + - patch + - create + - delete + - apiGroups: + - "" + resources: + - nodes + - persistentvolumeclaims + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - csinodes + - storageclasses + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - patch + - apiGroups: + - secrets.stackable.tech + resources: + - secretclasses + verbs: + - get + - apiGroups: + - listeners.stackable.tech + resources: + - listenerclasses + - listeners + - podlisteners + verbs: + - get + - apiGroups: + - cert-manager.io + resources: + - certificates + verbs: + - get + - patch + - create diff --git a/rust/olm-deployer/tests/manifests/serviceaccount.yaml b/rust/olm-deployer/tests/manifests/serviceaccount.yaml new file mode 100644 index 00000000..919354c9 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/serviceaccount.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: secret-operator-serviceaccount + labels: + stackable.tech/vendor: Stackable +--- +apiVersion: rbac.authorization.k8s.io/v1 +# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace. +kind: ClusterRoleBinding +metadata: + name: secret-operator-clusterrolebinding + labels: + stackable.tech/vendor: Stackable +subjects: + - kind: ServiceAccount + name: secret-operator-serviceaccount + namespace: test # TODO: needs to be patched by the olm-deployer +roleRef: + kind: ClusterRole + name: secret-operator-clusterrole + apiGroup: rbac.authorization.k8s.io diff --git a/rust/olm-deployer/tests/manifests/storage-class.yaml b/rust/olm-deployer/tests/manifests/storage-class.yaml new file mode 100644 index 00000000..45eb1456 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/storage-class.yaml @@ -0,0 +1,6 @@ +--- +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: secrets.stackable.tech +provisioner: secrets.stackable.tech diff --git a/rust/olm-deployer/tests/manifests/tls.yaml b/rust/olm-deployer/tests/manifests/tls.yaml new file mode 100644 index 00000000..8d33f1fe --- /dev/null +++ b/rust/olm-deployer/tests/manifests/tls.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: secrets.stackable.tech/v1alpha1 +kind: SecretClass +metadata: + name: tls + labels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + app.kubernetes.io/version: "24.11.0" +spec: + backend: + autoTls: + ca: + secret: + name: secret-provisioner-tls-ca + namespace: "${NAMESPACE}" # TODO patch with olm-deployer + autoGenerate: true From 3a6978984fe8dd1f80fcc87ca521e71dd3c699d9 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:48:24 +0100 Subject: [PATCH 06/30] reorg test manifests --- .../manifests/{ => deployer}/csi-driver.yaml | 0 .../manifests/{ => deployer}/daemonset.yaml | 0 .../{ => deployer}/migration-job.yaml | 0 .../{ => deployer}/storage-class.yaml | 0 .../tests/manifests/{ => deployer}/tls.yaml | 0 .../tests/manifests/nginx/deployment.yaml | 21 +++++++++++++++++++ .../tests/manifests/{ => olm}/roles.yaml | 0 .../manifests/{ => olm}/serviceaccount.yaml | 0 8 files changed, 21 insertions(+) rename rust/olm-deployer/tests/manifests/{ => deployer}/csi-driver.yaml (100%) rename rust/olm-deployer/tests/manifests/{ => deployer}/daemonset.yaml (100%) rename rust/olm-deployer/tests/manifests/{ => deployer}/migration-job.yaml (100%) rename rust/olm-deployer/tests/manifests/{ => deployer}/storage-class.yaml (100%) rename rust/olm-deployer/tests/manifests/{ => deployer}/tls.yaml (100%) create mode 100644 rust/olm-deployer/tests/manifests/nginx/deployment.yaml rename rust/olm-deployer/tests/manifests/{ => olm}/roles.yaml (100%) rename rust/olm-deployer/tests/manifests/{ => olm}/serviceaccount.yaml (100%) diff --git a/rust/olm-deployer/tests/manifests/csi-driver.yaml b/rust/olm-deployer/tests/manifests/deployer/csi-driver.yaml similarity index 100% rename from rust/olm-deployer/tests/manifests/csi-driver.yaml rename to rust/olm-deployer/tests/manifests/deployer/csi-driver.yaml diff --git a/rust/olm-deployer/tests/manifests/daemonset.yaml b/rust/olm-deployer/tests/manifests/deployer/daemonset.yaml similarity index 100% rename from rust/olm-deployer/tests/manifests/daemonset.yaml rename to rust/olm-deployer/tests/manifests/deployer/daemonset.yaml diff --git a/rust/olm-deployer/tests/manifests/migration-job.yaml b/rust/olm-deployer/tests/manifests/deployer/migration-job.yaml similarity index 100% rename from rust/olm-deployer/tests/manifests/migration-job.yaml rename to rust/olm-deployer/tests/manifests/deployer/migration-job.yaml diff --git a/rust/olm-deployer/tests/manifests/storage-class.yaml b/rust/olm-deployer/tests/manifests/deployer/storage-class.yaml similarity index 100% rename from rust/olm-deployer/tests/manifests/storage-class.yaml rename to rust/olm-deployer/tests/manifests/deployer/storage-class.yaml diff --git a/rust/olm-deployer/tests/manifests/tls.yaml b/rust/olm-deployer/tests/manifests/deployer/tls.yaml similarity index 100% rename from rust/olm-deployer/tests/manifests/tls.yaml rename to rust/olm-deployer/tests/manifests/deployer/tls.yaml diff --git a/rust/olm-deployer/tests/manifests/nginx/deployment.yaml b/rust/olm-deployer/tests/manifests/nginx/deployment.yaml new file mode 100644 index 00000000..ae2d7515 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/nginx/deployment.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + labels: + app: nginx +spec: + replicas: 1 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 diff --git a/rust/olm-deployer/tests/manifests/roles.yaml b/rust/olm-deployer/tests/manifests/olm/roles.yaml similarity index 100% rename from rust/olm-deployer/tests/manifests/roles.yaml rename to rust/olm-deployer/tests/manifests/olm/roles.yaml diff --git a/rust/olm-deployer/tests/manifests/serviceaccount.yaml b/rust/olm-deployer/tests/manifests/olm/serviceaccount.yaml similarity index 100% rename from rust/olm-deployer/tests/manifests/serviceaccount.yaml rename to rust/olm-deployer/tests/manifests/olm/serviceaccount.yaml From 0893d20d719057dabfc3e00b7b1f2816ece4e81c Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:49:10 +0100 Subject: [PATCH 07/30] impl owner ref --- rust/olm-deployer/src/main.rs | 390 +++++++++++++++------------------- 1 file changed, 167 insertions(+), 223 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index c9eded7d..5e05e54c 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -1,29 +1,21 @@ -// TODO: -// -// - get the deployment object for the olm helper -// - get the env, tolerations, etc from the deployment -// - filter out the secret daemonset from the given manifest files -// - add env, tolerations, etc to the daemonset -use anyhow::{bail, Context, Result}; +use anyhow::{anyhow, bail, Context, Result}; use clap::{crate_description, crate_version, Parser}; use stackable_operator::cli::Command; use stackable_operator::client; -use stackable_operator::k8s_openapi::api::core::v1::Namespace; -use stackable_operator::kube::api::{Api, Patch, PatchParams, ResourceExt}; -use stackable_operator::kube::discovery::{ApiCapabilities, ApiResource, Discovery, Scope}; +use stackable_operator::kube::api::{Api, Patch, PatchParams, ResourceExt, TypeMeta}; +use stackable_operator::kube::discovery::{ApiResource, Discovery, Scope}; +use stackable_operator::k8s_openapi::api::rbac::v1::ClusterRole; +use stackable_operator::k8s_openapi::apimachinery::pkg::apis::meta::v1::OwnerReference; use stackable_operator::kube; use stackable_operator::kube::core::GroupVersionKind; use stackable_operator::logging; use stackable_operator::utils; use stackable_operator::utils::cluster_info::KubernetesClusterInfoOpts; use stackable_operator::{ - k8s_openapi::{ - api::{ - apps::v1::{DaemonSet, Deployment}, - core::v1::Toleration, - }, - Resource, + k8s_openapi::api::{ + apps::v1::{DaemonSet, Deployment}, + core::v1::Toleration, }, kube::api::DynamicObject, }; @@ -81,6 +73,9 @@ async fn main() -> Result<()> { let deployment_api = client.get_api::(&namespace); let deployment: Deployment = deployment_api.get("secret-operator-deployer").await?; + let cluster_role_api = client.get_all_api::(); + let cluster_role: ClusterRole = cluster_role_api.get("secret-operator-clusterrole").await?; + let kube_client = client.as_kube_client(); // discovery (to be able to infer apis from kind/plural only) let discovery = Discovery::new(kube_client.clone()).run().await?; @@ -89,14 +84,31 @@ async fn main() -> Result<()> { match entry { Ok(manifest_file) => { if manifest_file.file_type().is_file() { + // ---------- let path = manifest_file.path(); tracing::info!("Reading manifest file: {}", path.display()); let yaml = std::fs::read_to_string(path) .with_context(|| format!("Failed to read {}", path.display()))?; for doc in multidoc_deserialize(&yaml)? { let obj: DynamicObject = serde_yaml::from_value(doc)?; + // ---------- + let gvk = if let Some(tm) = &obj.types { + GroupVersionKind::try_from(tm)? + } else { + bail!("cannot apply object without valid TypeMeta {:?}", obj); + }; + let (ar, caps) = discovery + .resolve_gvk(&gvk) + .context(anyhow!("cannot resolve GVK {:?}", gvk))?; + let api = dynamic_api(ar, &caps.scope, kube_client.clone(), &namespace); + // ---------- patch object let obj = maybe_copy_tolerations(&deployment, obj)?; - apply(obj, &kube_client, &discovery, &namespace).await? + let obj = + maybe_update_owner(obj, &caps.scope, &deployment, &cluster_role)?; + // TODO: patch namespace where needed + // TODO: add env vars + // ---------- apply + apply(&api, obj, &gvk.kind).await? } } } @@ -110,28 +122,58 @@ async fn main() -> Result<()> { Ok(()) } -async fn apply( - obj: DynamicObject, - client: &kube::Client, - discovery: &Discovery, - namespace: &str, -) -> Result<()> { - let ssapply = PatchParams::apply(APP_NAME).force(); - let gvk = if let Some(tm) = &obj.types { - GroupVersionKind::try_from(tm)? - } else { - bail!("cannot apply object without valid TypeMeta {:?}", obj); +fn maybe_update_owner( + dynamic_object: DynamicObject, + scope: &Scope, + deployment: &Deployment, + cluster_role: &ClusterRole, +) -> Result { + // TODO: skip SecurityContextConstraints ? + let owner_ref = match scope { + Scope::Cluster => { + let tm = TypeMeta::resource::(); + OwnerReference { + name: cluster_role.name_any(), + uid: cluster_role.metadata.uid.clone().context(format!( + "ClusterRole [{}] has no uid", + cluster_role.name_any() + ))?, + kind: tm.kind, + api_version: tm.api_version, + ..OwnerReference::default() + } + } + Scope::Namespaced => { + let tm = TypeMeta::resource::(); + OwnerReference { + name: deployment.name_any(), + uid: deployment + .metadata + .uid + .clone() + .context(format!("Deployment [{}] has no uid", deployment.name_any()))?, + kind: tm.kind, + api_version: tm.api_version, + ..OwnerReference::default() + } + } }; - let name = obj.name_any(); - if let Some((ar, caps)) = discovery.resolve_gvk(&gvk) { - let api = dynamic_api(ar, caps, client.clone(), Some(namespace)); - tracing::trace!("Applying {}: \n{}", gvk.kind, serde_yaml::to_string(&obj)?); - let data: serde_json::Value = serde_json::to_value(&obj)?; - let _r = api.patch(&name, &ssapply, &Patch::Apply(data)).await?; - tracing::info!("applied {} {}", gvk.kind, name); - } else { - tracing::warn!("Cannot apply document for unknown {:?}", gvk); + + let mut ret = dynamic_object.clone(); + match ret.metadata.owner_references { + Some(ref mut ors) => ors.push(owner_ref), + None => ret.metadata.owner_references = Some(vec![owner_ref]), } + Ok(ret) +} + +async fn apply(api: &Api, obj: DynamicObject, kind: &str) -> Result<()> { + let name = obj.name_any(); + let ssapply = PatchParams::apply(APP_NAME).force(); + tracing::trace!("Applying {}: \n{}", kind, serde_yaml::to_string(&obj)?); + let data: serde_json::Value = serde_json::to_value(&obj)?; + let _r = api.patch(&name, &ssapply, &Patch::Apply(data)).await?; + tracing::info!("applied {} {}", kind, name); Ok(()) } @@ -146,16 +188,13 @@ fn multidoc_deserialize(data: &str) -> Result> { fn dynamic_api( ar: ApiResource, - caps: ApiCapabilities, + scope: &Scope, client: kube::Client, - ns: Option<&str>, + ns: &str, ) -> Api { - if caps.scope == Scope::Cluster { - Api::all_with(client, &ar) - } else if let Some(namespace) = ns { - Api::namespaced_with(client, namespace, &ar) - } else { - Api::default_namespaced_with(client, &ar) + match scope { + Scope::Cluster => Api::all_with(client, &ar), + _ => Api::namespaced_with(client, ns, &ar), } } @@ -198,198 +237,44 @@ mod test { use super::*; use anyhow::Result; use serde::Deserialize; - const DAEMONSET: &str = r#" + + use std::sync::LazyLock; + + static DAEMONSET: LazyLock = LazyLock::new(|| { + const STR_DAEMONSET: &str = r#" --- apiVersion: apps/v1 kind: DaemonSet metadata: name: secret-operator-daemonset - labels: - app.kubernetes.io/instance: secret-operator - app.kubernetes.io/name: secret-operator - app.kubernetes.io/version: "24.11.0" - stackable.tech/vendor: Stackable spec: - selector: - matchLabels: - app.kubernetes.io/name: secret-operator - app.kubernetes.io/instance: secret-operator - stackable.tech/vendor: Stackable template: - metadata: - labels: - app.kubernetes.io/name: secret-operator - app.kubernetes.io/instance: secret-operator - stackable.tech/vendor: Stackable spec: - serviceAccountName: secret-operator-serviceaccount - securityContext: {} containers: - name: secret-operator - securityContext: - privileged: true - runAsUser: 0 image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - env: - - name: CSI_ENDPOINT - value: /csi/csi.sock - - name: NODE_NAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: spec.nodeName - - name: PRIVILEGED - value: "true" - volumeMounts: - - name: csi - mountPath: /csi - - name: mountpoint - mountPath: /var/lib/kubelet/pods - mountPropagation: Bidirectional - - name: tmp - mountPath: /tmp - - name: external-provisioner - image: "quay.io/stackable/sig-storage/csi-provisioner@sha256:dd730457133f619d8759269abcfa79d7aeb817e01ba7af2d3aa1417df406ea56" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - args: - - --csi-address=/csi/csi.sock - - --feature-gates=Topology=true - - --extra-create-metadata - volumeMounts: - - name: csi - mountPath: /csi - - name: node-driver-registrar - image: "quay.io/stackable/sig-storage/csi-node-driver-registrar@sha256:8331d680e6c40c56909f436ea3126fdca39761cf87781cd2db8d05c9082b05f5" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - args: - - --csi-address=/csi/csi.sock - - --kubelet-registration-path=/var/lib/kubelet/plugins/secrets.stackable.tech/csi.sock - volumeMounts: - - name: registration-sock - mountPath: /registration - - name: csi - mountPath: /csi - initContainers: - - name: migrate-longer-csi-registration-path - image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - command: - - /bin/bash - - -euo - - pipefail - - -x - - -c - - | - ls -la /registration - echo "Removing old (long) CSI registration path" - if [ -d "/registration/secrets.stackable.tech-reg.sock" ]; then rmdir /registration/secrets.stackable.tech-reg.sock; fi - ls -la /registration - volumeMounts: - - name: registration-sock - mountPath: /registration - securityContext: - runAsUser: 0 - volumes: - - name: registration-sock - hostPath: - # node-driver-registrar appends a driver-unique filename to this path to avoid conflicts - # see https://github.com/stackabletech/secret-operator/issues/229 for why this path should not be too long - path: /var/lib/kubelet/plugins_registry - - name: csi - hostPath: - path: /var/lib/kubelet/plugins/secrets.stackable.tech/ - - name: mountpoint - hostPath: - path: /var/lib/kubelet/pods/ - - name: tmp - emptyDir: {} "#; - const DEPLOYMENT: &str = r#" + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DAEMONSET)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + static DEPLOYMENT: LazyLock = LazyLock::new(|| { + const STR_DEPLOYMENT: &str = r#" --- apiVersion: apps/v1 kind: Deployment metadata: name: secret-operator-deployer - labels: - app.kubernetes.io/name: secret-operator-deployer - app.kubernetes.io/instance: secret-operator-deployer - stackable.tech/vendor: Stackable + uid: d9287d0a-3069-47c3-8c90-b714dc6d1af5 spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - app.kubernetes.io/name: secret-operator-deployer - app.kubernetes.io/instance: secret-operator-deployer - stackable.tech/vendor: Stackable template: - metadata: - labels: - app.kubernetes.io/name: secret-operator-deployer - app.kubernetes.io/instance: secret-operator-deployer spec: - serviceAccountName: secret-operator-deployer - securityContext: {} containers: - name: secret-operator-deployer - securityContext: {} image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" - imagePullPolicy: IfNotPresent - command: ["/usr/bin/bash", "/manifests/deploy.sh"] - env: - - name: SOME_IMPORTANT_FEATURE_FLAG - value: "turn-it-on" - - name: OP_VERSION - value: '24.11.0' - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - resources: - limits: - cpu: 100m - memory: 512Mi - requests: - cpu: 100m - memory: 512Mi - volumeMounts: - - name: manifests - mountPath: /manifests - volumes: - - name: manifests - configMap: - name: secret-operator-deployer-manifests tolerations: - key: keep-out value: "yes" @@ -397,23 +282,82 @@ spec: effect: NoSchedule "#; - #[test] - fn test_copy_tolerations() -> Result<()> { - let data = serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(DEPLOYMENT))?; - //let do_deployment: DynamicObject = serde_yaml::from_value(data)?; - //let deployment: Deployment =do_deployment.try_parse()?; - let deployment: Deployment = serde_yaml::from_value(data)?; + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DEPLOYMENT)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); - let data = serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(DAEMONSET))?; - let daemonset: DynamicObject = serde_yaml::from_value(data)?; + static CLUSTER_ROLE: LazyLock = LazyLock::new(|| { + const STR_CLUSTER_ROLE: &str = r#" +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: secret-operator-clusterrole + uid: d9287d0a-3069-47c3-8c90-b714dc6dddaa +rules: + - apiGroups: + - "" + resources: + - secrets + - events + verbs: + - get + "#; + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_CLUSTER_ROLE)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); - let daemonset = maybe_copy_tolerations(&deployment, daemonset)?; + #[test] + fn test_copy_tolerations() -> Result<()> { + let daemonset = maybe_copy_tolerations(&DEPLOYMENT, DAEMONSET.clone())?; assert_eq!( daemonset_tolerations(&daemonset.try_parse::()?), - deployment_tolerations(&deployment) + deployment_tolerations(&DEPLOYMENT) ); + Ok(()) + } + + #[test] + fn test_namespaced_owner() -> Result<()> { + let daemonset = maybe_update_owner( + DAEMONSET.clone(), + &Scope::Namespaced, + &DEPLOYMENT, + &CLUSTER_ROLE, + )?; + + let expected = Some(vec![OwnerReference { + uid: "d9287d0a-3069-47c3-8c90-b714dc6d1af5".to_string(), + name: "secret-operator-deployer".to_string(), + kind: "Deployment".to_string(), + api_version: "apps/v1".to_string(), + ..OwnerReference::default() + }]); + assert_eq!(daemonset.metadata.owner_references, expected); + Ok(()) + } + + #[test] + fn test_cluster_owner() -> Result<()> { + let daemonset = maybe_update_owner( + DAEMONSET.clone(), + &Scope::Cluster, + &DEPLOYMENT, + &CLUSTER_ROLE, + )?; + let expected = Some(vec![OwnerReference { + uid: "d9287d0a-3069-47c3-8c90-b714dc6dddaa".to_string(), + name: "secret-operator-clusterrole".to_string(), + kind: "ClusterRole".to_string(), + api_version: "rbac.authorization.k8s.io/v1".to_string(), + ..OwnerReference::default() + }]); + assert_eq!(daemonset.metadata.owner_references, expected); Ok(()) } From e92acd347970b67816119242f24d0bb620ce1126 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:19:08 +0100 Subject: [PATCH 08/30] Added readme, update manifests, successful run --- rust/olm-deployer/README.md | 25 ++ .../manifests/deployer/migration-job.yaml | 10 +- .../deployer/secret_migration_rbac.yaml | 41 +++ .../manifests/deployer/storage-class.yaml | 2 + .../tests/manifests/nginx/deployment.yaml | 8 +- .../tests/manifests/olm/crds.yaml | 310 ++++++++++++++++++ 6 files changed, 393 insertions(+), 3 deletions(-) create mode 100644 rust/olm-deployer/README.md create mode 100644 rust/olm-deployer/tests/manifests/deployer/secret_migration_rbac.yaml create mode 100644 rust/olm-deployer/tests/manifests/olm/crds.yaml diff --git a/rust/olm-deployer/README.md b/rust/olm-deployer/README.md new file mode 100644 index 00000000..d60ab9ce --- /dev/null +++ b/rust/olm-deployer/README.md @@ -0,0 +1,25 @@ +# How to test + +## Prepare a test namespace + +This namespace is hard coded in the manifests created by olm. + + kubectl create ns test + +## Install the objects that OLM would install + + kubectl create -n test -f rust/olm-deployer/tests/manifests/nginx/deployment.yaml + + kubectl create -f rust/olm-deployer/tests/manifests/olm/crds.yaml + kubectl create -n test -f rust/olm-deployer/tests/manifests/olm/roles.yaml + kubectl create -n test -f rust/olm-deployer/tests/manifests/olm/serviceaccount.yaml + +## Finally run the olm-deployer + + cargo run -p olm-deployer run --dir rust/olm-deployer/tests/manifests/deployer --namespace test + +## Cleanup + + kubectl delete ns test + kubectl delete -f rust/olm-deployer/tests/manifests/olm/crds.yaml + kubectl delete -n test -f rust/olm-deployer/tests/manifests/olm/roles.yaml diff --git a/rust/olm-deployer/tests/manifests/deployer/migration-job.yaml b/rust/olm-deployer/tests/manifests/deployer/migration-job.yaml index 33599084..48030386 100644 --- a/rust/olm-deployer/tests/manifests/deployer/migration-job.yaml +++ b/rust/olm-deployer/tests/manifests/deployer/migration-job.yaml @@ -20,7 +20,6 @@ spec: stackable.tech/vendor: Stackable spec: serviceAccountName: secret-operator-secret-migration-serviceaccount - securityContext: {} containers: - name: migrate-secret image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" @@ -32,7 +31,9 @@ spec: requests: cpu: 100m memory: 128Mi - command: ["bash", "-c"] + command: + - bash + - -c args: - | #!/bin/bash @@ -50,4 +51,9 @@ spec: echo "$source_ca_secret" | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' | kubectl apply -n $TARGET_NAMESPACE -f - fi fi + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace restartPolicy: Never diff --git a/rust/olm-deployer/tests/manifests/deployer/secret_migration_rbac.yaml b/rust/olm-deployer/tests/manifests/deployer/secret_migration_rbac.yaml new file mode 100644 index 00000000..e0286f48 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/deployer/secret_migration_rbac.yaml @@ -0,0 +1,41 @@ +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: secret-operator-secret-migration-serviceaccount + labels: + stackable.tech/vendor: Stackable +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: secret-operator-secret-migration-clusterrolebinding + labels: + stackable.tech/vendor: Stackable +subjects: + - kind: ServiceAccount + name: secret-operator-secret-migration-serviceaccount + namespace: test +roleRef: + kind: ClusterRole + name: secret-operator-secret-migration-clusterrole + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: secret-operator-secret-migration-clusterrole + labels: + stackable.tech/vendor: Stackable +rules: + - apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - watch + - create + - patch + - update diff --git a/rust/olm-deployer/tests/manifests/deployer/storage-class.yaml b/rust/olm-deployer/tests/manifests/deployer/storage-class.yaml index 45eb1456..187fe9da 100644 --- a/rust/olm-deployer/tests/manifests/deployer/storage-class.yaml +++ b/rust/olm-deployer/tests/manifests/deployer/storage-class.yaml @@ -3,4 +3,6 @@ apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: secrets.stackable.tech + labels: + stackable.tech/vendor: Stackable provisioner: secrets.stackable.tech diff --git a/rust/olm-deployer/tests/manifests/nginx/deployment.yaml b/rust/olm-deployer/tests/manifests/nginx/deployment.yaml index ae2d7515..928b3834 100644 --- a/rust/olm-deployer/tests/manifests/nginx/deployment.yaml +++ b/rust/olm-deployer/tests/manifests/nginx/deployment.yaml @@ -1,7 +1,8 @@ +--- apiVersion: apps/v1 kind: Deployment metadata: - name: nginx-deployment + name: secret-operator-deployer labels: app: nginx spec: @@ -19,3 +20,8 @@ spec: image: nginx:1.14.2 ports: - containerPort: 80 + tolerations: + - key: keep-out + value: "yes" + operator: Equal + effect: NoSchedule diff --git a/rust/olm-deployer/tests/manifests/olm/crds.yaml b/rust/olm-deployer/tests/manifests/olm/crds.yaml new file mode 100644 index 00000000..e9957745 --- /dev/null +++ b/rust/olm-deployer/tests/manifests/olm/crds.yaml @@ -0,0 +1,310 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: secretclasses.secrets.stackable.tech + annotations: + helm.sh/resource-policy: keep +spec: + group: secrets.stackable.tech + names: + categories: [] + kind: SecretClass + plural: secretclasses + shortNames: [] + singular: secretclass + scope: Cluster + versions: + - additionalPrinterColumns: [] + name: v1alpha1 + schema: + openAPIV3Schema: + description: Auto-generated derived type for SecretClassSpec via `CustomResource` + properties: + spec: + description: A [SecretClass](https://docs.stackable.tech/home/nightly/secret-operator/secretclass) is a cluster-global Kubernetes resource that defines a category of secrets that the Secret Operator knows how to provision. + properties: + backend: + description: Each SecretClass is associated with a single [backend](https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend), which dictates the mechanism for issuing that kind of Secret. + oneOf: + - required: + - k8sSearch + - required: + - autoTls + - required: + - experimentalCertManager + - required: + - kerberosKeytab + properties: + autoTls: + description: |- + The [`autoTls` backend](https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend-autotls) issues a TLS certificate signed by the Secret Operator. The certificate authority can be provided by the administrator, or managed automatically by the Secret Operator. + + A new certificate and key pair will be generated and signed for each Pod, keys or certificates are never reused. + properties: + ca: + description: Configures the certificate authority used to issue Pod certificates. + properties: + autoGenerate: + default: false + description: Whether the certificate authority should be managed by Secret Operator, including being generated if it does not already exist. + type: boolean + caCertificateLifetime: + default: 365d + description: |- + The lifetime of each generated certificate authority. + + Should always be more than double `maxCertificateLifetime`. + + If `autoGenerate: true` then the Secret Operator will prepare a new CA certificate the old CA approaches expiration. If `autoGenerate: false` then the Secret Operator will log a warning instead. + type: string + keyGeneration: + default: + rsa: + length: 2048 + description: The algorithm used to generate a key pair and required configuration settings. Currently only RSA and a key length of 2048, 3072 or 4096 bits can be configured. + oneOf: + - required: + - rsa + properties: + rsa: + properties: + length: + description: The amount of bits used for generating the RSA keypair. Currently, `2048`, `3072` and `4096` are supported. Defaults to `2048` bits. + enum: + - 2048 + - 3072 + - 4096 + type: integer + required: + - length + type: object + type: object + secret: + description: Reference (name and namespace) to a Kubernetes Secret object where the CA certificate and key is stored in the keys `ca.crt` and `ca.key` respectively. + properties: + name: + description: Name of the Secret being referred to. + type: string + namespace: + description: Namespace of the Secret being referred to. + type: string + required: + - name + - namespace + type: object + required: + - secret + type: object + maxCertificateLifetime: + default: 15d + description: Maximum lifetime the created certificates are allowed to have. In case consumers request a longer lifetime than allowed by this setting, the lifetime will be the minimum of both, so this setting takes precedence. The default value is 15 days. + type: string + required: + - ca + type: object + experimentalCertManager: + description: |- + The [`experimentalCertManager` backend][1] injects a TLS certificate issued by [cert-manager](https://cert-manager.io/). + + A new certificate will be requested the first time it is used by a Pod, it will be reused after that (subject to cert-manager renewal rules). + + [1]: https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend-certmanager + properties: + defaultCertificateLifetime: + default: 1d + description: |- + The default lifetime of certificates. + + Defaults to 1 day. This may need to be increased for external issuers that impose rate limits (such as Let's Encrypt). + type: string + issuer: + description: A reference to the cert-manager issuer that the certificates should be requested from. + properties: + kind: + description: |- + The kind of the issuer, Issuer or ClusterIssuer. + + If Issuer then it must be in the same namespace as the Pods using it. + enum: + - Issuer + - ClusterIssuer + type: string + name: + description: The name of the issuer. + type: string + required: + - kind + - name + type: object + keyGeneration: + default: + rsa: + length: 2048 + description: The algorithm used to generate a key pair and required configuration settings. Currently only RSA and a key length of 2048, 3072 or 4096 bits can be configured. + oneOf: + - required: + - rsa + properties: + rsa: + properties: + length: + description: The amount of bits used for generating the RSA keypair. Currently, `2048`, `3072` and `4096` are supported. Defaults to `2048` bits. + enum: + - 2048 + - 3072 + - 4096 + type: integer + required: + - length + type: object + type: object + required: + - issuer + type: object + k8sSearch: + description: The [`k8sSearch` backend](https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend-k8ssearch) can be used to mount Secrets across namespaces into Pods. + properties: + searchNamespace: + description: Configures the namespace searched for Secret objects. + oneOf: + - required: + - pod + - required: + - name + properties: + name: + description: The Secret objects are located in a single global namespace. Should be used for secrets that are provisioned by the cluster administrator. + type: string + pod: + description: The Secret objects are located in the same namespace as the Pod object. Should be used for Secrets that are provisioned by the application administrator. + type: object + type: object + required: + - searchNamespace + type: object + kerberosKeytab: + description: The [`kerberosKeytab` backend](https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend-kerberoskeytab) creates a Kerberos keytab file for a selected realm. The Kerberos KDC and administrator credentials must be provided by the administrator. + properties: + admin: + description: Kerberos admin configuration settings. + oneOf: + - required: + - mit + - required: + - activeDirectory + properties: + activeDirectory: + description: Credentials should be provisioned in a Microsoft Active Directory domain. + properties: + experimentalGenerateSamAccountName: + description: Allows samAccountName generation for new accounts to be customized. Note that setting this field (even if empty) makes the Secret Operator take over the generation duty from the domain controller. + nullable: true + properties: + prefix: + default: '' + description: A prefix to be prepended to generated samAccountNames. + type: string + totalLength: + default: 20 + description: |- + The total length of generated samAccountNames, _including_ `prefix`. Must be larger than the length of `prefix`, but at most `20`. + + Note that this should be as large as possible, to minimize the risk of collisions. + format: uint8 + minimum: 0.0 + type: integer + type: object + ldapServer: + description: An AD LDAP server, such as the AD Domain Controller. This must match the server’s FQDN, or GSSAPI authentication will fail. + type: string + ldapTlsCaSecret: + description: Reference (name and namespace) to a Kubernetes Secret object containing the TLS CA (in `ca.crt`) that the LDAP server’s certificate should be authenticated against. + properties: + name: + description: Name of the Secret being referred to. + type: string + namespace: + description: Namespace of the Secret being referred to. + type: string + required: + - name + - namespace + type: object + passwordCacheSecret: + description: Reference (name and namespace) to a Kubernetes Secret object where workload passwords will be stored. This must not be accessible to end users. + properties: + name: + description: Name of the Secret being referred to. + type: string + namespace: + description: Namespace of the Secret being referred to. + type: string + required: + - name + - namespace + type: object + schemaDistinguishedName: + description: The root Distinguished Name (DN) for AD-managed schemas, typically `CN=Schema,CN=Configuration,{domain_dn}`. + type: string + userDistinguishedName: + description: The root Distinguished Name (DN) where service accounts should be provisioned, typically `CN=Users,{domain_dn}`. + type: string + required: + - ldapServer + - ldapTlsCaSecret + - passwordCacheSecret + - schemaDistinguishedName + - userDistinguishedName + type: object + mit: + description: Credentials should be provisioned in a MIT Kerberos Admin Server. + properties: + kadminServer: + description: The hostname of the Kerberos Admin Server. This should be provided by the Kerberos administrator. + type: string + required: + - kadminServer + type: object + type: object + adminKeytabSecret: + description: Reference (`name` and `namespace`) to a K8s Secret object where a keytab with administrative privileges is stored in the key `keytab`. + properties: + name: + description: Name of the Secret being referred to. + type: string + namespace: + description: Namespace of the Secret being referred to. + type: string + required: + - name + - namespace + type: object + adminPrincipal: + description: The admin principal. + type: string + kdc: + description: The hostname of the Kerberos Key Distribution Center (KDC). This should be provided by the Kerberos administrator. + type: string + realmName: + description: The name of the Kerberos realm. This should be provided by the Kerberos administrator. + pattern: ^[-.a-zA-Z0-9]+$ + type: string + required: + - admin + - adminKeytabSecret + - adminPrincipal + - kdc + - realmName + type: object + type: object + required: + - backend + type: object + required: + - spec + title: SecretClass + type: object + served: true + storage: true + subresources: {} From 772987840040e66465afc4cf8c0e9b6d92f36516 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:02:35 +0100 Subject: [PATCH 09/30] reorg modules --- rust/olm-deployer/src/main.rs | 242 ++--------------------- rust/olm-deployer/src/owner/mod.rs | 153 ++++++++++++++ rust/olm-deployer/src/tolerations/mod.rs | 116 +++++++++++ 3 files changed, 283 insertions(+), 228 deletions(-) create mode 100644 rust/olm-deployer/src/owner/mod.rs create mode 100644 rust/olm-deployer/src/tolerations/mod.rs diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 5e05e54c..49faac8a 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -1,24 +1,20 @@ +mod owner; +mod tolerations; + use anyhow::{anyhow, bail, Context, Result}; use clap::{crate_description, crate_version, Parser}; use stackable_operator::cli::Command; use stackable_operator::client; -use stackable_operator::kube::api::{Api, Patch, PatchParams, ResourceExt, TypeMeta}; +use stackable_operator::kube::api::{Api, Patch, PatchParams, ResourceExt}; use stackable_operator::kube::discovery::{ApiResource, Discovery, Scope}; use stackable_operator::k8s_openapi::api::rbac::v1::ClusterRole; -use stackable_operator::k8s_openapi::apimachinery::pkg::apis::meta::v1::OwnerReference; use stackable_operator::kube; use stackable_operator::kube::core::GroupVersionKind; use stackable_operator::logging; use stackable_operator::utils; use stackable_operator::utils::cluster_info::KubernetesClusterInfoOpts; -use stackable_operator::{ - k8s_openapi::api::{ - apps::v1::{DaemonSet, Deployment}, - core::v1::Toleration, - }, - kube::api::DynamicObject, -}; +use stackable_operator::{k8s_openapi::api::apps::v1::Deployment, kube::api::DynamicObject}; pub const APP_NAME: &str = "stkbl-secret-olm-deployer"; pub const ENV_VAR_LOGGING: &str = "STKBL_SECRET_OLM_DEPLOYER_LOG"; @@ -100,13 +96,19 @@ async fn main() -> Result<()> { let (ar, caps) = discovery .resolve_gvk(&gvk) .context(anyhow!("cannot resolve GVK {:?}", gvk))?; + let api = dynamic_api(ar, &caps.scope, kube_client.clone(), &namespace); // ---------- patch object - let obj = maybe_copy_tolerations(&deployment, obj)?; - let obj = - maybe_update_owner(obj, &caps.scope, &deployment, &cluster_role)?; + let obj = tolerations::maybe_copy_tolerations(&deployment, obj)?; + let obj = owner::maybe_update_owner( + obj, + &caps.scope, + &deployment, + &cluster_role, + )?; // TODO: patch namespace where needed // TODO: add env vars + // TODO: patch resources // ---------- apply apply(&api, obj, &gvk.kind).await? } @@ -122,51 +124,6 @@ async fn main() -> Result<()> { Ok(()) } -fn maybe_update_owner( - dynamic_object: DynamicObject, - scope: &Scope, - deployment: &Deployment, - cluster_role: &ClusterRole, -) -> Result { - // TODO: skip SecurityContextConstraints ? - let owner_ref = match scope { - Scope::Cluster => { - let tm = TypeMeta::resource::(); - OwnerReference { - name: cluster_role.name_any(), - uid: cluster_role.metadata.uid.clone().context(format!( - "ClusterRole [{}] has no uid", - cluster_role.name_any() - ))?, - kind: tm.kind, - api_version: tm.api_version, - ..OwnerReference::default() - } - } - Scope::Namespaced => { - let tm = TypeMeta::resource::(); - OwnerReference { - name: deployment.name_any(), - uid: deployment - .metadata - .uid - .clone() - .context(format!("Deployment [{}] has no uid", deployment.name_any()))?, - kind: tm.kind, - api_version: tm.api_version, - ..OwnerReference::default() - } - } - }; - - let mut ret = dynamic_object.clone(); - match ret.metadata.owner_references { - Some(ref mut ors) => ors.push(owner_ref), - None => ret.metadata.owner_references = Some(vec![owner_ref]), - } - Ok(ret) -} - async fn apply(api: &Api, obj: DynamicObject, kind: &str) -> Result<()> { let name = obj.name_any(); let ssapply = PatchParams::apply(APP_NAME).force(); @@ -197,174 +154,3 @@ fn dynamic_api( _ => Api::namespaced_with(client, ns, &ar), } } - -fn maybe_copy_tolerations(deployment: &Deployment, res: DynamicObject) -> Result { - let ds: Result = res.clone().try_parse(); - match ds { - Ok(mut daemonset) => { - if let Some(dts) = deployment_tolerations(deployment) { - if let Some(pod_spec) = daemonset - .spec - .as_mut() - .and_then(|s| s.template.spec.as_mut()) - { - match pod_spec.tolerations.as_mut() { - Some(ta) => ta.extend(dts.clone()), - _ => pod_spec.tolerations = Some(dts.clone()), - } - } - } - - // TODO: halp!! change this to a proper conversion. - let ret: DynamicObject = serde_yaml::from_str(&serde_yaml::to_string(&daemonset)?)?; - - Ok(ret) - } - _ => Ok(res), - } -} - -fn deployment_tolerations(deployment: &Deployment) -> Option<&Vec> { - deployment - .spec - .as_ref() - .and_then(|s| s.template.spec.as_ref()) - .and_then(|ps| ps.tolerations.as_ref()) -} - -#[cfg(test)] -mod test { - use super::*; - use anyhow::Result; - use serde::Deserialize; - - use std::sync::LazyLock; - - static DAEMONSET: LazyLock = LazyLock::new(|| { - const STR_DAEMONSET: &str = r#" ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: secret-operator-daemonset -spec: - template: - spec: - containers: - - name: secret-operator - image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" -"#; - - let data = - serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DAEMONSET)) - .unwrap(); - serde_yaml::from_value(data).unwrap() - }); - - static DEPLOYMENT: LazyLock = LazyLock::new(|| { - const STR_DEPLOYMENT: &str = r#" ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: secret-operator-deployer - uid: d9287d0a-3069-47c3-8c90-b714dc6d1af5 -spec: - template: - spec: - containers: - - name: secret-operator-deployer - image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" - tolerations: - - key: keep-out - value: "yes" - operator: Equal - effect: NoSchedule - "#; - - let data = - serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DEPLOYMENT)) - .unwrap(); - serde_yaml::from_value(data).unwrap() - }); - - static CLUSTER_ROLE: LazyLock = LazyLock::new(|| { - const STR_CLUSTER_ROLE: &str = r#" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: secret-operator-clusterrole - uid: d9287d0a-3069-47c3-8c90-b714dc6dddaa -rules: - - apiGroups: - - "" - resources: - - secrets - - events - verbs: - - get - "#; - let data = - serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_CLUSTER_ROLE)) - .unwrap(); - serde_yaml::from_value(data).unwrap() - }); - - #[test] - fn test_copy_tolerations() -> Result<()> { - let daemonset = maybe_copy_tolerations(&DEPLOYMENT, DAEMONSET.clone())?; - - assert_eq!( - daemonset_tolerations(&daemonset.try_parse::()?), - deployment_tolerations(&DEPLOYMENT) - ); - Ok(()) - } - - #[test] - fn test_namespaced_owner() -> Result<()> { - let daemonset = maybe_update_owner( - DAEMONSET.clone(), - &Scope::Namespaced, - &DEPLOYMENT, - &CLUSTER_ROLE, - )?; - - let expected = Some(vec![OwnerReference { - uid: "d9287d0a-3069-47c3-8c90-b714dc6d1af5".to_string(), - name: "secret-operator-deployer".to_string(), - kind: "Deployment".to_string(), - api_version: "apps/v1".to_string(), - ..OwnerReference::default() - }]); - assert_eq!(daemonset.metadata.owner_references, expected); - Ok(()) - } - - #[test] - fn test_cluster_owner() -> Result<()> { - let daemonset = maybe_update_owner( - DAEMONSET.clone(), - &Scope::Cluster, - &DEPLOYMENT, - &CLUSTER_ROLE, - )?; - - let expected = Some(vec![OwnerReference { - uid: "d9287d0a-3069-47c3-8c90-b714dc6dddaa".to_string(), - name: "secret-operator-clusterrole".to_string(), - kind: "ClusterRole".to_string(), - api_version: "rbac.authorization.k8s.io/v1".to_string(), - ..OwnerReference::default() - }]); - assert_eq!(daemonset.metadata.owner_references, expected); - Ok(()) - } - - fn daemonset_tolerations(res: &DaemonSet) -> Option<&Vec> { - res.spec - .as_ref() - .and_then(|s| s.template.spec.as_ref()) - .and_then(|ps| ps.tolerations.as_ref()) - } -} diff --git a/rust/olm-deployer/src/owner/mod.rs b/rust/olm-deployer/src/owner/mod.rs new file mode 100644 index 00000000..ba0c85df --- /dev/null +++ b/rust/olm-deployer/src/owner/mod.rs @@ -0,0 +1,153 @@ +use anyhow::{Context, Result}; +use stackable_operator::k8s_openapi::api::apps::v1::Deployment; +use stackable_operator::k8s_openapi::api::rbac::v1::ClusterRole; +use stackable_operator::kube::api::DynamicObject; +use stackable_operator::kube::api::ResourceExt; +use stackable_operator::kube::discovery::Scope; +use stackable_operator::kube::Resource; + +pub fn maybe_update_owner( + dynamic_object: DynamicObject, + scope: &Scope, + deployment: &Deployment, + cluster_role: &ClusterRole, +) -> Result { + // TODO: skip SecurityContextConstraints ? + let owner_ref = match scope { + Scope::Cluster => cluster_role.owner_ref(&()).context(format!( + "Cannot make owner ref from ClusterRole [{}]", + cluster_role.name_any() + ))?, + Scope::Namespaced => deployment.owner_ref(&()).context(format!( + "Cannot make owner ref from Deployment [{}]", + deployment.name_any() + ))?, + }; + + let mut ret = dynamic_object.clone(); + match ret.metadata.owner_references { + Some(ref mut ors) => ors.push(owner_ref), + None => ret.metadata.owner_references = Some(vec![owner_ref]), + } + Ok(ret) +} + +#[cfg(test)] +mod test { + use super::*; + use anyhow::Result; + use serde::Deserialize; + use stackable_operator::k8s_openapi::apimachinery::pkg::apis::meta::v1::OwnerReference; + + use std::sync::LazyLock; + + static DAEMONSET: LazyLock = LazyLock::new(|| { + const STR_DAEMONSET: &str = r#" +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: secret-operator-daemonset +spec: + template: + spec: + containers: + - name: secret-operator + image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" +"#; + + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DAEMONSET)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + static DEPLOYMENT: LazyLock = LazyLock::new(|| { + const STR_DEPLOYMENT: &str = r#" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: secret-operator-deployer + uid: d9287d0a-3069-47c3-8c90-b714dc6d1af5 +spec: + template: + spec: + containers: + - name: secret-operator-deployer + image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" + tolerations: + - key: keep-out + value: "yes" + operator: Equal + effect: NoSchedule + "#; + + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DEPLOYMENT)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + static CLUSTER_ROLE: LazyLock = LazyLock::new(|| { + const STR_CLUSTER_ROLE: &str = r#" +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: secret-operator-clusterrole + uid: d9287d0a-3069-47c3-8c90-b714dc6dddaa +rules: + - apiGroups: + - "" + resources: + - secrets + - events + verbs: + - get + "#; + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_CLUSTER_ROLE)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + #[test] + fn test_namespaced_owner() -> Result<()> { + let daemonset = maybe_update_owner( + DAEMONSET.clone(), + &Scope::Namespaced, + &DEPLOYMENT, + &CLUSTER_ROLE, + )?; + + let expected = Some(vec![OwnerReference { + uid: "d9287d0a-3069-47c3-8c90-b714dc6d1af5".to_string(), + name: "secret-operator-deployer".to_string(), + kind: "Deployment".to_string(), + api_version: "apps/v1".to_string(), + ..OwnerReference::default() + }]); + assert_eq!(daemonset.metadata.owner_references, expected); + Ok(()) + } + + #[test] + fn test_cluster_owner() -> Result<()> { + let daemonset = maybe_update_owner( + DAEMONSET.clone(), + &Scope::Cluster, + &DEPLOYMENT, + &CLUSTER_ROLE, + )?; + + let expected = Some(vec![OwnerReference { + uid: "d9287d0a-3069-47c3-8c90-b714dc6dddaa".to_string(), + name: "secret-operator-clusterrole".to_string(), + kind: "ClusterRole".to_string(), + api_version: "rbac.authorization.k8s.io/v1".to_string(), + ..OwnerReference::default() + }]); + assert_eq!(daemonset.metadata.owner_references, expected); + Ok(()) + } +} diff --git a/rust/olm-deployer/src/tolerations/mod.rs b/rust/olm-deployer/src/tolerations/mod.rs new file mode 100644 index 00000000..528b8f20 --- /dev/null +++ b/rust/olm-deployer/src/tolerations/mod.rs @@ -0,0 +1,116 @@ +use stackable_operator::k8s_openapi::api::apps::v1::{DaemonSet, Deployment}; +use stackable_operator::k8s_openapi::api::core::v1::Toleration; +use stackable_operator::kube::api::DynamicObject; + +pub(super) fn maybe_copy_tolerations( + deployment: &Deployment, + res: DynamicObject, +) -> anyhow::Result { + let ds: anyhow::Result = res.clone().try_parse(); + match ds { + Ok(mut daemonset) => { + if let Some(dts) = deployment_tolerations(deployment) { + if let Some(pod_spec) = daemonset + .spec + .as_mut() + .and_then(|s| s.template.spec.as_mut()) + { + match pod_spec.tolerations.as_mut() { + Some(ta) => ta.extend(dts.clone()), + _ => pod_spec.tolerations = Some(dts.clone()), + } + } + } + + // TODO: halp!! change this to a proper conversion. + let ret: DynamicObject = serde_yaml::from_str(&serde_yaml::to_string(&daemonset)?)?; + + Ok(ret) + } + _ => Ok(res), + } +} + +fn deployment_tolerations(deployment: &Deployment) -> Option<&Vec> { + deployment + .spec + .as_ref() + .and_then(|s| s.template.spec.as_ref()) + .and_then(|ps| ps.tolerations.as_ref()) +} + +#[cfg(test)] +mod test { + use super::*; + use anyhow::Result; + use serde::Deserialize; + + use crate::tolerations::{deployment_tolerations, maybe_copy_tolerations}; + use std::sync::LazyLock; + + static DAEMONSET: LazyLock = LazyLock::new(|| { + const STR_DAEMONSET: &str = r#" +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: secret-operator-daemonset +spec: + template: + spec: + containers: + - name: secret-operator + image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" +"#; + + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DAEMONSET)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + static DEPLOYMENT: LazyLock = LazyLock::new(|| { + const STR_DEPLOYMENT: &str = r#" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: secret-operator-deployer + uid: d9287d0a-3069-47c3-8c90-b714dc6d1af5 +spec: + template: + spec: + containers: + - name: secret-operator-deployer + image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" + tolerations: + - key: keep-out + value: "yes" + operator: Equal + effect: NoSchedule + "#; + + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DEPLOYMENT)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + #[test] + fn test_copy_tolerations() -> Result<()> { + let daemonset = maybe_copy_tolerations(&DEPLOYMENT, DAEMONSET.clone())?; + + assert_eq!( + daemonset_tolerations(&daemonset.try_parse::()?), + deployment_tolerations(&DEPLOYMENT) + ); + Ok(()) + } + + fn daemonset_tolerations(res: &DaemonSet) -> Option<&Vec> { + res.spec + .as_ref() + .and_then(|s| s.template.spec.as_ref()) + .and_then(|ps| ps.tolerations.as_ref()) + } +} From e7a156cc5051b8c70e42b28313071694e224542c Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Mon, 13 Jan 2025 18:45:53 +0100 Subject: [PATCH 10/30] wip --- Cargo.lock | 265 ++++++++++++------------- rust/olm-deployer/src/env/mod.rs | 49 +++++ rust/olm-deployer/src/main.rs | 3 + rust/olm-deployer/src/namespace/mod.rs | 5 + rust/olm-deployer/src/owner/mod.rs | 26 ++- 5 files changed, 195 insertions(+), 153 deletions(-) create mode 100644 rust/olm-deployer/src/env/mod.rs create mode 100644 rust/olm-deployer/src/namespace/mod.rs diff --git a/Cargo.lock b/Cargo.lock index b8c5e842..b64748be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -101,11 +101,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -146,7 +147,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -157,7 +158,7 @@ checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -259,45 +260,42 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bindgen" -version = "0.69.5" +version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cexpr", "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", + "itertools", "log", "prettyplease", "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", - "syn 2.0.95", - "which", + "syn 2.0.96", ] [[package]] name = "bindgen" -version = "0.70.1" +version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cexpr", "clang-sys", - "itertools 0.13.0", + "itertools", "log", "prettyplease", "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 2.1.0", "shlex", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -323,9 +321,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" [[package]] name = "block-buffer" @@ -384,9 +382,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.7" +version = "1.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" +checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" dependencies = [ "jobserver", "libc", @@ -444,9 +442,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.24" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9560b07a799281c7e0958b9296854d6fafd4c5f31444a7e5bb1ad6dde5ccf1bd" +checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" dependencies = [ "clap_builder", "clap_derive", @@ -454,9 +452,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.24" +version = "4.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874e0dd3eb68bf99058751ac9712f622e61e6f393a94f7128fa26e3f02f5c7cd" +checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" dependencies = [ "anstream", "anstyle", @@ -473,7 +471,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -559,9 +557,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96ea465841101b566a7d00627150a42762c4e9497ca4941856d93e1f8d7691ba" dependencies = [ "anyhow", - "bitflags 2.6.0", + "bitflags 2.7.0", "bytes", - "libgssapi 0.8.1", + "libgssapi 0.8.2", "windows", ] @@ -611,7 +609,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -622,7 +620,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -633,7 +631,7 @@ checksum = "bc2323e10c92e1cf4d86e11538512e6dc03ceb586842970b6332af3d4046a046" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -673,7 +671,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -711,7 +709,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -755,7 +753,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -919,7 +917,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -986,7 +984,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "libc", "libgit2-sys", "log", @@ -1370,7 +1368,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1451,15 +1449,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -1497,9 +1486,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -1652,7 +1641,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -1689,12 +1678,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "lber" version = "0.4.2" @@ -1755,7 +1738,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8663f3a3a93dd394b669dd9b213b457c5e0d2bc5a1b13a0950bd733c6fb6e37" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "bytes", "lazy_static", "libgssapi-sys", @@ -1763,11 +1746,11 @@ dependencies = [ [[package]] name = "libgssapi" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7fb6c6c20f2c535a7d02bf6bcc0a5955878f4966805b47c31f9831ab88fd55" +checksum = "03365f6a6b3d4fddca9d442de420e16f0640bc869703eae329009a16cfc34a20" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "bytes", "lazy_static", "libgssapi-sys", @@ -1775,11 +1758,11 @@ dependencies = [ [[package]] name = "libgssapi-sys" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fa96e2c0ea19e1a2c21d8983a2bf1162818973411d87749c8f81c83ac76155" +checksum = "7518e6902e94f92e7c7271232684b60988b4bd813529b4ef9d97aead96956ae8" dependencies = [ - "bindgen 0.69.5", + "bindgen 0.71.1", "pkg-config", ] @@ -1991,7 +1974,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "cfg-if", "foreign-types", "libc", @@ -2008,7 +1991,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2180,7 +2163,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror 2.0.9", + "thiserror 2.0.11", "ucd-trie", ] @@ -2204,7 +2187,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2245,7 +2228,7 @@ checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2283,19 +2266,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.27" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483f8c21f64f3ea09fe0f30f5d48c3e8eefe5dac9129f0075f76593b4c1da705" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -2333,7 +2316,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" dependencies = [ "heck", - "itertools 0.13.0", + "itertools", "log", "multimap", "once_cell", @@ -2342,7 +2325,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.95", + "syn 2.0.96", "tempfile", ] @@ -2353,10 +2336,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2422,7 +2405,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", ] [[package]] @@ -2496,13 +2479,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "rustix" version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "errno", "libc", "linux-raw-sys", @@ -2511,9 +2500,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "log", "once_cell", @@ -2627,7 +2616,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2651,7 +2640,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -2664,7 +2653,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -2714,7 +2703,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2725,7 +2714,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2822,7 +2811,7 @@ checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2864,7 +2853,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -2956,7 +2945,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3043,7 +3032,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3065,9 +3054,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.95" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -3088,7 +3077,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3097,7 +3086,7 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6acb8bb63826062d5a44b68298cf2e25b84bc151bc0c31c35a83b61f818682a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.7.0", "libc", "smart-default", "thiserror 1.0.69", @@ -3129,11 +3118,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.9", + "thiserror-impl 2.0.11", ] [[package]] @@ -3144,18 +3133,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] name = "thiserror-impl" -version = "2.0.9" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3233,9 +3222,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -3251,13 +3240,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3346,7 +3335,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3406,7 +3395,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ "base64 0.22.1", - "bitflags 2.6.0", + "bitflags 2.7.0", "bytes", "http", "http-body", @@ -3461,7 +3450,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3608,9 +3597,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "b913a3b5fe84142e269d63cc62b64319ccaf89b748fc31fe025177f767a756c4" dependencies = [ "getrandom", ] @@ -3660,34 +3649,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3695,22 +3685,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-time" @@ -3722,18 +3715,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "winapi" version = "0.3.9" @@ -3805,7 +3786,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3816,7 +3797,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -3964,7 +3945,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", "synstructure", ] @@ -3986,7 +3967,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] [[package]] @@ -4006,7 +3987,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", "synstructure", ] @@ -4035,5 +4016,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.95", + "syn 2.0.96", ] diff --git a/rust/olm-deployer/src/env/mod.rs b/rust/olm-deployer/src/env/mod.rs new file mode 100644 index 00000000..0c93242c --- /dev/null +++ b/rust/olm-deployer/src/env/mod.rs @@ -0,0 +1,49 @@ +use stackable_operator::k8s_openapi::api::apps::v1::{DaemonSet, Deployment}; +use stackable_operator::k8s_openapi::api::core::v1::EnvVar; +use stackable_operator::kube::api::DynamicObject; + +pub(super) fn maybe_copy_env( + deployment: &Deployment, + res: DynamicObject, +) -> anyhow::Result { + let ds: anyhow::Result = res.clone().try_parse(); + match ds { + Ok(mut daemonset) => { + if let Some(ps) = daemonset + .spec + .as_mut() + .and_then(|s| s.template.spec.as_mut()) + { + for c in ps.containers.iter_mut() { + if c.name == "secret-operator" { + let d_env = deployment_env_var(deployment); + match c.env.as_mut() { + Some(c_env) => c_env.extend(d_env.into_iter()), + _ => c.env = Some(d_env), + } + } + } + } + + // TODO: halp!! change this to a proper conversion. + let ret: DynamicObject = serde_yaml::from_str(&serde_yaml::to_string(&daemonset)?)?; + + Ok(ret) + } + _ => Ok(res), + } +} + +fn deployment_env_var(deployment: &Deployment) -> Vec { + deployment + .spec + .as_ref() + .and_then(|ds| ds.template.spec.as_ref()) + .map(|ts| ts.containers.iter()) + .into_iter() + .flatten() + .filter(|c| c.name == "secret-operator-deployer") + .last() + .and_then(|c| c.env.clone()) + .unwrap_or_default() +} diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 49faac8a..19015910 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -1,3 +1,5 @@ +mod env; +mod namespace; mod owner; mod tolerations; @@ -108,6 +110,7 @@ async fn main() -> Result<()> { )?; // TODO: patch namespace where needed // TODO: add env vars + let obj = env::maybe_copy_env(&deployment, obj)?; // TODO: patch resources // ---------- apply apply(&api, obj, &gvk.kind).await? diff --git a/rust/olm-deployer/src/namespace/mod.rs b/rust/olm-deployer/src/namespace/mod.rs new file mode 100644 index 00000000..f07623af --- /dev/null +++ b/rust/olm-deployer/src/namespace/mod.rs @@ -0,0 +1,5 @@ +use stackable_operator::kube::api::DynamicObject; + +pub(super) fn maybe_patch_namespace(ns: &str, res: DynamicObject) -> anyhow::Result { + todo!() +} diff --git a/rust/olm-deployer/src/owner/mod.rs b/rust/olm-deployer/src/owner/mod.rs index ba0c85df..4a368dd9 100644 --- a/rust/olm-deployer/src/owner/mod.rs +++ b/rust/olm-deployer/src/owner/mod.rs @@ -1,6 +1,7 @@ use anyhow::{Context, Result}; use stackable_operator::k8s_openapi::api::apps::v1::Deployment; use stackable_operator::k8s_openapi::api::rbac::v1::ClusterRole; +use stackable_operator::k8s_openapi::apimachinery::pkg::apis::meta::v1::OwnerReference; use stackable_operator::kube::api::DynamicObject; use stackable_operator::kube::api::ResourceExt; use stackable_operator::kube::discovery::Scope; @@ -13,17 +14,7 @@ pub fn maybe_update_owner( cluster_role: &ClusterRole, ) -> Result { // TODO: skip SecurityContextConstraints ? - let owner_ref = match scope { - Scope::Cluster => cluster_role.owner_ref(&()).context(format!( - "Cannot make owner ref from ClusterRole [{}]", - cluster_role.name_any() - ))?, - Scope::Namespaced => deployment.owner_ref(&()).context(format!( - "Cannot make owner ref from Deployment [{}]", - deployment.name_any() - ))?, - }; - + let owner_ref = owner_ref(scope, deployment, cluster_role)?; let mut ret = dynamic_object.clone(); match ret.metadata.owner_references { Some(ref mut ors) => ors.push(owner_ref), @@ -32,6 +23,19 @@ pub fn maybe_update_owner( Ok(ret) } +fn owner_ref(scope: &Scope, depl: &Deployment, cr: &ClusterRole) -> Result { + match scope { + Scope::Cluster => cr.owner_ref(&()).context(format!( + "Cannot make owner ref from ClusterRole [{}]", + cr.name_any() + )), + Scope::Namespaced => depl.owner_ref(&()).context(format!( + "Cannot make owner ref from Deployment [{}]", + depl.name_any() + )), + } +} + #[cfg(test)] mod test { use super::*; From 5a3302b248f2b5596a2d6a531db27df437d3c213 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 14 Jan 2025 09:26:08 +0100 Subject: [PATCH 11/30] test env --- rust/olm-deployer/src/env/mod.rs | 99 ++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/rust/olm-deployer/src/env/mod.rs b/rust/olm-deployer/src/env/mod.rs index 0c93242c..3fe04286 100644 --- a/rust/olm-deployer/src/env/mod.rs +++ b/rust/olm-deployer/src/env/mod.rs @@ -47,3 +47,102 @@ fn deployment_env_var(deployment: &Deployment) -> Vec { .and_then(|c| c.env.clone()) .unwrap_or_default() } + +#[cfg(test)] +mod test { + use super::*; + use anyhow::Result; + use serde::Deserialize; + + use std::sync::LazyLock; + + static DAEMONSET: LazyLock = LazyLock::new(|| { + const STR_DAEMONSET: &str = r#" +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: secret-operator-daemonset +spec: + template: + spec: + containers: + - name: secret-operator + image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" + env: + - name: NAME1 + value: value1 +"#; + + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DAEMONSET)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + static DEPLOYMENT: LazyLock = LazyLock::new(|| { + const STR_DEPLOYMENT: &str = r#" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: secret-operator-deployer + uid: d9287d0a-3069-47c3-8c90-b714dc6d1af5 +spec: + template: + spec: + containers: + - name: secret-operator-deployer + image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" + env: + - name: NAME2 + value: value2 + tolerations: + - key: keep-out + value: "yes" + operator: Equal + effect: NoSchedule + "#; + + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DEPLOYMENT)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + #[test] + fn test_copy_env_var() -> Result<()> { + let daemonset = maybe_copy_env(&DEPLOYMENT, DAEMONSET.clone())?; + + let expected = vec![ + EnvVar { + name: "NAME1".to_string(), + value: Some("value1".to_string()), + ..EnvVar::default() + }, + EnvVar { + name: "NAME2".to_string(), + value: Some("value2".to_string()), + ..EnvVar::default() + }, + ]; + assert_eq!( + daemonset_env(&daemonset.try_parse::()?), + expected + ); + Ok(()) + } + + fn daemonset_env(res: &DaemonSet) -> Vec { + res.spec + .as_ref() + .and_then(|ds| ds.template.spec.as_ref()) + .map(|ts| ts.containers.iter()) + .into_iter() + .flatten() + .filter(|c| c.name == "secret-operator") + .last() + .and_then(|c| c.env.clone()) + .unwrap_or_default() + } +} From 46996abc453efc2773fad49c89ed1906aacb2fe2 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:51:09 +0100 Subject: [PATCH 12/30] copy resources --- rust/olm-deployer/src/main.rs | 4 +- rust/olm-deployer/src/resources/mod.rs | 145 +++++++++++++++++++++++++ 2 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 rust/olm-deployer/src/resources/mod.rs diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 19015910..76010663 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -1,6 +1,7 @@ mod env; mod namespace; mod owner; +mod resources; mod tolerations; use anyhow::{anyhow, bail, Context, Result}; @@ -109,9 +110,8 @@ async fn main() -> Result<()> { &cluster_role, )?; // TODO: patch namespace where needed - // TODO: add env vars let obj = env::maybe_copy_env(&deployment, obj)?; - // TODO: patch resources + let obj = resources::copy_resources(&deployment, obj)?; // ---------- apply apply(&api, obj, &gvk.kind).await? } diff --git a/rust/olm-deployer/src/resources/mod.rs b/rust/olm-deployer/src/resources/mod.rs new file mode 100644 index 00000000..0a32a8b1 --- /dev/null +++ b/rust/olm-deployer/src/resources/mod.rs @@ -0,0 +1,145 @@ +use stackable_operator::k8s_openapi::api::apps::v1::{DaemonSet, Deployment}; +use stackable_operator::k8s_openapi::api::core::v1::ResourceRequirements; +use stackable_operator::kube::api::DynamicObject; + +pub(super) fn copy_resources( + deployment: &Deployment, + res: DynamicObject, +) -> anyhow::Result { + let ds: anyhow::Result = res.clone().try_parse(); + match ds { + Ok(mut daemonset) => { + if let Some(ps) = daemonset + .spec + .as_mut() + .and_then(|s| s.template.spec.as_mut()) + { + for c in ps.containers.iter_mut() { + if c.name == "secret-operator" { + let d_res = deployment_resources(deployment); + c.resources = d_res; + } + } + } + // TODO: halp!! change this to a proper conversion. + let ret: DynamicObject = serde_yaml::from_str(&serde_yaml::to_string(&daemonset)?)?; + + Ok(ret) + } + _ => Ok(res), + } +} + +fn deployment_resources(deployment: &Deployment) -> Option { + deployment + .spec + .as_ref() + .and_then(|ds| ds.template.spec.as_ref()) + .map(|ts| ts.containers.iter()) + .into_iter() + .flatten() + .filter(|c| c.name == "secret-operator-deployer") + .last() + .and_then(|c| c.resources.clone()) +} + +#[cfg(test)] +mod test { + use super::*; + use anyhow::Result; + use serde::Deserialize; + + use std::sync::LazyLock; + + static DAEMONSET: LazyLock = LazyLock::new(|| { + const STR_DAEMONSET: &str = r#" +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: secret-operator-daemonset +spec: + template: + spec: + containers: + - name: secret-operator + image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" + env: + - name: NAME1 + value: value1 + resources: + limits: + cpu: 500m + memory: 2Mi + requests: + cpu: 200m + memory: 1Mi +"#; + + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DAEMONSET)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + static DEPLOYMENT: LazyLock = LazyLock::new(|| { + const STR_DEPLOYMENT: &str = r#" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: secret-operator-deployer + uid: d9287d0a-3069-47c3-8c90-b714dc6d1af5 +spec: + template: + spec: + containers: + - name: secret-operator-deployer + image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" + env: + - name: NAME2 + value: value2 + resources: + limits: + cpu: 100m + memory: 512Mi + requests: + cpu: 100m + memory: 512Mi + tolerations: + - key: keep-out + value: "yes" + operator: Equal + effect: NoSchedule + "#; + + let data = + serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str(STR_DEPLOYMENT)) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + #[test] + fn test_copy_env_var() -> Result<()> { + let daemonset = copy_resources(&DEPLOYMENT, DAEMONSET.clone())?; + + assert_eq!( + daemonset_resources(&daemonset.try_parse::()?), + deployment_resources(&DEPLOYMENT), + ); + Ok(()) + } + + fn daemonset_resources(daemonset: &DaemonSet) -> Option { + daemonset + .spec + .as_ref() + .and_then(|ds| ds.template.spec.as_ref()) + .map(|ts| ts.containers.iter()) + .into_iter() + .flatten() + .filter(|c| c.name == "secret-operator") + .last() + .and_then(|c| c.resources.clone()) + } +} From acee6915ef4301d4fcd28a99c5d7dda65c74197b Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 14 Jan 2025 13:50:18 +0100 Subject: [PATCH 13/30] add secret op lib crate --- rust/operator-binary/src/lib.rs | 11 +++++++++++ rust/operator-binary/src/main.rs | 11 ++++------- 2 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 rust/operator-binary/src/lib.rs diff --git a/rust/operator-binary/src/lib.rs b/rust/operator-binary/src/lib.rs new file mode 100644 index 00000000..542794cd --- /dev/null +++ b/rust/operator-binary/src/lib.rs @@ -0,0 +1,11 @@ +// Exported because the olm-deployer needs access to the SecretClass +pub mod crd; + +// This is a side-effect of exporting the crd module above (and introducing this lib.rs file) +// Without these, the operator binary doesn't compile anymore. +pub mod backend; +pub mod csi_server; +pub mod external_crd; +pub mod format; +pub mod grpc; +pub mod utils; diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index 6c466b29..d6126489 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -17,13 +17,10 @@ use tokio_stream::wrappers::UnixListenerStream; use tonic::transport::Server; use utils::{uds_bind_private, TonicUnixStream}; -mod backend; -mod crd; -mod csi_server; -mod external_crd; -mod format; -mod grpc; -mod utils; +use stackable_secret_operator::crd; +use stackable_secret_operator::csi_server; +use stackable_secret_operator::grpc; +use stackable_secret_operator::utils; pub const APP_NAME: &str = "secret"; pub const OPERATOR_NAME: &str = "secrets.stackable.tech"; From a827fab11ef3fec376d11b8967818cec450904b4 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:36:24 +0100 Subject: [PATCH 14/30] patch namespace --- rust/olm-deployer/src/main.rs | 12 +++++------ rust/olm-deployer/src/namespace/mod.rs | 29 ++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 76010663..158fea4b 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -89,7 +89,7 @@ async fn main() -> Result<()> { let yaml = std::fs::read_to_string(path) .with_context(|| format!("Failed to read {}", path.display()))?; for doc in multidoc_deserialize(&yaml)? { - let obj: DynamicObject = serde_yaml::from_value(doc)?; + let mut obj: DynamicObject = serde_yaml::from_value(doc)?; // ---------- let gvk = if let Some(tm) = &obj.types { GroupVersionKind::try_from(tm)? @@ -102,16 +102,16 @@ async fn main() -> Result<()> { let api = dynamic_api(ar, &caps.scope, kube_client.clone(), &namespace); // ---------- patch object - let obj = tolerations::maybe_copy_tolerations(&deployment, obj)?; - let obj = owner::maybe_update_owner( + obj = tolerations::maybe_copy_tolerations(&deployment, obj)?; + obj = owner::maybe_update_owner( obj, &caps.scope, &deployment, &cluster_role, )?; - // TODO: patch namespace where needed - let obj = env::maybe_copy_env(&deployment, obj)?; - let obj = resources::copy_resources(&deployment, obj)?; + namespace::maybe_patch_namespace(&namespace, &mut obj)?; + obj = env::maybe_copy_env(&deployment, obj)?; + obj = resources::copy_resources(&deployment, obj)?; // ---------- apply apply(&api, obj, &gvk.kind).await? } diff --git a/rust/olm-deployer/src/namespace/mod.rs b/rust/olm-deployer/src/namespace/mod.rs index f07623af..19194113 100644 --- a/rust/olm-deployer/src/namespace/mod.rs +++ b/rust/olm-deployer/src/namespace/mod.rs @@ -1,5 +1,30 @@ +use anyhow::{bail, Result}; +use serde_json::{json, Value}; use stackable_operator::kube::api::DynamicObject; -pub(super) fn maybe_patch_namespace(ns: &str, res: DynamicObject) -> anyhow::Result { - todo!() +pub(super) fn maybe_patch_namespace(ns: &str, res: &mut DynamicObject) -> Result<()> { + if let Some(auto_tls) = res.data.pointer_mut("/spec/backend/autoTls") { + *get_or_insert_default_object( + get_or_insert_default_object(get_or_insert_default_object(auto_tls, "ca")?, "secret")?, + "namespace", + )? = json!(ns.to_string()); + } + Ok(()) +} + +fn get_or_insert_default_object<'a>( + value: &'a mut serde_json::Value, + key: &str, +) -> Result<&'a mut Value> { + let map = match value { + serde_json::Value::Object(map) => map, + x @ serde_json::Value::Null => { + *x = json!({}); + x.as_object_mut().unwrap() + } + x => { + bail!("invalid type {x:?}, expected map"); + } + }; + Ok(map.entry(key).or_insert_with(|| serde_json::Value::Null)) } From 4693dfa5aca17d09dd48cf6fcc7c649f75792037 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 14 Jan 2025 15:38:21 +0100 Subject: [PATCH 15/30] Revert "add secret op lib crate" This reverts commit acee6915ef4301d4fcd28a99c5d7dda65c74197b. --- rust/operator-binary/src/lib.rs | 11 ----------- rust/operator-binary/src/main.rs | 11 +++++++---- 2 files changed, 7 insertions(+), 15 deletions(-) delete mode 100644 rust/operator-binary/src/lib.rs diff --git a/rust/operator-binary/src/lib.rs b/rust/operator-binary/src/lib.rs deleted file mode 100644 index 542794cd..00000000 --- a/rust/operator-binary/src/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -// Exported because the olm-deployer needs access to the SecretClass -pub mod crd; - -// This is a side-effect of exporting the crd module above (and introducing this lib.rs file) -// Without these, the operator binary doesn't compile anymore. -pub mod backend; -pub mod csi_server; -pub mod external_crd; -pub mod format; -pub mod grpc; -pub mod utils; diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index d6126489..6c466b29 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -17,10 +17,13 @@ use tokio_stream::wrappers::UnixListenerStream; use tonic::transport::Server; use utils::{uds_bind_private, TonicUnixStream}; -use stackable_secret_operator::crd; -use stackable_secret_operator::csi_server; -use stackable_secret_operator::grpc; -use stackable_secret_operator::utils; +mod backend; +mod crd; +mod csi_server; +mod external_crd; +mod format; +mod grpc; +mod utils; pub const APP_NAME: &str = "secret"; pub const OPERATOR_NAME: &str = "secrets.stackable.tech"; From 87cfab2c04930f8fcd2999173af3dde6c905438f Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:02:03 +0100 Subject: [PATCH 16/30] added test for namespace patch --- Cargo.lock | 16 ++--- rust/olm-deployer/src/data.rs | 8 +++ rust/olm-deployer/src/main.rs | 3 +- rust/olm-deployer/src/namespace/mod.rs | 91 +++++++++++++++++++------- 4 files changed, 85 insertions(+), 33 deletions(-) create mode 100644 rust/olm-deployer/src/data.rs diff --git a/Cargo.lock b/Cargo.lock index b64748be..203d7e66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -625,9 +625,9 @@ dependencies = [ [[package]] name = "delegate" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2323e10c92e1cf4d86e11538512e6dc03ceb586842970b6332af3d4046a046" +checksum = "297806318ef30ad066b15792a8372858020ae3ca2e414ee6c2133b1eb9e9e945" dependencies = [ "proc-macro2", "quote", @@ -1812,9 +1812,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "matchers" @@ -1851,9 +1851,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -3597,9 +3597,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b913a3b5fe84142e269d63cc62b64319ccaf89b748fc31fe025177f767a756c4" +checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" dependencies = [ "getrandom", ] diff --git a/rust/olm-deployer/src/data.rs b/rust/olm-deployer/src/data.rs new file mode 100644 index 00000000..4b733127 --- /dev/null +++ b/rust/olm-deployer/src/data.rs @@ -0,0 +1,8 @@ +use anyhow::{bail, Result}; + +pub fn data_field_as_mut<'a>(value: &'a mut serde_json::Value, pointer: &str) -> Result<&'a mut serde_json::Value> { + match value.pointer_mut(pointer) { + Some(field) => Ok(field), + x => bail!("invalid pointer {pointer} for object {x:?}"), + } +} diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 158fea4b..ce2dab0c 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -1,3 +1,4 @@ +mod data; mod env; mod namespace; mod owner; @@ -109,7 +110,7 @@ async fn main() -> Result<()> { &deployment, &cluster_role, )?; - namespace::maybe_patch_namespace(&namespace, &mut obj)?; + namespace::maybe_patch_namespace(&namespace, &mut obj, &gvk)?; obj = env::maybe_copy_env(&deployment, obj)?; obj = resources::copy_resources(&deployment, obj)?; // ---------- apply diff --git a/rust/olm-deployer/src/namespace/mod.rs b/rust/olm-deployer/src/namespace/mod.rs index 19194113..4c6d320e 100644 --- a/rust/olm-deployer/src/namespace/mod.rs +++ b/rust/olm-deployer/src/namespace/mod.rs @@ -1,30 +1,73 @@ -use anyhow::{bail, Result}; +use anyhow::Result; use serde_json::{json, Value}; -use stackable_operator::kube::api::DynamicObject; - -pub(super) fn maybe_patch_namespace(ns: &str, res: &mut DynamicObject) -> Result<()> { - if let Some(auto_tls) = res.data.pointer_mut("/spec/backend/autoTls") { - *get_or_insert_default_object( - get_or_insert_default_object(get_or_insert_default_object(auto_tls, "ca")?, "secret")?, - "namespace", - )? = json!(ns.to_string()); +use stackable_operator::kube::api::{DynamicObject, GroupVersionKind}; + +use crate::data; + +pub(super) fn maybe_patch_namespace( + ns: &str, + res: &mut DynamicObject, + gvk: &GroupVersionKind, +) -> Result<()> { + if gvk.kind == "SecretClass" { + *auto_tls_namespace(&mut res.data)? = json!(ns.to_string()); } Ok(()) } -fn get_or_insert_default_object<'a>( - value: &'a mut serde_json::Value, - key: &str, -) -> Result<&'a mut Value> { - let map = match value { - serde_json::Value::Object(map) => map, - x @ serde_json::Value::Null => { - *x = json!({}); - x.as_object_mut().unwrap() - } - x => { - bail!("invalid type {x:?}, expected map"); - } - }; - Ok(map.entry(key).or_insert_with(|| serde_json::Value::Null)) +fn auto_tls_namespace(value: &mut serde_json::Value) -> Result<&mut Value> { + data::data_field_as_mut(value, "/spec/backend/autoTls/ca/secret/namespace") +} + +#[cfg(test)] +mod test { + use super::*; + use anyhow::Result; + use serde::Deserialize; + + use std::sync::LazyLock; + + static TLS_SECRET_CLASS: LazyLock = LazyLock::new(|| { + const STR_TLS_SECRET_CLASS: &str = r#" +--- +apiVersion: secrets.stackable.tech/v1alpha1 +kind: SecretClass +metadata: + name: tls + labels: + app.kubernetes.io/name: secret-operator + app.kubernetes.io/instance: secret-operator + stackable.tech/vendor: Stackable + app.kubernetes.io/version: "24.11.0" +spec: + backend: + autoTls: + ca: + secret: + name: secret-provisioner-tls-ca + namespace: "${NAMESPACE}" # TODO patch with olm-deployer + autoGenerate: true +"#; + + let data = serde_yaml::Value::deserialize(serde_yaml::Deserializer::from_str( + STR_TLS_SECRET_CLASS, + )) + .unwrap(); + serde_yaml::from_value(data).unwrap() + }); + + #[test] + fn test_patch_namespace() -> Result<()> { + let gvk: GroupVersionKind = GroupVersionKind { + kind: "SecretClass".to_string(), + version: "v1alpha1".to_string(), + group: "secrets.stackable.tech".to_string(), + }; + let mut tls = TLS_SECRET_CLASS.clone(); + maybe_patch_namespace("prod", &mut tls, &gvk)?; + + let expected = json!("prod"); + assert_eq!(auto_tls_namespace(&mut tls.data)?, &expected); + Ok(()) + } } From df3b6ab5bcfa2a1000c37147305e165a1d318fc7 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 14 Jan 2025 18:02:49 +0100 Subject: [PATCH 17/30] cargo fmt --- rust/olm-deployer/src/data.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rust/olm-deployer/src/data.rs b/rust/olm-deployer/src/data.rs index 4b733127..6e601ece 100644 --- a/rust/olm-deployer/src/data.rs +++ b/rust/olm-deployer/src/data.rs @@ -1,6 +1,9 @@ use anyhow::{bail, Result}; -pub fn data_field_as_mut<'a>(value: &'a mut serde_json::Value, pointer: &str) -> Result<&'a mut serde_json::Value> { +pub fn data_field_as_mut<'a>( + value: &'a mut serde_json::Value, + pointer: &str, +) -> Result<&'a mut serde_json::Value> { match value.pointer_mut(pointer) { Some(field) => Ok(field), x => bail!("invalid pointer {pointer} for object {x:?}"), From 4d3b7e7341a51b2471ba39eeded74a8f1383e7ba Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Mon, 20 Jan 2025 15:47:05 +0100 Subject: [PATCH 18/30] added owner name cli param --- rust/olm-deployer/src/main.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index ce2dab0c..144b879f 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -36,6 +36,9 @@ struct Opts { #[derive(clap::Parser)] struct OlmDeployerRun { + /// Name of the cluster role to use as owner for cluster wide resources. + #[arg(long, short)] + owner: String, #[arg(long, short)] namespace: String, #[arg(long, short)] @@ -51,6 +54,7 @@ struct OlmDeployerRun { async fn main() -> Result<()> { let opts = Opts::parse(); if let Command::Run(OlmDeployerRun { + owner, namespace, dir, tracing_target, @@ -74,7 +78,7 @@ async fn main() -> Result<()> { let deployment: Deployment = deployment_api.get("secret-operator-deployer").await?; let cluster_role_api = client.get_all_api::(); - let cluster_role: ClusterRole = cluster_role_api.get("secret-operator-clusterrole").await?; + let cluster_role: ClusterRole = cluster_role_api.get(&owner).await?; let kube_client = client.as_kube_client(); // discovery (to be able to infer apis from kind/plural only) From 28a7f00b844d6d0a4c7c2e7145c3258c033df9ea Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Mon, 20 Jan 2025 16:41:49 +0100 Subject: [PATCH 19/30] obtain clusterrole by label selector --- rust/olm-deployer/src/main.rs | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 144b879f..39eb084e 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -9,7 +9,7 @@ use anyhow::{anyhow, bail, Context, Result}; use clap::{crate_description, crate_version, Parser}; use stackable_operator::cli::Command; use stackable_operator::client; -use stackable_operator::kube::api::{Api, Patch, PatchParams, ResourceExt}; +use stackable_operator::kube::api::{Api, ListParams, Patch, PatchParams, ResourceExt}; use stackable_operator::kube::discovery::{ApiResource, Discovery, Scope}; use stackable_operator::k8s_openapi::api::rbac::v1::ClusterRole; @@ -36,9 +36,10 @@ struct Opts { #[derive(clap::Parser)] struct OlmDeployerRun { - /// Name of the cluster role to use as owner for cluster wide resources. + // Operator version to be deployed. Used to resolve the name of the ClusterRole created by OLM and + // used as owner for cluster wide objecs. #[arg(long, short)] - owner: String, + op_version: String, #[arg(long, short)] namespace: String, #[arg(long, short)] @@ -54,7 +55,7 @@ struct OlmDeployerRun { async fn main() -> Result<()> { let opts = Opts::parse(); if let Command::Run(OlmDeployerRun { - owner, + op_version, namespace, dir, tracing_target, @@ -77,8 +78,7 @@ async fn main() -> Result<()> { let deployment_api = client.get_api::(&namespace); let deployment: Deployment = deployment_api.get("secret-operator-deployer").await?; - let cluster_role_api = client.get_all_api::(); - let cluster_role: ClusterRole = cluster_role_api.get(&owner).await?; + let cluster_role: ClusterRole = get_cluster_role(&op_version, &client).await?; let kube_client = client.as_kube_client(); // discovery (to be able to infer apis from kind/plural only) @@ -162,3 +162,18 @@ fn dynamic_api( _ => Api::namespaced_with(client, ns, &ar), } } + +async fn get_cluster_role(op_version: &str, client: &client::Client) -> Result { + let labels = + format!("olm.owner=secret-operator.v{op_version},olm.owner.kind=ClusterServiceVersion"); + let lp = ListParams { + label_selector: Some(labels.clone()), + ..ListParams::default() + }; + + let cluster_role_api = client.get_all_api::(); + match cluster_role_api.list(&lp).await?.items { + result if result.len() == 1 => Ok(result.first().unwrap().clone()), + _ => bail!("ClusterRole object not found for labels {labels}"), + } +} From 1f880c9f6a5874d9bedb89e6ecfd4ccb1f6887e2 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Mon, 20 Jan 2025 17:11:35 +0100 Subject: [PATCH 20/30] olm creates multiple clusterroles per subscription --- rust/olm-deployer/src/main.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 39eb084e..8abc5742 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -172,8 +172,10 @@ async fn get_cluster_role(op_version: &str, client: &client::Client) -> Result(); - match cluster_role_api.list(&lp).await?.items { - result if result.len() == 1 => Ok(result.first().unwrap().clone()), - _ => bail!("ClusterRole object not found for labels {labels}"), + let result = cluster_role_api.list(&lp).await?.items; + if !result.is_empty() { + Ok(result.first().unwrap().clone()) + } else { + bail!("ClusterRole object not found for labels {labels}") } } From 0e77dfddd26e90607f3a9506f5ec074e21ee46b7 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 21 Jan 2025 13:15:37 +0100 Subject: [PATCH 21/30] delete tests in favor of olm manifests --- rust/olm-deployer/README.md | 32 +- .../tests/manifests/deployer/csi-driver.yaml | 17 - .../tests/manifests/deployer/daemonset.yaml | 133 -------- .../manifests/deployer/migration-job.yaml | 59 ---- .../deployer/secret_migration_rbac.yaml | 41 --- .../manifests/deployer/storage-class.yaml | 8 - .../tests/manifests/deployer/tls.yaml | 18 - .../tests/manifests/nginx/deployment.yaml | 27 -- .../tests/manifests/olm/crds.yaml | 310 ------------------ .../tests/manifests/olm/roles.yaml | 78 ----- .../tests/manifests/olm/serviceaccount.yaml | 23 -- 11 files changed, 15 insertions(+), 731 deletions(-) delete mode 100644 rust/olm-deployer/tests/manifests/deployer/csi-driver.yaml delete mode 100644 rust/olm-deployer/tests/manifests/deployer/daemonset.yaml delete mode 100644 rust/olm-deployer/tests/manifests/deployer/migration-job.yaml delete mode 100644 rust/olm-deployer/tests/manifests/deployer/secret_migration_rbac.yaml delete mode 100644 rust/olm-deployer/tests/manifests/deployer/storage-class.yaml delete mode 100644 rust/olm-deployer/tests/manifests/deployer/tls.yaml delete mode 100644 rust/olm-deployer/tests/manifests/nginx/deployment.yaml delete mode 100644 rust/olm-deployer/tests/manifests/olm/crds.yaml delete mode 100644 rust/olm-deployer/tests/manifests/olm/roles.yaml delete mode 100644 rust/olm-deployer/tests/manifests/olm/serviceaccount.yaml diff --git a/rust/olm-deployer/README.md b/rust/olm-deployer/README.md index d60ab9ce..ddaad4e5 100644 --- a/rust/olm-deployer/README.md +++ b/rust/olm-deployer/README.md @@ -1,25 +1,23 @@ # How to test -## Prepare a test namespace +Requirements: -This namespace is hard coded in the manifests created by olm. +1. An OpenShift cluster. +2. Checkout the branch `secret-olm-deployer` from the [operators](https://github.com/stackabletech/openshift-certified-operators/tree/secret-olm-deployer) repo. +3. Clone the `stackable-utils` [repo](https://github.com/stackabletech/stackable-utils) - kubectl create ns test +Install the secret operator using OLM and the `olm-deployer`. From the `stackable-utils` repo, run: -## Install the objects that OLM would install +```bash +$ ./olm/build-bundles.sh -c $HOME/repo/stackable/openshift-certified-operators -r 24.11.0 -o secret -d +... +``` - kubectl create -n test -f rust/olm-deployer/tests/manifests/nginx/deployment.yaml +The secret op and all it's dependencies should be installed and running in the `stackable-operators` namespace. - kubectl create -f rust/olm-deployer/tests/manifests/olm/crds.yaml - kubectl create -n test -f rust/olm-deployer/tests/manifests/olm/roles.yaml - kubectl create -n test -f rust/olm-deployer/tests/manifests/olm/serviceaccount.yaml +Run the integration tests: -## Finally run the olm-deployer - - cargo run -p olm-deployer run --dir rust/olm-deployer/tests/manifests/deployer --namespace test - -## Cleanup - - kubectl delete ns test - kubectl delete -f rust/olm-deployer/tests/manifests/olm/crds.yaml - kubectl delete -n test -f rust/olm-deployer/tests/manifests/olm/roles.yaml +```bash +$ ./scripts/run-tests --skip-operator secret --test-suite openshift +... +``` diff --git a/rust/olm-deployer/tests/manifests/deployer/csi-driver.yaml b/rust/olm-deployer/tests/manifests/deployer/csi-driver.yaml deleted file mode 100644 index d155d400..00000000 --- a/rust/olm-deployer/tests/manifests/deployer/csi-driver.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -apiVersion: storage.k8s.io/v1 -kind: CSIDriver -metadata: - name: secrets.stackable.tech - labels: - app.kubernetes.io/name: secret-operator - app.kubernetes.io/instance: secret-operator - stackable.tech/vendor: Stackable - app.kubernetes.io/version: "24.11.0" -spec: - attachRequired: false - podInfoOnMount: true - fsGroupPolicy: File - volumeLifecycleModes: - - Ephemeral - - Persistent diff --git a/rust/olm-deployer/tests/manifests/deployer/daemonset.yaml b/rust/olm-deployer/tests/manifests/deployer/daemonset.yaml deleted file mode 100644 index ba7537d5..00000000 --- a/rust/olm-deployer/tests/manifests/deployer/daemonset.yaml +++ /dev/null @@ -1,133 +0,0 @@ ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: secret-operator-daemonset - labels: - app.kubernetes.io/instance: secret-operator - app.kubernetes.io/name: secret-operator - app.kubernetes.io/version: "24.11.0" - stackable.tech/vendor: Stackable -spec: - selector: - matchLabels: - app.kubernetes.io/name: secret-operator - app.kubernetes.io/instance: secret-operator - stackable.tech/vendor: Stackable - template: - metadata: - labels: - app.kubernetes.io/name: secret-operator - app.kubernetes.io/instance: secret-operator - stackable.tech/vendor: Stackable - spec: - serviceAccountName: secret-operator-serviceaccount - securityContext: {} - containers: - - name: secret-operator - securityContext: - privileged: true - runAsUser: 0 - image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - env: - - name: CSI_ENDPOINT - value: /csi/csi.sock - - name: NODE_NAME - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: spec.nodeName - - name: PRIVILEGED - value: "true" - volumeMounts: - - name: csi - mountPath: /csi - - name: mountpoint - mountPath: /var/lib/kubelet/pods - mountPropagation: Bidirectional - - name: tmp - mountPath: /tmp - - name: external-provisioner - image: "quay.io/stackable/sig-storage/csi-provisioner@sha256:dd730457133f619d8759269abcfa79d7aeb817e01ba7af2d3aa1417df406ea56" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - args: - - --csi-address=/csi/csi.sock - - --feature-gates=Topology=true - - --extra-create-metadata - volumeMounts: - - name: csi - mountPath: /csi - - name: node-driver-registrar - image: "quay.io/stackable/sig-storage/csi-node-driver-registrar@sha256:8331d680e6c40c56909f436ea3126fdca39761cf87781cd2db8d05c9082b05f5" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - args: - - --csi-address=/csi/csi.sock - - --kubelet-registration-path=/var/lib/kubelet/plugins/secrets.stackable.tech/csi.sock - volumeMounts: - - name: registration-sock - mountPath: /registration - - name: csi - mountPath: /csi - initContainers: - - name: migrate-longer-csi-registration-path - image: "quay.io/stackable/secret-operator@sha256:bb5063aa67336465fd3fa80a7c6fd82ac6e30ebe3ffc6dba6ca84c1f1af95bfe" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - command: - - /bin/bash - - -euo - - pipefail - - -x - - -c - - | - ls -la /registration - echo "Removing old (long) CSI registration path" - if [ -d "/registration/secrets.stackable.tech-reg.sock" ]; then rmdir /registration/secrets.stackable.tech-reg.sock; fi - ls -la /registration - volumeMounts: - - name: registration-sock - mountPath: /registration - securityContext: - runAsUser: 0 - volumes: - - name: registration-sock - hostPath: - # node-driver-registrar appends a driver-unique filename to this path to avoid conflicts - # see https://github.com/stackabletech/secret-operator/issues/229 for why this path should not be too long - path: /var/lib/kubelet/plugins_registry - - name: csi - hostPath: - path: /var/lib/kubelet/plugins/secrets.stackable.tech/ - - name: mountpoint - hostPath: - path: /var/lib/kubelet/pods/ - - name: tmp - emptyDir: {} diff --git a/rust/olm-deployer/tests/manifests/deployer/migration-job.yaml b/rust/olm-deployer/tests/manifests/deployer/migration-job.yaml deleted file mode 100644 index 48030386..00000000 --- a/rust/olm-deployer/tests/manifests/deployer/migration-job.yaml +++ /dev/null @@ -1,59 +0,0 @@ ---- -# Source: secret-operator/templates/secret_migration_job.yaml -# Migrates the TLS CA key pair from the hard-coded default namespace to the operator namespace -# See https://github.com/stackabletech/secret-operator/issues/453 -apiVersion: batch/v1 -kind: Job -metadata: - name: secret-operator-secret-migration - labels: - app.kubernetes.io/name: secret-operator - app.kubernetes.io/instance: secret-operator - stackable.tech/vendor: Stackable - app.kubernetes.io/version: "24.11.0" -spec: - template: - metadata: - labels: - app.kubernetes.io/name: secret-operator - app.kubernetes.io/instance: secret-operator - stackable.tech/vendor: Stackable - spec: - serviceAccountName: secret-operator-secret-migration-serviceaccount - containers: - - name: migrate-secret - image: "quay.io/stackable/tools@sha256:bb02df387d8f614089fe053373f766e21b7a9a1ad04cb3408059014cb0f1388e" - imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 100m - memory: 128Mi - requests: - cpu: 100m - memory: 128Mi - command: - - bash - - -c - args: - - | - #!/bin/bash - set -euo pipefail - SOURCE_NAMESPACE=default - TARGET_NAMESPACE=$NAMESPACE - - # only continue if secret exists - if source_ca_secret="$(kubectl get secret -n $SOURCE_NAMESPACE secret-provisioner-tls-ca -o json)"; then - echo "secret exists in namespace $SOURCE_NAMESPACE" - # only continue if secret in target namespace does NOT exist - if ! kubectl get secret -n $TARGET_NAMESPACE secret-provisioner-tls-ca; then - echo "secret does not exist in namespace $TARGET_NAMESPACE" - # copy secret from default to default - echo "$source_ca_secret" | jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' | kubectl apply -n $TARGET_NAMESPACE -f - - fi - fi - env: - - name: NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - restartPolicy: Never diff --git a/rust/olm-deployer/tests/manifests/deployer/secret_migration_rbac.yaml b/rust/olm-deployer/tests/manifests/deployer/secret_migration_rbac.yaml deleted file mode 100644 index e0286f48..00000000 --- a/rust/olm-deployer/tests/manifests/deployer/secret_migration_rbac.yaml +++ /dev/null @@ -1,41 +0,0 @@ ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: secret-operator-secret-migration-serviceaccount - labels: - stackable.tech/vendor: Stackable ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: secret-operator-secret-migration-clusterrolebinding - labels: - stackable.tech/vendor: Stackable -subjects: - - kind: ServiceAccount - name: secret-operator-secret-migration-serviceaccount - namespace: test -roleRef: - kind: ClusterRole - name: secret-operator-secret-migration-clusterrole - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: secret-operator-secret-migration-clusterrole - labels: - stackable.tech/vendor: Stackable -rules: - - apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch - - create - - patch - - update diff --git a/rust/olm-deployer/tests/manifests/deployer/storage-class.yaml b/rust/olm-deployer/tests/manifests/deployer/storage-class.yaml deleted file mode 100644 index 187fe9da..00000000 --- a/rust/olm-deployer/tests/manifests/deployer/storage-class.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: secrets.stackable.tech - labels: - stackable.tech/vendor: Stackable -provisioner: secrets.stackable.tech diff --git a/rust/olm-deployer/tests/manifests/deployer/tls.yaml b/rust/olm-deployer/tests/manifests/deployer/tls.yaml deleted file mode 100644 index 8d33f1fe..00000000 --- a/rust/olm-deployer/tests/manifests/deployer/tls.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -apiVersion: secrets.stackable.tech/v1alpha1 -kind: SecretClass -metadata: - name: tls - labels: - app.kubernetes.io/name: secret-operator - app.kubernetes.io/instance: secret-operator - stackable.tech/vendor: Stackable - app.kubernetes.io/version: "24.11.0" -spec: - backend: - autoTls: - ca: - secret: - name: secret-provisioner-tls-ca - namespace: "${NAMESPACE}" # TODO patch with olm-deployer - autoGenerate: true diff --git a/rust/olm-deployer/tests/manifests/nginx/deployment.yaml b/rust/olm-deployer/tests/manifests/nginx/deployment.yaml deleted file mode 100644 index 928b3834..00000000 --- a/rust/olm-deployer/tests/manifests/nginx/deployment.yaml +++ /dev/null @@ -1,27 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: secret-operator-deployer - labels: - app: nginx -spec: - replicas: 1 - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:1.14.2 - ports: - - containerPort: 80 - tolerations: - - key: keep-out - value: "yes" - operator: Equal - effect: NoSchedule diff --git a/rust/olm-deployer/tests/manifests/olm/crds.yaml b/rust/olm-deployer/tests/manifests/olm/crds.yaml deleted file mode 100644 index e9957745..00000000 --- a/rust/olm-deployer/tests/manifests/olm/crds.yaml +++ /dev/null @@ -1,310 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: secretclasses.secrets.stackable.tech - annotations: - helm.sh/resource-policy: keep -spec: - group: secrets.stackable.tech - names: - categories: [] - kind: SecretClass - plural: secretclasses - shortNames: [] - singular: secretclass - scope: Cluster - versions: - - additionalPrinterColumns: [] - name: v1alpha1 - schema: - openAPIV3Schema: - description: Auto-generated derived type for SecretClassSpec via `CustomResource` - properties: - spec: - description: A [SecretClass](https://docs.stackable.tech/home/nightly/secret-operator/secretclass) is a cluster-global Kubernetes resource that defines a category of secrets that the Secret Operator knows how to provision. - properties: - backend: - description: Each SecretClass is associated with a single [backend](https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend), which dictates the mechanism for issuing that kind of Secret. - oneOf: - - required: - - k8sSearch - - required: - - autoTls - - required: - - experimentalCertManager - - required: - - kerberosKeytab - properties: - autoTls: - description: |- - The [`autoTls` backend](https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend-autotls) issues a TLS certificate signed by the Secret Operator. The certificate authority can be provided by the administrator, or managed automatically by the Secret Operator. - - A new certificate and key pair will be generated and signed for each Pod, keys or certificates are never reused. - properties: - ca: - description: Configures the certificate authority used to issue Pod certificates. - properties: - autoGenerate: - default: false - description: Whether the certificate authority should be managed by Secret Operator, including being generated if it does not already exist. - type: boolean - caCertificateLifetime: - default: 365d - description: |- - The lifetime of each generated certificate authority. - - Should always be more than double `maxCertificateLifetime`. - - If `autoGenerate: true` then the Secret Operator will prepare a new CA certificate the old CA approaches expiration. If `autoGenerate: false` then the Secret Operator will log a warning instead. - type: string - keyGeneration: - default: - rsa: - length: 2048 - description: The algorithm used to generate a key pair and required configuration settings. Currently only RSA and a key length of 2048, 3072 or 4096 bits can be configured. - oneOf: - - required: - - rsa - properties: - rsa: - properties: - length: - description: The amount of bits used for generating the RSA keypair. Currently, `2048`, `3072` and `4096` are supported. Defaults to `2048` bits. - enum: - - 2048 - - 3072 - - 4096 - type: integer - required: - - length - type: object - type: object - secret: - description: Reference (name and namespace) to a Kubernetes Secret object where the CA certificate and key is stored in the keys `ca.crt` and `ca.key` respectively. - properties: - name: - description: Name of the Secret being referred to. - type: string - namespace: - description: Namespace of the Secret being referred to. - type: string - required: - - name - - namespace - type: object - required: - - secret - type: object - maxCertificateLifetime: - default: 15d - description: Maximum lifetime the created certificates are allowed to have. In case consumers request a longer lifetime than allowed by this setting, the lifetime will be the minimum of both, so this setting takes precedence. The default value is 15 days. - type: string - required: - - ca - type: object - experimentalCertManager: - description: |- - The [`experimentalCertManager` backend][1] injects a TLS certificate issued by [cert-manager](https://cert-manager.io/). - - A new certificate will be requested the first time it is used by a Pod, it will be reused after that (subject to cert-manager renewal rules). - - [1]: https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend-certmanager - properties: - defaultCertificateLifetime: - default: 1d - description: |- - The default lifetime of certificates. - - Defaults to 1 day. This may need to be increased for external issuers that impose rate limits (such as Let's Encrypt). - type: string - issuer: - description: A reference to the cert-manager issuer that the certificates should be requested from. - properties: - kind: - description: |- - The kind of the issuer, Issuer or ClusterIssuer. - - If Issuer then it must be in the same namespace as the Pods using it. - enum: - - Issuer - - ClusterIssuer - type: string - name: - description: The name of the issuer. - type: string - required: - - kind - - name - type: object - keyGeneration: - default: - rsa: - length: 2048 - description: The algorithm used to generate a key pair and required configuration settings. Currently only RSA and a key length of 2048, 3072 or 4096 bits can be configured. - oneOf: - - required: - - rsa - properties: - rsa: - properties: - length: - description: The amount of bits used for generating the RSA keypair. Currently, `2048`, `3072` and `4096` are supported. Defaults to `2048` bits. - enum: - - 2048 - - 3072 - - 4096 - type: integer - required: - - length - type: object - type: object - required: - - issuer - type: object - k8sSearch: - description: The [`k8sSearch` backend](https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend-k8ssearch) can be used to mount Secrets across namespaces into Pods. - properties: - searchNamespace: - description: Configures the namespace searched for Secret objects. - oneOf: - - required: - - pod - - required: - - name - properties: - name: - description: The Secret objects are located in a single global namespace. Should be used for secrets that are provisioned by the cluster administrator. - type: string - pod: - description: The Secret objects are located in the same namespace as the Pod object. Should be used for Secrets that are provisioned by the application administrator. - type: object - type: object - required: - - searchNamespace - type: object - kerberosKeytab: - description: The [`kerberosKeytab` backend](https://docs.stackable.tech/home/nightly/secret-operator/secretclass#backend-kerberoskeytab) creates a Kerberos keytab file for a selected realm. The Kerberos KDC and administrator credentials must be provided by the administrator. - properties: - admin: - description: Kerberos admin configuration settings. - oneOf: - - required: - - mit - - required: - - activeDirectory - properties: - activeDirectory: - description: Credentials should be provisioned in a Microsoft Active Directory domain. - properties: - experimentalGenerateSamAccountName: - description: Allows samAccountName generation for new accounts to be customized. Note that setting this field (even if empty) makes the Secret Operator take over the generation duty from the domain controller. - nullable: true - properties: - prefix: - default: '' - description: A prefix to be prepended to generated samAccountNames. - type: string - totalLength: - default: 20 - description: |- - The total length of generated samAccountNames, _including_ `prefix`. Must be larger than the length of `prefix`, but at most `20`. - - Note that this should be as large as possible, to minimize the risk of collisions. - format: uint8 - minimum: 0.0 - type: integer - type: object - ldapServer: - description: An AD LDAP server, such as the AD Domain Controller. This must match the server’s FQDN, or GSSAPI authentication will fail. - type: string - ldapTlsCaSecret: - description: Reference (name and namespace) to a Kubernetes Secret object containing the TLS CA (in `ca.crt`) that the LDAP server’s certificate should be authenticated against. - properties: - name: - description: Name of the Secret being referred to. - type: string - namespace: - description: Namespace of the Secret being referred to. - type: string - required: - - name - - namespace - type: object - passwordCacheSecret: - description: Reference (name and namespace) to a Kubernetes Secret object where workload passwords will be stored. This must not be accessible to end users. - properties: - name: - description: Name of the Secret being referred to. - type: string - namespace: - description: Namespace of the Secret being referred to. - type: string - required: - - name - - namespace - type: object - schemaDistinguishedName: - description: The root Distinguished Name (DN) for AD-managed schemas, typically `CN=Schema,CN=Configuration,{domain_dn}`. - type: string - userDistinguishedName: - description: The root Distinguished Name (DN) where service accounts should be provisioned, typically `CN=Users,{domain_dn}`. - type: string - required: - - ldapServer - - ldapTlsCaSecret - - passwordCacheSecret - - schemaDistinguishedName - - userDistinguishedName - type: object - mit: - description: Credentials should be provisioned in a MIT Kerberos Admin Server. - properties: - kadminServer: - description: The hostname of the Kerberos Admin Server. This should be provided by the Kerberos administrator. - type: string - required: - - kadminServer - type: object - type: object - adminKeytabSecret: - description: Reference (`name` and `namespace`) to a K8s Secret object where a keytab with administrative privileges is stored in the key `keytab`. - properties: - name: - description: Name of the Secret being referred to. - type: string - namespace: - description: Namespace of the Secret being referred to. - type: string - required: - - name - - namespace - type: object - adminPrincipal: - description: The admin principal. - type: string - kdc: - description: The hostname of the Kerberos Key Distribution Center (KDC). This should be provided by the Kerberos administrator. - type: string - realmName: - description: The name of the Kerberos realm. This should be provided by the Kerberos administrator. - pattern: ^[-.a-zA-Z0-9]+$ - type: string - required: - - admin - - adminKeytabSecret - - adminPrincipal - - kdc - - realmName - type: object - type: object - required: - - backend - type: object - required: - - spec - title: SecretClass - type: object - served: true - storage: true - subresources: {} diff --git a/rust/olm-deployer/tests/manifests/olm/roles.yaml b/rust/olm-deployer/tests/manifests/olm/roles.yaml deleted file mode 100644 index 1756bca2..00000000 --- a/rust/olm-deployer/tests/manifests/olm/roles.yaml +++ /dev/null @@ -1,78 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: secret-operator-clusterrole - labels: - stackable.tech/vendor: Stackable -rules: - - apiGroups: - - "" - resources: - - secrets - - events - verbs: - - get - - list - - watch - - create - - patch - - update - - apiGroups: - - "" - resources: - - persistentvolumes - verbs: - - get - - list - - watch - - patch - - create - - delete - - apiGroups: - - "" - resources: - - nodes - - persistentvolumeclaims - verbs: - - get - - list - - watch - - apiGroups: - - storage.k8s.io - resources: - - csinodes - - storageclasses - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - pods - verbs: - - get - - patch - - apiGroups: - - secrets.stackable.tech - resources: - - secretclasses - verbs: - - get - - apiGroups: - - listeners.stackable.tech - resources: - - listenerclasses - - listeners - - podlisteners - verbs: - - get - - apiGroups: - - cert-manager.io - resources: - - certificates - verbs: - - get - - patch - - create diff --git a/rust/olm-deployer/tests/manifests/olm/serviceaccount.yaml b/rust/olm-deployer/tests/manifests/olm/serviceaccount.yaml deleted file mode 100644 index 919354c9..00000000 --- a/rust/olm-deployer/tests/manifests/olm/serviceaccount.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: secret-operator-serviceaccount - labels: - stackable.tech/vendor: Stackable ---- -apiVersion: rbac.authorization.k8s.io/v1 -# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace. -kind: ClusterRoleBinding -metadata: - name: secret-operator-clusterrolebinding - labels: - stackable.tech/vendor: Stackable -subjects: - - kind: ServiceAccount - name: secret-operator-serviceaccount - namespace: test # TODO: needs to be patched by the olm-deployer -roleRef: - kind: ClusterRole - name: secret-operator-clusterrole - apiGroup: rbac.authorization.k8s.io From 1299ffd4df46b6fa0a5131cee6165e61dfe78da6 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 21 Jan 2025 18:19:37 +0100 Subject: [PATCH 22/30] modify DynamicObjects in place and reduce cloning --- rust/olm-deployer/src/data.rs | 65 ++++++++++++++++ rust/olm-deployer/src/env/mod.rs | 99 +++++++++++++----------- rust/olm-deployer/src/main.rs | 10 +-- rust/olm-deployer/src/owner/mod.rs | 36 ++++----- rust/olm-deployer/src/resources/mod.rs | 98 ++++++++++++----------- rust/olm-deployer/src/tolerations/mod.rs | 73 ++++++++--------- 6 files changed, 231 insertions(+), 150 deletions(-) diff --git a/rust/olm-deployer/src/data.rs b/rust/olm-deployer/src/data.rs index 6e601ece..a18b8295 100644 --- a/rust/olm-deployer/src/data.rs +++ b/rust/olm-deployer/src/data.rs @@ -1,4 +1,6 @@ use anyhow::{bail, Result}; +use stackable_operator::kube::api::DynamicObject; +use stackable_operator::kube::ResourceExt; pub fn data_field_as_mut<'a>( value: &'a mut serde_json::Value, @@ -9,3 +11,66 @@ pub fn data_field_as_mut<'a>( x => bail!("invalid pointer {pointer} for object {x:?}"), } } + +pub fn container<'a>( + target: &'a mut DynamicObject, + container_name: &str, +) -> anyhow::Result<&'a mut serde_json::Value> { + let tname = target.name_any(); + let path = "template/spec/containers".split("/"); + match get_or_create(target.data.pointer_mut("/spec").unwrap(), path)? { + serde_json::Value::Array(containers) => { + for c in containers { + if c.is_object() { + if let Some(serde_json::Value::String(name)) = c.get("name") { + if container_name == name { + return Ok(c); + } + } + } else { + anyhow::bail!("container is not a object: {:?}", c); + } + } + anyhow::bail!("container named {container_name} not found"); + } + _ => anyhow::bail!("no containers found in object {tname}"), + } +} + +/// Returns the object nested in `root` by traversing the `path` of nested keys. +/// Creates any missing objects in path. +/// In case of success, the returned value is either the existing object or +/// serde_json::Value::Null. +/// Returns an error if any of the nested objects has a type other than map. +pub fn get_or_create<'a, 'b, I>( + root: &'a mut serde_json::Value, + path: I, +) -> anyhow::Result<&'a mut serde_json::Value> +where + I: IntoIterator, +{ + let mut iter = path.into_iter(); + match iter.next() { + None => Ok(root), + Some(first) => { + let new_root = get_or_insert_default_object(root, first)?; + get_or_create(new_root, iter) + } + } +} + +/// Given a map object create or return the object corresponding to the given `key`. +fn get_or_insert_default_object<'a>( + value: &'a mut serde_json::Value, + key: &str, +) -> anyhow::Result<&'a mut serde_json::Value> { + let map = match value { + serde_json::Value::Object(map) => map, + x @ serde_json::Value::Null => { + *x = serde_json::json!({}); + x.as_object_mut().unwrap() + } + x => anyhow::bail!("invalid type {x:?}, expected map"), + }; + Ok(map.entry(key).or_insert_with(|| serde_json::Value::Null)) +} diff --git a/rust/olm-deployer/src/env/mod.rs b/rust/olm-deployer/src/env/mod.rs index 3fe04286..40eb0660 100644 --- a/rust/olm-deployer/src/env/mod.rs +++ b/rust/olm-deployer/src/env/mod.rs @@ -1,40 +1,51 @@ -use stackable_operator::k8s_openapi::api::apps::v1::{DaemonSet, Deployment}; +use stackable_operator::k8s_openapi::api::apps::v1::Deployment; use stackable_operator::k8s_openapi::api::core::v1::EnvVar; -use stackable_operator::kube::api::DynamicObject; +use stackable_operator::kube::api::{DynamicObject, GroupVersionKind}; +use stackable_operator::kube::ResourceExt; +use crate::data::container; + +/// Copy the environment from the "secret-operator-deployer" container in `source` +/// to the container "secret-operator" in `target`. +/// The `target` must be a DaemonSet object. pub(super) fn maybe_copy_env( - deployment: &Deployment, - res: DynamicObject, -) -> anyhow::Result { - let ds: anyhow::Result = res.clone().try_parse(); - match ds { - Ok(mut daemonset) => { - if let Some(ps) = daemonset - .spec - .as_mut() - .and_then(|s| s.template.spec.as_mut()) - { - for c in ps.containers.iter_mut() { - if c.name == "secret-operator" { - let d_env = deployment_env_var(deployment); - match c.env.as_mut() { - Some(c_env) => c_env.extend(d_env.into_iter()), - _ => c.env = Some(d_env), + source: &Deployment, + target: &mut DynamicObject, + target_gvk: &GroupVersionKind, +) -> anyhow::Result<()> { + if target_gvk.kind == "DaemonSet" { + if let Some(env) = deployer_env_var(source) { + match container(target, "secret-operator")? { + serde_json::Value::Object(c) => { + let json_env = env + .iter() + .map(|e| serde_json::json!(e)) + .collect::>(); + + match c.get_mut("env") { + Some(env) => match env { + v @ serde_json::Value::Null => { + *v = serde_json::json!(json_env); + } + serde_json::Value::Array(container_env) => { + container_env.extend_from_slice(&json_env) + } + _ => anyhow::bail!("env is not null or an array"), + }, + None => { + c.insert("env".to_string(), serde_json::json!(json_env)); } } } + _ => anyhow::bail!("no containers found in object {}", target.name_any()), } - - // TODO: halp!! change this to a proper conversion. - let ret: DynamicObject = serde_yaml::from_str(&serde_yaml::to_string(&daemonset)?)?; - - Ok(ret) } - _ => Ok(res), } + + Ok(()) } -fn deployment_env_var(deployment: &Deployment) -> Vec { +fn deployer_env_var(deployment: &Deployment) -> Option<&Vec> { deployment .spec .as_ref() @@ -44,8 +55,7 @@ fn deployment_env_var(deployment: &Deployment) -> Vec { .flatten() .filter(|c| c.name == "secret-operator-deployer") .last() - .and_then(|c| c.env.clone()) - .unwrap_or_default() + .and_then(|c| c.env.as_ref()) } #[cfg(test)] @@ -112,9 +122,17 @@ spec: #[test] fn test_copy_env_var() -> Result<()> { - let daemonset = maybe_copy_env(&DEPLOYMENT, DAEMONSET.clone())?; + let gvk: GroupVersionKind = GroupVersionKind { + kind: "DaemonSet".to_string(), + version: "v1".to_string(), + group: "apps".to_string(), + }; - let expected = vec![ + let mut daemonset = DAEMONSET.clone(); + + maybe_copy_env(&DEPLOYMENT, &mut daemonset, &gvk)?; + + let expected = serde_json::json!(vec![ EnvVar { name: "NAME1".to_string(), value: Some("value1".to_string()), @@ -125,24 +143,13 @@ spec: value: Some("value2".to_string()), ..EnvVar::default() }, - ]; + ]); assert_eq!( - daemonset_env(&daemonset.try_parse::()?), - expected + container(&mut daemonset, "secret-operator")? + .get("env") + .unwrap(), + &expected ); Ok(()) } - - fn daemonset_env(res: &DaemonSet) -> Vec { - res.spec - .as_ref() - .and_then(|ds| ds.template.spec.as_ref()) - .map(|ts| ts.containers.iter()) - .into_iter() - .flatten() - .filter(|c| c.name == "secret-operator") - .last() - .and_then(|c| c.env.clone()) - .unwrap_or_default() - } } diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 8abc5742..f924be1d 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -107,16 +107,16 @@ async fn main() -> Result<()> { let api = dynamic_api(ar, &caps.scope, kube_client.clone(), &namespace); // ---------- patch object - obj = tolerations::maybe_copy_tolerations(&deployment, obj)?; - obj = owner::maybe_update_owner( - obj, + tolerations::maybe_copy_tolerations(&deployment, &mut obj, &gvk)?; + owner::maybe_update_owner( + &mut obj, &caps.scope, &deployment, &cluster_role, )?; namespace::maybe_patch_namespace(&namespace, &mut obj, &gvk)?; - obj = env::maybe_copy_env(&deployment, obj)?; - obj = resources::copy_resources(&deployment, obj)?; + env::maybe_copy_env(&deployment, &mut obj, &gvk)?; + resources::maybe_copy_resources(&deployment, &mut obj, &gvk)?; // ---------- apply apply(&api, obj, &gvk.kind).await? } diff --git a/rust/olm-deployer/src/owner/mod.rs b/rust/olm-deployer/src/owner/mod.rs index 4a368dd9..67c51e98 100644 --- a/rust/olm-deployer/src/owner/mod.rs +++ b/rust/olm-deployer/src/owner/mod.rs @@ -7,20 +7,21 @@ use stackable_operator::kube::api::ResourceExt; use stackable_operator::kube::discovery::Scope; use stackable_operator::kube::Resource; -pub fn maybe_update_owner( - dynamic_object: DynamicObject, +/// Updates the owner list of the `target` according to it's scope. +/// For namespaced objects it uses the `ns_owner` whereas for cluster wide +/// objects it uses the `cluster_owner`. +pub(super) fn maybe_update_owner( + target: &mut DynamicObject, scope: &Scope, - deployment: &Deployment, - cluster_role: &ClusterRole, -) -> Result { - // TODO: skip SecurityContextConstraints ? - let owner_ref = owner_ref(scope, deployment, cluster_role)?; - let mut ret = dynamic_object.clone(); - match ret.metadata.owner_references { + ns_owner: &Deployment, + cluster_owner: &ClusterRole, +) -> Result<()> { + let owner_ref = owner_ref(scope, ns_owner, cluster_owner)?; + match target.metadata.owner_references { Some(ref mut ors) => ors.push(owner_ref), - None => ret.metadata.owner_references = Some(vec![owner_ref]), + None => target.metadata.owner_references = Some(vec![owner_ref]), } - Ok(ret) + Ok(()) } fn owner_ref(scope: &Scope, depl: &Deployment, cr: &ClusterRole) -> Result { @@ -117,8 +118,9 @@ rules: #[test] fn test_namespaced_owner() -> Result<()> { - let daemonset = maybe_update_owner( - DAEMONSET.clone(), + let mut daemonset = DAEMONSET.clone(); + maybe_update_owner( + &mut daemonset, &Scope::Namespaced, &DEPLOYMENT, &CLUSTER_ROLE, @@ -137,12 +139,8 @@ rules: #[test] fn test_cluster_owner() -> Result<()> { - let daemonset = maybe_update_owner( - DAEMONSET.clone(), - &Scope::Cluster, - &DEPLOYMENT, - &CLUSTER_ROLE, - )?; + let mut daemonset = DAEMONSET.clone(); + maybe_update_owner(&mut daemonset, &Scope::Cluster, &DEPLOYMENT, &CLUSTER_ROLE)?; let expected = Some(vec![OwnerReference { uid: "d9287d0a-3069-47c3-8c90-b714dc6dddaa".to_string(), diff --git a/rust/olm-deployer/src/resources/mod.rs b/rust/olm-deployer/src/resources/mod.rs index 0a32a8b1..0849c243 100644 --- a/rust/olm-deployer/src/resources/mod.rs +++ b/rust/olm-deployer/src/resources/mod.rs @@ -1,36 +1,32 @@ -use stackable_operator::k8s_openapi::api::apps::v1::{DaemonSet, Deployment}; +use crate::data::container; +use stackable_operator::k8s_openapi::api::apps::v1::Deployment; use stackable_operator::k8s_openapi::api::core::v1::ResourceRequirements; -use stackable_operator::kube::api::DynamicObject; +use stackable_operator::kube::api::{DynamicObject, GroupVersionKind}; +use stackable_operator::kube::ResourceExt; -pub(super) fn copy_resources( - deployment: &Deployment, - res: DynamicObject, -) -> anyhow::Result { - let ds: anyhow::Result = res.clone().try_parse(); - match ds { - Ok(mut daemonset) => { - if let Some(ps) = daemonset - .spec - .as_mut() - .and_then(|s| s.template.spec.as_mut()) - { - for c in ps.containers.iter_mut() { - if c.name == "secret-operator" { - let d_res = deployment_resources(deployment); - c.resources = d_res; - } +/// Copies the resources of the container named "secret-operator-deployer" from `source` +/// to the container "secret-operator" in `target`. +/// Does nothing if there are no resources or if the `target` is not a DaemonSet. +pub(super) fn maybe_copy_resources( + source: &Deployment, + target: &mut DynamicObject, + target_gvk: &GroupVersionKind, +) -> anyhow::Result<()> { + if target_gvk.kind == "DaemonSet" { + if let Some(res) = deployment_resources(source) { + match container(target, "secret-operator")? { + serde_json::Value::Object(c) => { + c.insert("resources".to_string(), serde_json::json!(res)); } + _ => anyhow::bail!("no containers found in object {}", target.name_any()), } - // TODO: halp!! change this to a proper conversion. - let ret: DynamicObject = serde_yaml::from_str(&serde_yaml::to_string(&daemonset)?)?; - - Ok(ret) } - _ => Ok(res), } + + Ok(()) } -fn deployment_resources(deployment: &Deployment) -> Option { +fn deployment_resources(deployment: &Deployment) -> Option<&ResourceRequirements> { deployment .spec .as_ref() @@ -40,7 +36,7 @@ fn deployment_resources(deployment: &Deployment) -> Option .flatten() .filter(|c| c.name == "secret-operator-deployer") .last() - .and_then(|c| c.resources.clone()) + .and_then(|c| c.resources.as_ref()) } #[cfg(test)] @@ -48,6 +44,7 @@ mod test { use super::*; use anyhow::Result; use serde::Deserialize; + use stackable_operator::k8s_openapi::apimachinery::pkg::api::resource::Quantity; use std::sync::LazyLock; @@ -101,8 +98,8 @@ spec: value: value2 resources: limits: - cpu: 100m - memory: 512Mi + cpu: 1000m + memory: 1Gi requests: cpu: 100m memory: 512Mi @@ -121,25 +118,38 @@ spec: #[test] fn test_copy_env_var() -> Result<()> { - let daemonset = copy_resources(&DEPLOYMENT, DAEMONSET.clone())?; + let gvk: GroupVersionKind = GroupVersionKind { + kind: "DaemonSet".to_string(), + version: "v1".to_string(), + group: "apps".to_string(), + }; + let mut daemonset = DAEMONSET.clone(); + maybe_copy_resources(&DEPLOYMENT, &mut daemonset, &gvk)?; + + let expected = serde_json::json!(ResourceRequirements { + limits: Some( + [ + ("cpu".to_string(), Quantity("1000m".to_string())), + ("memory".to_string(), Quantity("1Gi".to_string())) + ] + .into() + ), + requests: Some( + [ + ("cpu".to_string(), Quantity("100m".to_string())), + ("memory".to_string(), Quantity("512Mi".to_string())) + ] + .into() + ), + ..ResourceRequirements::default() + }); assert_eq!( - daemonset_resources(&daemonset.try_parse::()?), - deployment_resources(&DEPLOYMENT), + container(&mut daemonset, "secret-operator")? + .get("resources") + .unwrap(), + &expected ); Ok(()) } - - fn daemonset_resources(daemonset: &DaemonSet) -> Option { - daemonset - .spec - .as_ref() - .and_then(|ds| ds.template.spec.as_ref()) - .map(|ts| ts.containers.iter()) - .into_iter() - .flatten() - .filter(|c| c.name == "secret-operator") - .last() - .and_then(|c| c.resources.clone()) - } } diff --git a/rust/olm-deployer/src/tolerations/mod.rs b/rust/olm-deployer/src/tolerations/mod.rs index 528b8f20..3ac642fd 100644 --- a/rust/olm-deployer/src/tolerations/mod.rs +++ b/rust/olm-deployer/src/tolerations/mod.rs @@ -1,34 +1,29 @@ -use stackable_operator::k8s_openapi::api::apps::v1::{DaemonSet, Deployment}; +use stackable_operator::k8s_openapi::api::apps::v1::Deployment; use stackable_operator::k8s_openapi::api::core::v1::Toleration; -use stackable_operator::kube::api::DynamicObject; +use stackable_operator::kube::api::{DynamicObject, GroupVersionKind}; -pub(super) fn maybe_copy_tolerations( - deployment: &Deployment, - res: DynamicObject, -) -> anyhow::Result { - let ds: anyhow::Result = res.clone().try_parse(); - match ds { - Ok(mut daemonset) => { - if let Some(dts) = deployment_tolerations(deployment) { - if let Some(pod_spec) = daemonset - .spec - .as_mut() - .and_then(|s| s.template.spec.as_mut()) - { - match pod_spec.tolerations.as_mut() { - Some(ta) => ta.extend(dts.clone()), - _ => pod_spec.tolerations = Some(dts.clone()), - } - } - } - - // TODO: halp!! change this to a proper conversion. - let ret: DynamicObject = serde_yaml::from_str(&serde_yaml::to_string(&daemonset)?)?; +use crate::data::get_or_create; - Ok(ret) +/// Copies the pod tolerations from the `source` to the `target`. +/// Does nothing if there are no tolerations or if the `target` is not +/// a DaemonSet. +pub(super) fn maybe_copy_tolerations( + source: &Deployment, + target: &mut DynamicObject, + target_gvk: &GroupVersionKind, +) -> anyhow::Result<()> { + if target_gvk.kind == "DaemonSet" { + if let Some(tolerations) = deployment_tolerations(source) { + let path = "template/spec/tolerations".split("/"); + *get_or_create(target.data.pointer_mut("/spec").unwrap(), path)? = + serde_json::json!(tolerations + .iter() + .map(|t| serde_json::json!(t)) + .collect::>()); } - _ => Ok(res), } + + Ok(()) } fn deployment_tolerations(deployment: &Deployment) -> Option<&Vec> { @@ -98,19 +93,25 @@ spec: #[test] fn test_copy_tolerations() -> Result<()> { - let daemonset = maybe_copy_tolerations(&DEPLOYMENT, DAEMONSET.clone())?; + let gvk: GroupVersionKind = GroupVersionKind { + kind: "DaemonSet".to_string(), + version: "v1".to_string(), + group: "apps".to_string(), + }; + + let mut daemonset = DAEMONSET.clone(); + maybe_copy_tolerations(&DEPLOYMENT, &mut daemonset, &gvk)?; + + let expected = serde_json::json!(deployment_tolerations(&DEPLOYMENT) + .unwrap() + .iter() + .map(|t| serde_json::json!(t)) + .collect::>()); assert_eq!( - daemonset_tolerations(&daemonset.try_parse::()?), - deployment_tolerations(&DEPLOYMENT) + daemonset.data.pointer("/spec/template/spec/tolerations"), + Some(&expected) ); Ok(()) } - - fn daemonset_tolerations(res: &DaemonSet) -> Option<&Vec> { - res.spec - .as_ref() - .and_then(|s| s.template.spec.as_ref()) - .and_then(|ps| ps.tolerations.as_ref()) - } } From 790cf2c76fbce7e5709d03a1d557cd3f1a5d5ebe Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Wed, 22 Jan 2025 14:51:00 +0100 Subject: [PATCH 23/30] added keep_alive cli option --- rust/olm-deployer/src/main.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index f924be1d..75e83e4f 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -19,6 +19,7 @@ use stackable_operator::logging; use stackable_operator::utils; use stackable_operator::utils::cluster_info::KubernetesClusterInfoOpts; use stackable_operator::{k8s_openapi::api::apps::v1::Deployment, kube::api::DynamicObject}; +use tokio::time::sleep; pub const APP_NAME: &str = "stkbl-secret-olm-deployer"; pub const ENV_VAR_LOGGING: &str = "STKBL_SECRET_OLM_DEPLOYER_LOG"; @@ -36,6 +37,8 @@ struct Opts { #[derive(clap::Parser)] struct OlmDeployerRun { + #[arg(long, short, default_value = "false")] + keep_alive: bool, // Operator version to be deployed. Used to resolve the name of the ClusterRole created by OLM and // used as owner for cluster wide objecs. #[arg(long, short)] @@ -55,6 +58,7 @@ struct OlmDeployerRun { async fn main() -> Result<()> { let opts = Opts::parse(); if let Command::Run(OlmDeployerRun { + keep_alive, op_version, namespace, dir, @@ -123,10 +127,19 @@ async fn main() -> Result<()> { } } Err(e) => { - tracing::error!("Error reading manifest file: {}", e); + bail!("Error reading manifest file: {}", e); } } } + + if keep_alive { + // keep the pod running + tokio::spawn(async { + loop { + sleep(std::time::Duration::from_secs(60)).await; + } + }); + } } Ok(()) From 850a0d0bd90bbd2043fb43b2142b3dc39e191a0b Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:46:56 +0100 Subject: [PATCH 24/30] sleep forever --- rust/olm-deployer/src/main.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 75e83e4f..b2099ea0 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -134,11 +134,7 @@ async fn main() -> Result<()> { if keep_alive { // keep the pod running - tokio::spawn(async { - loop { - sleep(std::time::Duration::from_secs(60)).await; - } - }); + tokio::time::sleep(std::time::Duration::from_secs(u64::MAX)).await; } } From 99ec5fd93e0f2cfe550a751d3c25194d994a49df Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:54:37 +0100 Subject: [PATCH 25/30] fix lint --- rust/olm-deployer/src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index b2099ea0..373ac83b 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -19,7 +19,6 @@ use stackable_operator::logging; use stackable_operator::utils; use stackable_operator::utils::cluster_info::KubernetesClusterInfoOpts; use stackable_operator::{k8s_openapi::api::apps::v1::Deployment, kube::api::DynamicObject}; -use tokio::time::sleep; pub const APP_NAME: &str = "stkbl-secret-olm-deployer"; pub const ENV_VAR_LOGGING: &str = "STKBL_SECRET_OLM_DEPLOYER_LOG"; From 2c577caa15f90aae698d5f4ba874424f4700b35c Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 4 Feb 2025 17:35:58 +0100 Subject: [PATCH 26/30] Update inline docs. --- rust/olm-deployer/src/env/mod.rs | 2 +- rust/olm-deployer/src/main.rs | 13 +++++++++++++ rust/olm-deployer/src/namespace/mod.rs | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/rust/olm-deployer/src/env/mod.rs b/rust/olm-deployer/src/env/mod.rs index 1c6285e8..4e4d7e32 100644 --- a/rust/olm-deployer/src/env/mod.rs +++ b/rust/olm-deployer/src/env/mod.rs @@ -10,7 +10,7 @@ use crate::data::container; /// Copy the environment from the "secret-operator-deployer" container in `source` /// to the container "secret-operator" in `target`. -/// The `target` must be a DaemonSet object. +/// The `target` must be a DaemonSet object otherwise this is a no-op. pub(super) fn maybe_copy_env( source: &Deployment, target: &mut DynamicObject, diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 3ee378f1..620c7cda 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -1,3 +1,16 @@ +/// This program acts as a proxy Deployment in OLM environments that installs the secret operator. +/// The operator manifests are read from a directory and patched before being submitted to the +/// control plane. +/// It expects the following objects to exist (they are created by OLM) and uses them as +/// sources for patch data: +/// - A Deployment named "secret-operator-deployer" in the target namespace. +/// - A ClusterRole owned by the same CSV that deployed this tool. +/// +/// See the documentation of the `maybe_*` functions for patching details. +/// +/// The `keep-alive` cli option prevents the program from finishing and thus for OLM +/// to observe it as a failure. +/// mod data; mod env; mod namespace; diff --git a/rust/olm-deployer/src/namespace/mod.rs b/rust/olm-deployer/src/namespace/mod.rs index a64a315a..6644b45a 100644 --- a/rust/olm-deployer/src/namespace/mod.rs +++ b/rust/olm-deployer/src/namespace/mod.rs @@ -4,6 +4,8 @@ use stackable_operator::kube::api::{DynamicObject, GroupVersionKind}; use crate::data; +/// Path the namespace of the autoTls secret class. +/// Otherwise do nothing. pub(super) fn maybe_patch_namespace( ns: &str, res: &mut DynamicObject, From 151951907af89cebefe6f0c9e6fed59fdc03bd69 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:42:11 +0100 Subject: [PATCH 27/30] Drop the op_version arg in favor of the csv name. --- rust/olm-deployer/src/main.rs | 51 ++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 620c7cda..3fa37a6e 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -50,15 +50,22 @@ struct Opts { #[derive(clap::Parser)] struct OlmDeployerRun { - #[arg(long, short, default_value = "false")] + #[arg( + long, + short, + default_value = "false", + help = "Keep running after manifests have been successfully applyed." + )] keep_alive: bool, - // Operator version to be deployed. Used to resolve the name of the ClusterRole created by OLM and - // used as owner for cluster wide objecs. - #[arg(long, short)] - op_version: String, - #[arg(long, short)] + #[arg( + long, + short, + help = "Name of ClusterServiceVersion object that owns this Deployment." + )] + csv: String, + #[arg(long, short, help = "Namespace of the ClusterServiceVersion object.")] namespace: String, - #[arg(long, short)] + #[arg(long, short, help = "Directory with manifests to patch and apply.")] dir: std::path::PathBuf, /// Tracing log collector system #[arg(long, env, default_value_t, value_enum)] @@ -72,7 +79,7 @@ async fn main() -> Result<()> { let opts = Opts::parse(); if let Command::Run(OlmDeployerRun { keep_alive, - op_version, + csv, namespace, dir, tracing_target, @@ -92,10 +99,8 @@ async fn main() -> Result<()> { let client = client::initialize_operator(Some(APP_NAME.to_string()), &cluster_info_opts).await?; - let deployment_api = client.get_api::(&namespace); - let deployment: Deployment = deployment_api.get("secret-operator-deployer").await?; - - let cluster_role: ClusterRole = get_cluster_role(&op_version, &client).await?; + let deployment = get_deployment(&csv, &namespace, &client).await?; + let cluster_role = get_cluster_role(&csv, &client).await?; let kube_client = client.as_kube_client(); // discovery (to be able to infer apis from kind/plural only) @@ -185,9 +190,8 @@ fn dynamic_api( } } -async fn get_cluster_role(op_version: &str, client: &client::Client) -> Result { - let labels = - format!("olm.owner=secret-operator.v{op_version},olm.owner.kind=ClusterServiceVersion"); +async fn get_cluster_role(csv: &str, client: &client::Client) -> Result { + let labels = format!("olm.owner={csv},olm.owner.kind=ClusterServiceVersion"); let lp = ListParams { label_selector: Some(labels.clone()), ..ListParams::default() @@ -201,3 +205,20 @@ async fn get_cluster_role(op_version: &str, client: &client::Client) -> Result Result { + let labels = format!("olm.owner={csv},olm.owner.kind=ClusterServiceVersion"); + let lp = ListParams { + label_selector: Some(labels.clone()), + ..ListParams::default() + }; + + let deployment_api = client.get_api::(namespace); + let result = deployment_api.list(&lp).await?.items; + + match result.len() { + 0 => bail!("no deployment owned by the csv {csv} found in namespace {namespace}"), + 1 => Ok(result.first().unwrap().clone()), + _ => bail!("multiple deployments owned by the csv {csv} found but only one was expected"), + } +} From 57b431ef3c31bf005e673a69a09158e22ab92742 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:07:54 +0100 Subject: [PATCH 28/30] Update changelog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 076a5a40..2040bfc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. - Made RSA key length configurable for certificates issued by cert-manager ([#528]). - Kerberos principal backends now also provision principals for IP address, not just DNS hostnames ([#552]). +- OLM deployment helper ([#546]). ### Changed @@ -22,6 +23,7 @@ All notable changes to this project will be documented in this file. [#548]: https://github.com/stackabletech/secret-operator/pull/548 [#552]: https://github.com/stackabletech/secret-operator/pull/552 [#544]: https://github.com/stackabletech/secret-operator/pull/544 +[#546]: https://github.com/stackabletech/secret-operator/pull/546 ## [24.11.1] - 2025-01-10 From 70160aefa1897fe45583b940d0812ed76d71edcf Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:24:53 +0100 Subject: [PATCH 29/30] fix typos --- rust/olm-deployer/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/olm-deployer/src/main.rs b/rust/olm-deployer/src/main.rs index 3fa37a6e..f4a3882a 100644 --- a/rust/olm-deployer/src/main.rs +++ b/rust/olm-deployer/src/main.rs @@ -3,7 +3,7 @@ /// control plane. /// It expects the following objects to exist (they are created by OLM) and uses them as /// sources for patch data: -/// - A Deployment named "secret-operator-deployer" in the target namespace. +/// - A Deployment owned by the CSV in the target namespace. /// - A ClusterRole owned by the same CSV that deployed this tool. /// /// See the documentation of the `maybe_*` functions for patching details. @@ -54,7 +54,7 @@ struct OlmDeployerRun { long, short, default_value = "false", - help = "Keep running after manifests have been successfully applyed." + help = "Keep running after manifests have been successfully applied." )] keep_alive: bool, #[arg( From 00520b49478923eace7ad5bca314f218cce31d2a Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:33:57 +0100 Subject: [PATCH 30/30] update readme to mention oci.stackable.tech --- rust/olm-deployer/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rust/olm-deployer/README.md b/rust/olm-deployer/README.md index ddaad4e5..95a27a51 100644 --- a/rust/olm-deployer/README.md +++ b/rust/olm-deployer/README.md @@ -13,6 +13,9 @@ $ ./olm/build-bundles.sh -c $HOME/repo/stackable/openshift-certified-operators - ... ``` +[!NOTE] +Bundle images are published to `oci.stackable.tech` so you need to log in there first. + The secret op and all it's dependencies should be installed and running in the `stackable-operators` namespace. Run the integration tests: