From f6efcbe574db196c20b0e1e4b6126622012ae895 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Tue, 3 Mar 2026 10:51:38 +0100 Subject: [PATCH 01/10] feat: Implement generic database connection --- Cargo.lock | 207 ++++++------ Cargo.nix | 309 ++++++++---------- Cargo.toml | 4 +- crate-hashes.json | 9 - extra/crds.yaml | 308 ++++++++++++++++- .../operator-binary/src/airflow_controller.rs | 63 +++- rust/operator-binary/src/crd/affinity.rs | 4 +- rust/operator-binary/src/crd/databases.rs | 68 ++++ rust/operator-binary/src/crd/mod.rs | 56 +++- rust/operator-binary/src/env_vars.rs | 61 ++-- rust/operator-binary/src/operations/pdb.rs | 4 +- .../smoke/40-install-airflow-cluster.yaml.j2 | 37 ++- 12 files changed, 762 insertions(+), 368 deletions(-) create mode 100644 rust/operator-binary/src/crd/databases.rs diff --git a/Cargo.lock b/Cargo.lock index fb0571e7..d1772102 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arc-swap" @@ -141,7 +141,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -152,7 +152,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -290,9 +290,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6f81257d10a0f602a294ae4182251151ff97dbb504ef9afcdda4a64b24d9b4" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytes" @@ -331,9 +331,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "num-traits", @@ -342,9 +342,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.59" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" +checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" dependencies = [ "clap_builder", "clap_derive", @@ -352,9 +352,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.59" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" +checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" dependencies = [ "anstream", "anstyle", @@ -371,7 +371,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -539,7 +539,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -550,7 +550,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -561,7 +561,7 @@ checksum = "780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -585,14 +585,14 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] name = "deranged" -version = "0.5.6" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", ] @@ -615,7 +615,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -638,7 +638,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -690,7 +690,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -754,7 +754,7 @@ checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -932,7 +932,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1458,9 +1458,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" +checksum = "819b44bc7c87d9117eb522f14d46e918add69ff12713c475946b0a29363ed1c2" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -1473,13 +1473,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" +checksum = "470252db18ecc35fd766c0891b1e3ec6cbbcd62507e85276c01bf75d8e94d4a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1509,9 +1509,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -1568,7 +1568,6 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "darling", "regex", @@ -1649,7 +1648,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1719,9 +1718,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libz-sys" -version = "1.1.23" +version = "1.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +checksum = "4735e9cbde5aac84a5ce588f6b23a90b9b0b528f6c5a8db8a4aff300463a0839" dependencies = [ "cc", "libc", @@ -2076,7 +2075,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2091,29 +2090,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -2194,7 +2193,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2260,7 +2259,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2379,7 +2378,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2407,9 +2406,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "relative-path" @@ -2521,7 +2520,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.116", + "syn 2.0.117", "unicode-ident", ] @@ -2536,9 +2535,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.36" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "log", "once_cell", @@ -2625,7 +2624,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2659,9 +2658,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.6.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ "bitflags", "core-foundation", @@ -2672,9 +2671,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.16.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -2723,7 +2722,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2734,7 +2733,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2900,7 +2899,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2963,7 +2962,6 @@ dependencies = [ [[package]] name = "stackable-certs" version = "0.4.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "const-oid", "ecdsa", @@ -2987,7 +2985,6 @@ dependencies = [ [[package]] name = "stackable-operator" version = "0.106.2" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "clap", "const_format", @@ -3026,18 +3023,16 @@ dependencies = [ [[package]] name = "stackable-operator-derive" version = "0.3.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] name = "stackable-shared" version = "0.1.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "jiff", "k8s-openapi", @@ -3054,7 +3049,6 @@ dependencies = [ [[package]] name = "stackable-telemetry" version = "0.6.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "axum", "clap", @@ -3078,7 +3072,6 @@ dependencies = [ [[package]] name = "stackable-versioned" version = "0.8.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "schemars", "serde", @@ -3091,7 +3084,6 @@ dependencies = [ [[package]] name = "stackable-versioned-macros" version = "0.8.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "convert_case", "convert_case_extras", @@ -3103,13 +3095,12 @@ dependencies = [ "kube", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] name = "stackable-webhook" version = "0.9.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#f9b117c8c08557e9774f33145bb009fb74cb2437" dependencies = [ "arc-swap", "async-trait", @@ -3161,7 +3152,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3183,9 +3174,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.116" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -3209,7 +3200,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3238,7 +3229,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3249,7 +3240,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3320,7 +3311,7 @@ checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3348,7 +3339,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3418,9 +3409,9 @@ dependencies = [ [[package]] name = "tonic" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f32a6f80051a4111560201420c7885d0082ba9efe2ab61875c587bb6b18b9a0" +checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" dependencies = [ "async-trait", "base64", @@ -3445,9 +3436,9 @@ dependencies = [ [[package]] name = "tonic-prost" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f86539c0089bfd09b1f8c0ab0239d80392af74c21bc9e0f15e1b4aca4c1647f" +checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" dependencies = [ "bytes", "prost", @@ -3538,7 +3529,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3735,9 +3726,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -3748,9 +3739,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", "futures-util", @@ -3762,9 +3753,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3772,22 +3763,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] @@ -3828,9 +3819,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.85" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -3867,7 +3858,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3878,7 +3869,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -4100,7 +4091,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn 2.0.116", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -4116,7 +4107,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -4203,28 +4194,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -4244,7 +4235,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "synstructure", ] @@ -4265,7 +4256,7 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -4298,7 +4289,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] diff --git a/Cargo.nix b/Cargo.nix index 58729c37..2c435491 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -332,14 +332,13 @@ rec { }; "anyhow" = rec { crateName = "anyhow"; - version = "1.0.101"; + version = "1.0.102"; edition = "2021"; - sha256 = "1skmg90fnjnlgs3vl7bksw7036d3rqwqj20n2fxd2ppg67p0y3jz"; + sha256 = "0b447dra1v12z474c6z4jmicdmc5yxz5bakympdnij44ckw2s83z"; authors = [ "David Tolnay " ]; features = { - "backtrace" = [ "dep:backtrace" ]; "default" = [ "std" ]; }; resolvedDefaultFeatures = [ "default" "std" ]; @@ -440,7 +439,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" "visit-mut" ]; } ]; @@ -467,7 +466,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "clone-impls" "full" "parsing" "printing" "proc-macro" "visit-mut" ]; } @@ -931,9 +930,9 @@ rec { }; "bumpalo" = rec { crateName = "bumpalo"; - version = "3.20.1"; + version = "3.20.2"; edition = "2021"; - sha256 = "1d6r4i5sd96xzjdfy15mvfbzyl8i4n143blll81gd80hgljq2vsw"; + sha256 = "1jrgxlff76k9glam0akhwpil2fr1w32gbjdf5hpipc7ld2c7h82x"; authors = [ "Nick Fitzgerald " ]; @@ -1047,9 +1046,9 @@ rec { }; "chrono" = rec { crateName = "chrono"; - version = "0.4.43"; + version = "0.4.44"; edition = "2021"; - sha256 = "06312amlyys4kkjazl13mbxw0j2f7zxygzjkr1yk7s2sn57p9i7s"; + sha256 = "1c64mk9a235271j5g3v4zrzqqmd43vp9vki7vqfllpqf5rd0fwy6"; dependencies = [ { name = "iana-time-zone"; @@ -1096,10 +1095,10 @@ rec { }; "clap" = rec { crateName = "clap"; - version = "4.5.59"; + version = "4.5.60"; edition = "2021"; crateBin = []; - sha256 = "16b4kgj909yyshz9kj7nkalbyi46yz1lrhqha54wbbn32x6zgjn5"; + sha256 = "02h3nzznssjgp815nnbzk0r62y2iw03kdli75c233kirld6z75r7"; dependencies = [ { name = "clap_builder"; @@ -1138,9 +1137,9 @@ rec { }; "clap_builder" = rec { crateName = "clap_builder"; - version = "4.5.59"; + version = "4.5.60"; edition = "2021"; - sha256 = "094fc76nsq3v52r1a9rbwix22cqnda8p2wr2a24j302v0r2sl39p"; + sha256 = "0xk8mdizvmmn6w5ij5cwhy5pbgyac4w9pfvl6nqmjl7a5hql38i4"; dependencies = [ { name = "anstream"; @@ -1196,7 +1195,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" ]; } ]; @@ -1658,7 +1657,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" "extra-traits" ]; } ]; @@ -1689,7 +1688,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; @@ -1715,7 +1714,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" "visit-mut" ]; } ]; @@ -1792,7 +1791,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "extra-traits" ]; } ]; @@ -1800,9 +1799,9 @@ rec { }; "deranged" = rec { crateName = "deranged"; - version = "0.5.6"; + version = "0.5.8"; edition = "2021"; - sha256 = "1i48p5l878bw4qzi1wz43lrq3jvplhpdzfxvjg0x3qn2janwagfc"; + sha256 = "0711df3w16vx80k55ivkwzwswziinj4dz05xci3rvmn15g615n3w"; authors = [ "Jacob Pratt " ]; @@ -1894,7 +1893,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; buildDependencies = [ @@ -1991,7 +1990,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; features = { @@ -2157,13 +2156,13 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; devDependencies = [ { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" ]; } ]; @@ -2364,7 +2363,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; features = { @@ -2877,7 +2876,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" ]; } ]; @@ -4697,9 +4696,9 @@ rec { }; "jiff" = rec { crateName = "jiff"; - version = "0.2.20"; + version = "0.2.22"; edition = "2021"; - sha256 = "0hv59kcqj5sc0jgk4q7yrq5dp8yb3qlan98qk3s36sq9ribc6ry8"; + sha256 = "1hni7qv2j2kbjisw84r7y6gxdb8qx534vw92nmz13nc7gjy496w1"; authors = [ "Andrew Gallant " ]; @@ -4779,9 +4778,9 @@ rec { }; "jiff-static" = rec { crateName = "jiff-static"; - version = "0.2.20"; + version = "0.2.22"; edition = "2021"; - sha256 = "1rcvbp9aj8ll4ljxcgzq4l2h9idmkb0v6mdvf3r3i5r64m1np57p"; + sha256 = "18fljj75vxqvq1v55s074pbbrjy67qg1p2f0cvbmzhzc33dm40j7"; procMacro = true; libName = "jiff_static"; authors = [ @@ -4798,7 +4797,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; features = { @@ -4861,9 +4860,9 @@ rec { }; "js-sys" = rec { crateName = "js-sys"; - version = "0.3.85"; + version = "0.3.91"; edition = "2021"; - sha256 = "1csmb42fxjmzjdgc790bgw77sf1cb9ydm5rdsnh5qj4miszjx54c"; + sha256 = "171rzgq33wc1nxkgnvhlqqwwnrifs13mg3jjpjj5nf1z0yvib5xl"; libName = "js_sys"; authors = [ "The wasm-bindgen Developers" @@ -4881,10 +4880,10 @@ rec { } ]; features = { - "default" = [ "std" ]; + "default" = [ "std" "unsafe-eval" ]; "std" = [ "wasm-bindgen/std" ]; }; - resolvedDefaultFeatures = [ "default" "std" ]; + resolvedDefaultFeatures = [ "default" "std" "unsafe-eval" ]; }; "json-patch" = rec { crateName = "json-patch"; @@ -5050,12 +5049,7 @@ rec { crateName = "k8s-version"; version = "0.1.3"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/k8s-version; }; libName = "k8s_version"; authors = [ "Stackable GmbH " @@ -5520,7 +5514,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "extra-traits" ]; } ]; @@ -5771,10 +5765,10 @@ rec { }; "libz-sys" = rec { crateName = "libz-sys"; - version = "1.1.23"; + version = "1.1.24"; edition = "2018"; links = "z"; - sha256 = "1xy0l46gmhfyk28r9pm7njl0h7dh8l2vpiqw67kn043pyfxiil8m"; + sha256 = "0f8879301wxgljw8snkcix90p6qbm4inp3sqrsjq9b2svv5yjda7"; libName = "libz_sys"; authors = [ "Alex Crichton " @@ -7026,7 +7020,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; features = { @@ -7065,9 +7059,9 @@ rec { }; "pin-project" = rec { crateName = "pin-project"; - version = "1.1.10"; + version = "1.1.11"; edition = "2021"; - sha256 = "12kadbnfm1f43cyadw9gsbyln1cy7vj764wz5c8wxaiza3filzv7"; + sha256 = "05zm3y3bl83ypsr6favxvny2kys4i19jiz1y18ylrbxwsiz9qx7i"; libName = "pin_project"; dependencies = [ { @@ -7079,9 +7073,9 @@ rec { }; "pin-project-internal" = rec { crateName = "pin-project-internal"; - version = "1.1.10"; + version = "1.1.11"; edition = "2021"; - sha256 = "0qgqzfl0f4lzaz7yl5llhbg97g68r15kljzihaw9wm64z17qx4bf"; + sha256 = "1ik4mpb92da75inmjvxf2qm61vrnwml3x24wddvrjlqh1z9hxcnr"; procMacro = true; libName = "pin_project_internal"; dependencies = [ @@ -7095,7 +7089,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "parsing" "printing" "clone-impls" "proc-macro" "full" "visit-mut" ]; } @@ -7104,9 +7098,9 @@ rec { }; "pin-project-lite" = rec { crateName = "pin-project-lite"; - version = "0.2.16"; + version = "0.2.17"; edition = "2018"; - sha256 = "16wzc7z7dfkf9bmjin22f5282783f6mdksnr0nv0j5ym5f9gyg1v"; + sha256 = "1kfmwvs271si96zay4mm8887v5khw0c27jc9srw1a75ykvgj54x8"; libName = "pin_project_lite"; }; @@ -7310,7 +7304,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "full" ]; } @@ -7323,7 +7317,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "clone-impls" "extra-traits" "parsing" "printing" "visit-mut" ]; } @@ -7511,7 +7505,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "extra-traits" ]; } ]; @@ -7843,7 +7837,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; @@ -7969,9 +7963,9 @@ rec { }; "regex-syntax" = rec { crateName = "regex-syntax"; - version = "0.8.9"; + version = "0.8.10"; edition = "2021"; - sha256 = "0k0a47r1rcl794wj8a948niakbg081s5pp5nlgcbmmr2iy3qfs59"; + sha256 = "02jx311ka0daxxc7v45ikzhcl3iydjbbb0mdrpc1xgg8v7c7v2fw"; libName = "regex_syntax"; authors = [ "The Rust Project Developers" @@ -8501,7 +8495,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" "parsing" "extra-traits" "visit" "visit-mut" ]; } { @@ -8536,9 +8530,9 @@ rec { }; "rustls" = rec { crateName = "rustls"; - version = "0.23.36"; + version = "0.23.37"; edition = "2021"; - sha256 = "06w0077ssk3blpp93613lkny046mwj0nhxjgc7cmg9nf70yz6rf6"; + sha256 = "193k5h0wcih6ghvkrxyzwncivr1bd3a8yw3lzp13pzfcbz5jb03m"; dependencies = [ { name = "log"; @@ -8843,13 +8837,13 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; devDependencies = [ { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "extra-traits" ]; } ]; @@ -8949,9 +8943,9 @@ rec { }; "security-framework" = rec { crateName = "security-framework"; - version = "3.6.0"; - edition = "2021"; - sha256 = "0f7cajmxfkxijl4g0blidqp0vyc4ndyc2wj3xslc6j39dn58jyyi"; + version = "3.7.0"; + edition = "2024"; + sha256 = "07fd0j29j8yczb3hd430vwz784lx9knb5xwbvqna1nbkbivvrx5p"; libName = "security_framework"; authors = [ "Steven Fackler " @@ -8981,21 +8975,19 @@ rec { } ]; features = { - "OSX_10_12" = [ "security-framework-sys/OSX_10_12" ]; - "OSX_10_13" = [ "OSX_10_12" "security-framework-sys/OSX_10_13" "alpn" "session-tickets" ]; - "OSX_10_14" = [ "OSX_10_13" "security-framework-sys/OSX_10_14" ]; - "OSX_10_15" = [ "OSX_10_14" "security-framework-sys/OSX_10_15" ]; - "default" = [ "OSX_10_12" ]; + "OSX_10_15" = [ "security-framework-sys/OSX_10_15" ]; + "default" = [ "OSX_10_14" "alpn" "session-tickets" ]; "log" = [ "dep:log" ]; + "macos-12" = [ "security-framework-sys/macos-12" ]; "sync-keychain" = [ "OSX_10_13" ]; }; - resolvedDefaultFeatures = [ "OSX_10_12" "default" ]; + resolvedDefaultFeatures = [ "OSX_10_14" "alpn" "default" "session-tickets" ]; }; "security-framework-sys" = rec { crateName = "security-framework-sys"; - version = "2.16.0"; + version = "2.17.0"; edition = "2021"; - sha256 = "06p6x6s8jysrkay1glazxl0r3drwsxwrhjh30lka9acjn1rqc71j"; + sha256 = "1qr0w0y9iwvmv3hwg653q1igngnc5b74xcf0679cbv23z0fnkqkc"; libName = "security_framework_sys"; authors = [ "Steven Fackler " @@ -9012,15 +9004,8 @@ rec { } ]; features = { - "OSX_10_10" = [ "OSX_10_9" ]; - "OSX_10_11" = [ "OSX_10_10" ]; - "OSX_10_12" = [ "OSX_10_11" ]; - "OSX_10_13" = [ "OSX_10_12" ]; - "OSX_10_14" = [ "OSX_10_13" ]; - "OSX_10_15" = [ "OSX_10_14" ]; - "default" = [ "OSX_10_12" ]; + "default" = [ "OSX_10_13" ]; }; - resolvedDefaultFeatures = [ "OSX_10_10" "OSX_10_11" "OSX_10_12" "OSX_10_9" ]; }; "semver" = rec { crateName = "semver"; @@ -9142,7 +9127,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" "proc-macro" ]; } @@ -9174,7 +9159,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" ]; } @@ -9661,7 +9646,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" ]; } ]; @@ -9878,12 +9863,7 @@ rec { crateName = "stackable-certs"; version = "0.4.0"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-certs; }; libName = "stackable_certs"; authors = [ "Stackable GmbH " @@ -9981,12 +9961,7 @@ rec { crateName = "stackable-operator"; version = "0.106.2"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-operator; }; libName = "stackable_operator"; authors = [ "Stackable GmbH " @@ -10154,12 +10129,7 @@ rec { crateName = "stackable-operator-derive"; version = "0.3.1"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-operator-derive; }; procMacro = true; libName = "stackable_operator_derive"; authors = [ @@ -10180,7 +10150,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; @@ -10189,12 +10159,7 @@ rec { crateName = "stackable-shared"; version = "0.1.0"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-shared; }; libName = "stackable_shared"; authors = [ "Stackable GmbH " @@ -10270,12 +10235,7 @@ rec { crateName = "stackable-telemetry"; version = "0.6.1"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-telemetry; }; libName = "stackable_telemetry"; authors = [ "Stackable GmbH " @@ -10380,12 +10340,7 @@ rec { crateName = "stackable-versioned"; version = "0.8.3"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-versioned; }; libName = "stackable_versioned"; authors = [ "Stackable GmbH " @@ -10424,12 +10379,7 @@ rec { crateName = "stackable-versioned-macros"; version = "0.8.3"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-versioned-macros; }; procMacro = true; libName = "stackable_versioned_macros"; authors = [ @@ -10483,7 +10433,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; @@ -10492,12 +10442,7 @@ rec { crateName = "stackable-webhook"; version = "0.9.0"; edition = "2024"; - workspace_member = null; - src = pkgs.fetchgit { - url = "https://github.com/stackabletech/operator-rs.git"; - rev = "f9b117c8c08557e9774f33145bb009fb74cb2437"; - sha256 = "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c"; - }; + src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-webhook; }; libName = "stackable_webhook"; authors = [ "Stackable GmbH " @@ -10674,7 +10619,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "parsing" ]; } ]; @@ -10728,11 +10673,11 @@ rec { }; resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "full" "parsing" "printing" "proc-macro" "quote" ]; }; - "syn 2.0.116" = rec { + "syn 2.0.117" = rec { crateName = "syn"; - version = "2.0.116"; + version = "2.0.117"; edition = "2021"; - sha256 = "1jv9pk48qmhn6yrdfl3lngy5i74wg7gcx13gfhvm4s8q0p3j9x1x"; + sha256 = "16cv7c0wbn8amxc54n4w15kxlx5ypdmla8s0gxr2l7bv7s0bhrg6"; authors = [ "David Tolnay " ]; @@ -10804,7 +10749,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "derive" "parsing" "printing" "clone-impls" "visit" "extra-traits" ]; } @@ -10871,7 +10816,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; @@ -10897,7 +10842,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; } ]; @@ -11114,7 +11059,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "parsing" ]; } ]; @@ -11260,7 +11205,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" ]; } ]; @@ -11487,9 +11432,9 @@ rec { }; "tonic" = rec { crateName = "tonic"; - version = "0.14.4"; + version = "0.14.5"; edition = "2021"; - sha256 = "185r31mvp1y5flcbcapyksx8402xi33j0510c0ai392i03wacckz"; + sha256 = "1v4k7aa28m7722gz9qak2jiy7lis1ycm4fdmq63iip4m0qdcdizy"; authors = [ "Lucio Franco " ]; @@ -11587,7 +11532,7 @@ rec { { name = "tokio"; packageId = "tokio"; - features = [ "rt-multi-thread" "macros" ]; + features = [ "rt-multi-thread" "macros" "test-util" ]; } { name = "tower"; @@ -11616,9 +11561,9 @@ rec { }; "tonic-prost" = rec { crateName = "tonic-prost"; - version = "0.14.4"; + version = "0.14.5"; edition = "2021"; - sha256 = "0zv4q6jard712l7rxg119kvjlfc0kliv02lc3ydx1gw902f571lz"; + sha256 = "02fkg2bv87q0yds2wz3w0s7i1x6qcgbrl00dy6ipajdapfh7clx5"; libName = "tonic_prost"; authors = [ "Lucio Franco " @@ -12018,7 +11963,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "full" "parsing" "printing" "visit-mut" "clone-impls" "extra-traits" "proc-macro" ]; } @@ -12607,9 +12552,9 @@ rec { }; "wasm-bindgen" = rec { crateName = "wasm-bindgen"; - version = "0.2.108"; + version = "0.2.114"; edition = "2021"; - sha256 = "0rl5pn80sdhj2p2r28lp3k50a8mpppzgwzssz2f3jdqyxhq4l0k4"; + sha256 = "13nkhw552hpllrrmkd2x9y4bmcxr82kdpky2n667kqzcq6jzjck5"; libName = "wasm_bindgen"; authors = [ "The wasm-bindgen Developers" @@ -12658,9 +12603,9 @@ rec { }; "wasm-bindgen-futures" = rec { crateName = "wasm-bindgen-futures"; - version = "0.4.58"; + version = "0.4.64"; edition = "2021"; - sha256 = "0vqywn9df5i6mms3sw47v3kj7rzx8ryghqq0xb4jk05fs1zyg9kh"; + sha256 = "1f3xnr40wwims4zhvh119dhwmffz4h4x82cffi118ri878mm5ig9"; libName = "wasm_bindgen_futures"; authors = [ "The wasm-bindgen Developers" @@ -12711,9 +12656,9 @@ rec { }; "wasm-bindgen-macro" = rec { crateName = "wasm-bindgen-macro"; - version = "0.2.108"; + version = "0.2.114"; edition = "2021"; - sha256 = "026nnvakp0w6j3ghpcxn31shj9wx8bv8x7nk3gkk40klkjfj72q0"; + sha256 = "1rhq9kkl7n0zjrag9p25xsi4aabpgfkyf02zn4xv6pqhrw7xb8hq"; procMacro = true; libName = "wasm_bindgen_macro"; authors = [ @@ -12735,9 +12680,9 @@ rec { }; "wasm-bindgen-macro-support" = rec { crateName = "wasm-bindgen-macro-support"; - version = "0.2.108"; + version = "0.2.114"; edition = "2021"; - sha256 = "0m9sj475ypgifbkvksjsqs2gy3bq96f87ychch784m4gspiblmjj"; + sha256 = "1qriqqjpn922kv5c7f7627fj823k5aifv06j2gvwsiy5map4rkh3"; libName = "wasm_bindgen_macro_support"; authors = [ "The wasm-bindgen Developers" @@ -12757,8 +12702,8 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; - features = [ "visit" "visit-mut" "full" ]; + packageId = "syn 2.0.117"; + features = [ "visit" "visit-mut" "full" "extra-traits" ]; } { name = "wasm-bindgen-shared"; @@ -12771,10 +12716,10 @@ rec { }; "wasm-bindgen-shared" = rec { crateName = "wasm-bindgen-shared"; - version = "0.2.108"; + version = "0.2.114"; edition = "2021"; links = "wasm_bindgen"; - sha256 = "04ix7v99rvj5730553j58pqsrwpf9sqazr60y3cchx5cr60ba08z"; + sha256 = "05lc6w64jxlk4wk8rjci4z61lhx2ams90la27a41gvi3qaw2d8vm"; libName = "wasm_bindgen_shared"; authors = [ "The wasm-bindgen Developers" @@ -12899,9 +12844,9 @@ rec { }; "web-sys" = rec { crateName = "web-sys"; - version = "0.3.85"; + version = "0.3.91"; edition = "2021"; - sha256 = "1645c202gyw21m6kxw4ya81vrapl40hlb8m9iqhjj8fra7jk4bii"; + sha256 = "1y91r8f4dy4iqgrr03swdzqffz6wmllrgninp8kgpaq4n5xs2jw5"; libName = "web_sys"; authors = [ "The wasm-bindgen Developers" @@ -12927,7 +12872,9 @@ rec { "Attr" = [ "EventTarget" "Node" ]; "AudioBufferSourceNode" = [ "AudioNode" "AudioScheduledSourceNode" "EventTarget" ]; "AudioContext" = [ "BaseAudioContext" "EventTarget" ]; + "AudioDecoder" = [ "EventTarget" ]; "AudioDestinationNode" = [ "AudioNode" "EventTarget" ]; + "AudioEncoder" = [ "EventTarget" ]; "AudioNode" = [ "EventTarget" ]; "AudioProcessingEvent" = [ "Event" ]; "AudioScheduledSourceNode" = [ "AudioNode" "EventTarget" ]; @@ -12960,6 +12907,7 @@ rec { "Clipboard" = [ "EventTarget" ]; "ClipboardEvent" = [ "Event" ]; "CloseEvent" = [ "Event" ]; + "CommandEvent" = [ "Event" ]; "Comment" = [ "CharacterData" "EventTarget" "Node" ]; "CompositionEvent" = [ "Event" "UiEvent" ]; "ConstantSourceNode" = [ "AudioNode" "AudioScheduledSourceNode" "EventTarget" ]; @@ -13117,7 +13065,6 @@ rec { "IdbVersionChangeEvent" = [ "Event" ]; "IirFilterNode" = [ "AudioNode" "EventTarget" ]; "ImageCaptureErrorEvent" = [ "Event" ]; - "ImageTrack" = [ "EventTarget" ]; "InputDeviceInfo" = [ "MediaDeviceInfo" ]; "InputEvent" = [ "Event" "UiEvent" ]; "KeyFrameRequestEvent" = [ "Event" ]; @@ -13191,6 +13138,7 @@ rec { "PublicKeyCredential" = [ "Credential" ]; "PushEvent" = [ "Event" "ExtendableEvent" ]; "RadioNodeList" = [ "NodeList" ]; + "Range" = [ "AbstractRange" ]; "RtcDataChannel" = [ "EventTarget" ]; "RtcDataChannelEvent" = [ "Event" ]; "RtcPeerConnection" = [ "EventTarget" ]; @@ -13228,6 +13176,7 @@ rec { "SpeechSynthesisErrorEvent" = [ "Event" "SpeechSynthesisEvent" ]; "SpeechSynthesisEvent" = [ "Event" ]; "SpeechSynthesisUtterance" = [ "EventTarget" ]; + "StaticRange" = [ "AbstractRange" ]; "StereoPannerNode" = [ "AudioNode" "EventTarget" ]; "StorageEvent" = [ "Event" ]; "SubmitEvent" = [ "Event" ]; @@ -13344,6 +13293,8 @@ rec { "UsbPermissionResult" = [ "EventTarget" "PermissionStatus" ]; "UserProximityEvent" = [ "Event" ]; "ValueEvent" = [ "Event" ]; + "VideoDecoder" = [ "EventTarget" ]; + "VideoEncoder" = [ "EventTarget" ]; "VideoStreamTrack" = [ "EventTarget" "MediaStreamTrack" ]; "VideoTrackList" = [ "EventTarget" ]; "VisualViewport" = [ "EventTarget" ]; @@ -13469,7 +13420,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "parsing" "proc-macro" "printing" "full" "clone-impls" ]; } @@ -13496,7 +13447,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; usesDefaultFeatures = false; features = [ "parsing" "proc-macro" "printing" "full" "clone-impls" ]; } @@ -14672,7 +14623,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "printing" ]; } { @@ -14723,7 +14674,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "printing" ]; } { @@ -15036,7 +14987,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "fold" ]; } { @@ -15048,9 +14999,9 @@ rec { }; "zerocopy" = rec { crateName = "zerocopy"; - version = "0.8.39"; + version = "0.8.40"; edition = "2021"; - sha256 = "0jmf1iqns5sq07k3dscsgyc706pycar67rrq4j9nrnzacgb3avfv"; + sha256 = "1r9j2mlb54q1l9pgall3mk0gg6cprhdncvbbgsgxnxmmj3jcd2d7"; authors = [ "Joshua Liebow-Feeser " "Jack Wrenn " @@ -15084,9 +15035,9 @@ rec { }; "zerocopy-derive" = rec { crateName = "zerocopy-derive"; - version = "0.8.39"; + version = "0.8.40"; edition = "2021"; - sha256 = "05z5yfq0mx3xdqadrgq5sd4d03nl82d9r0vp1qchaip9d4qws8j1"; + sha256 = "0lsrhg5nvf0c40z644a014l2nrvh7xw0ff3i9744k9vif2d4hp7n"; procMacro = true; libName = "zerocopy_derive"; authors = [ @@ -15104,14 +15055,14 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" ]; } ]; devDependencies = [ { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "visit" ]; } ]; @@ -15160,7 +15111,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "fold" ]; } { @@ -15214,7 +15165,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "full" "extra-traits" "visit" ]; } ]; @@ -15316,7 +15267,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.116"; + packageId = "syn 2.0.117"; features = [ "extra-traits" ]; } ]; diff --git a/Cargo.toml b/Cargo.toml index ef37b3ec..03d713f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,5 +33,5 @@ tokio = { version = "1.40", features = ["full"] } tracing = "0.1" [patch."https://github.com/stackabletech/operator-rs.git"] -# stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "main" } -# stackable-operator = { path = "../operator-rs/crates/stackable-operator" } +# stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "spike/generic-databases" } +stackable-operator = { path = "../operator-rs/crates/stackable-operator" } diff --git a/crate-hashes.json b/crate-hashes.json index b41e87f3..a7ddcc2d 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -4,14 +4,5 @@ "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-derive@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-runtime@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#k8s-version@0.1.3": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#stackable-certs@0.4.0": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#stackable-operator-derive@0.3.1": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#stackable-operator@0.106.2": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#stackable-shared@0.1.0": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#stackable-telemetry@0.6.1": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#stackable-versioned-macros@0.8.3": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#stackable-versioned@0.8.3": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.106.2#stackable-webhook@0.9.0": "1yg7hbpgclp1zvfnhi4qkrwbgsa19v86plh77vqvwxzdxxxvxr4c", "git+https://github.com/stackabletech/product-config.git?tag=0.8.0#product-config@0.8.0": "1dz70kapm2wdqcr7ndyjji0lhsl98bsq95gnb2lw487wf6yr7987" } \ No newline at end of file diff --git a/extra/crds.yaml b/extra/crds.yaml index 288919db..8ac69ffa 100644 --- a/extra/crds.yaml +++ b/extra/crds.yaml @@ -39,6 +39,99 @@ spec: The celery executor. Deployed with an explicit number of replicas. properties: + celeryBroker: + description: Connection information for the celery broker queue. + oneOf: + - required: + - redis + - required: + - generic + properties: + generic: + description: TODO docs + properties: + uriSecret: + description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. + type: string + required: + - uriSecret + type: object + redis: + description: TODO docs + properties: + credentialsSecret: + description: TODO docs + type: string + databaseId: + default: 0 + description: TODO docs + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + host: + description: TODO docs + type: string + port: + default: 6379 + description: TODO docs + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + required: + - credentialsSecret + - host + type: object + type: object + celeryResultBackend: + description: Connection information for the celery backend database. + oneOf: + - required: + - postgresql + - required: + - generic + properties: + generic: + description: TODO docs + properties: + uriSecret: + description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. + type: string + required: + - uriSecret + type: object + postgresql: + description: TODO docs + properties: + credentialsSecret: + description: TODO docs + type: string + database: + description: TODO docs + type: string + host: + description: TODO docs + type: string + parameters: + additionalProperties: + type: string + default: {} + description: TODO docs + type: object + port: + default: 5432 + description: TODO docs + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + required: + - credentialsSecret + - database + - host + type: object + type: object cliOverrides: additionalProperties: type: string @@ -1030,6 +1123,8 @@ spec: type: object type: object required: + - celeryBroker + - celeryResultBackend - roleGroups type: object clusterConfig: @@ -1135,16 +1230,14 @@ spec: type: object credentialsSecret: description: |- - The name of the Secret object containing the admin user credentials and database connection details. - Read the + The name of the Secret object containing the admin user credentials. Read the [getting started guide first steps](https://docs.stackable.tech/home/nightly/airflow/getting_started/first_steps) to find out more. type: string dagsGitSync: default: [] description: |- - The `gitSync` settings allow configuring DAGs to mount via `git-sync`. - Learn more in the + The `gitSync` settings allow configuring DAGs to mount via `git-sync`. Learn more in the [mounting DAGs documentation](https://docs.stackable.tech/home/nightly/airflow/usage-guide/mounting-dags#_via_git_sync). items: properties: @@ -1239,7 +1332,7 @@ spec: type: object exposeConfig: default: false - description: for internal use only - not for production use. + description: For internal use only - not for production use. type: boolean loadExamples: default: false @@ -1247,6 +1340,54 @@ spec: Whether to load example DAGs or not; defaults to false. The examples are used in the [getting started guide](https://docs.stackable.tech/home/nightly/airflow/getting_started/). type: boolean + metadataDatabase: + description: TODO docs + oneOf: + - required: + - postgresql + - required: + - generic + properties: + generic: + description: TODO docs + properties: + uriSecret: + description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. + type: string + required: + - uriSecret + type: object + postgresql: + description: TODO docs + properties: + credentialsSecret: + description: TODO docs + type: string + database: + description: TODO docs + type: string + host: + description: TODO docs + type: string + parameters: + additionalProperties: + type: string + default: {} + description: TODO docs + type: object + port: + default: 5432 + description: TODO docs + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + required: + - credentialsSecret + - database + - host + type: object + type: object vectorAggregatorConfigMapName: description: |- Name of the Vector aggregator [discovery ConfigMap](https://docs.stackable.tech/home/nightly/concepts/service_discovery). @@ -1271,6 +1412,7 @@ spec: type: array required: - credentialsSecret + - metadataDatabase type: object clusterOperation: default: @@ -2354,7 +2496,7 @@ spec: type: string type: object kubernetesExecutors: - description: With the Kuberentes executor, executor Pods are created on demand. + description: With the Kubernetes executor, executor Pods are created on demand. properties: cliOverrides: additionalProperties: @@ -5918,6 +6060,99 @@ spec: The celery executor. Deployed with an explicit number of replicas. properties: + celeryBroker: + description: Connection information for the celery broker queue. + oneOf: + - required: + - redis + - required: + - generic + properties: + generic: + description: TODO docs + properties: + uriSecret: + description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. + type: string + required: + - uriSecret + type: object + redis: + description: TODO docs + properties: + credentialsSecret: + description: TODO docs + type: string + databaseId: + default: 0 + description: TODO docs + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + host: + description: TODO docs + type: string + port: + default: 6379 + description: TODO docs + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + required: + - credentialsSecret + - host + type: object + type: object + celeryResultBackend: + description: Connection information for the celery backend database. + oneOf: + - required: + - postgresql + - required: + - generic + properties: + generic: + description: TODO docs + properties: + uriSecret: + description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. + type: string + required: + - uriSecret + type: object + postgresql: + description: TODO docs + properties: + credentialsSecret: + description: TODO docs + type: string + database: + description: TODO docs + type: string + host: + description: TODO docs + type: string + parameters: + additionalProperties: + type: string + default: {} + description: TODO docs + type: object + port: + default: 5432 + description: TODO docs + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + required: + - credentialsSecret + - database + - host + type: object + type: object cliOverrides: additionalProperties: type: string @@ -6909,6 +7144,8 @@ spec: type: object type: object required: + - celeryBroker + - celeryResultBackend - roleGroups type: object clusterConfig: @@ -7014,16 +7251,14 @@ spec: type: object credentialsSecret: description: |- - The name of the Secret object containing the admin user credentials and database connection details. - Read the + The name of the Secret object containing the admin user credentials. Read the [getting started guide first steps](https://docs.stackable.tech/home/nightly/airflow/getting_started/first_steps) to find out more. type: string dagsGitSync: default: [] description: |- - The `gitSync` settings allow configuring DAGs to mount via `git-sync`. - Learn more in the + The `gitSync` settings allow configuring DAGs to mount via `git-sync`. Learn more in the [mounting DAGs documentation](https://docs.stackable.tech/home/nightly/airflow/usage-guide/mounting-dags#_via_git_sync). items: properties: @@ -7094,7 +7329,7 @@ spec: type: object exposeConfig: default: false - description: for internal use only - not for production use. + description: For internal use only - not for production use. type: boolean loadExamples: default: false @@ -7102,6 +7337,54 @@ spec: Whether to load example DAGs or not; defaults to false. The examples are used in the [getting started guide](https://docs.stackable.tech/home/nightly/airflow/getting_started/). type: boolean + metadataDatabase: + description: TODO docs + oneOf: + - required: + - postgresql + - required: + - generic + properties: + generic: + description: TODO docs + properties: + uriSecret: + description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. + type: string + required: + - uriSecret + type: object + postgresql: + description: TODO docs + properties: + credentialsSecret: + description: TODO docs + type: string + database: + description: TODO docs + type: string + host: + description: TODO docs + type: string + parameters: + additionalProperties: + type: string + default: {} + description: TODO docs + type: object + port: + default: 5432 + description: TODO docs + format: uint16 + maximum: 65535.0 + minimum: 0.0 + type: integer + required: + - credentialsSecret + - database + - host + type: object + type: object vectorAggregatorConfigMapName: description: |- Name of the Vector aggregator [discovery ConfigMap](https://docs.stackable.tech/home/nightly/concepts/service_discovery). @@ -7126,6 +7409,7 @@ spec: type: array required: - credentialsSecret + - metadataDatabase type: object clusterOperation: default: @@ -8209,7 +8493,7 @@ spec: type: string type: object kubernetesExecutors: - description: With the Kuberentes executor, executor Pods are created on demand. + description: With the Kubernetes executor, executor Pods are created on demand. properties: cliOverrides: additionalProperties: diff --git a/rust/operator-binary/src/airflow_controller.rs b/rust/operator-binary/src/airflow_controller.rs index 4930c575..2da4d97a 100644 --- a/rust/operator-binary/src/airflow_controller.rs +++ b/rust/operator-binary/src/airflow_controller.rs @@ -38,6 +38,13 @@ use stackable_operator::{ authentication::{core as auth_core, ldap}, git_sync, listener, }, + databases::{ + TemplatingMechanism, + drivers::{ + celery::CeleryDatabaseConnectionDetails, + sqlalchemy::SQLAlchemyDatabaseConnectionDetails, + }, + }, k8s_openapi::{ self, DeepMerge, api::{ @@ -400,6 +407,34 @@ pub async fn reconcile_airflow( ) .await .context(InvalidAuthorizationConfigSnafu)?; + // We don't have a config file, but do everything via env substitution + + let templating_mechanism = TemplatingMechanism::BashEnvSubstitution; + let metadata_database_connection_details = airflow + .spec + .cluster_config + .metadata_database + .as_sqlalchemy_database_connection() + .sqlalchemy_connection_details_with_templating("METADATA", &templating_mechanism); + let celery_database_connection_details = match &airflow.spec.executor { + AirflowExecutor::CeleryExecutors { + celery_result_backend, + celery_broker, + .. + } => { + let celery_result_backend = celery_result_backend + .as_celery_database_connection() + .celery_connection_details_with_templating( + "CELERY_RESULT_BACKEND", + &templating_mechanism, + ); + let celery_broker = celery_broker + .as_celery_database_connection() + .celery_connection_details_with_templating("CELERY_BROKER", &templating_mechanism); + Some((celery_result_backend, celery_broker)) + } + _ => None, + }; let mut roles = HashMap::new(); @@ -462,13 +497,14 @@ pub async fn reconcile_airflow( // if the kubernetes executor is specified, in place of a worker role that will be in the role // collection there will be a pod template created to be used for pod provisioning - if let AirflowExecutor::KubernetesExecutor { + if let AirflowExecutor::KubernetesExecutors { common_configuration, } = &airflow_executor { build_executor_template( airflow, common_configuration, + &metadata_database_connection_details, &resolved_product_image, &authentication_config, &authorization_config, @@ -645,6 +681,8 @@ pub async fn reconcile_airflow( rolegroup_config, &authentication_config, &authorization_config, + &metadata_database_connection_details, + &celery_database_connection_details, &rbac_sa, &merged_airflow_config, airflow_executor, @@ -686,6 +724,7 @@ pub async fn reconcile_airflow( async fn build_executor_template( airflow: &v1alpha2::AirflowCluster, common_config: &CommonConfiguration, + metadata_database_connection_details: &SQLAlchemyDatabaseConnectionDetails, resolved_product_image: &ResolvedProductImage, authentication_config: &AirflowClientAuthenticationDetailsResolved, authorization_config: &AirflowAuthorizationResolved, @@ -735,6 +774,7 @@ async fn build_executor_template( airflow, resolved_product_image, authentication_config, + metadata_database_connection_details, &rbac_sa.name_unchecked(), &merged_executor_config, &common_config.env_overrides, @@ -933,6 +973,11 @@ fn build_server_rolegroup_statefulset( rolegroup_config: &HashMap>, authentication_config: &AirflowClientAuthenticationDetailsResolved, authorization_config: &AirflowAuthorizationResolved, + metadata_database_connection_details: &SQLAlchemyDatabaseConnectionDetails, + celery_database_connection_details: &Option<( + CeleryDatabaseConnectionDetails, + CeleryDatabaseConnectionDetails, + )>, service_account: &ServiceAccount, merged_airflow_config: &AirflowConfig, executor: &AirflowExecutor, @@ -1019,6 +1064,8 @@ fn build_server_rolegroup_statefulset( executor, authentication_config, authorization_config, + metadata_database_connection_details, + celery_database_connection_details, git_sync_resources, resolved_product_image, ) @@ -1039,7 +1086,7 @@ fn build_server_rolegroup_statefulset( .add_volume_mount(LOG_VOLUME_NAME, STACKABLE_LOG_DIR) .context(AddVolumeMountSnafu)?; - if let AirflowExecutor::KubernetesExecutor { .. } = executor { + if let AirflowExecutor::KubernetesExecutors { .. } = executor { airflow_container .add_volume_mount(TEMPLATE_VOLUME_NAME, TEMPLATE_LOCATION) .context(AddVolumeMountSnafu)?; @@ -1087,7 +1134,7 @@ fn build_server_rolegroup_statefulset( // and registered. This will result in ModuleNotFoundError errors. This can be avoided // by running a one-off git-sync process in an init-container so that all DAG // dependencies are fully loaded. The sidecar git-sync is then used for regular updates. - let use_git_sync_init_containers = matches!(executor, AirflowExecutor::CeleryExecutor { .. }); + let use_git_sync_init_containers = matches!(executor, AirflowExecutor::CeleryExecutors { .. }); add_git_sync_resources( &mut pb, &mut airflow_container, @@ -1096,6 +1143,12 @@ fn build_server_rolegroup_statefulset( use_git_sync_init_containers, )?; + metadata_database_connection_details.add_to_container(&mut airflow_container); + if let Some((celery_result_backend, celery_broker)) = celery_database_connection_details { + celery_result_backend.add_to_container(&mut airflow_container); + celery_broker.add_to_container(&mut airflow_container); + } + pb.add_container(airflow_container.build()); let metrics_container = ContainerBuilder::new("metrics") @@ -1140,7 +1193,7 @@ fn build_server_rolegroup_statefulset( )) .context(AddVolumeSnafu)?; - if let AirflowExecutor::KubernetesExecutor { .. } = executor { + if let AirflowExecutor::KubernetesExecutors { .. } = executor { pb.add_volume( VolumeBuilder::new(TEMPLATE_VOLUME_NAME) .with_config_map(airflow.executor_template_configmap_name()) @@ -1252,6 +1305,7 @@ fn build_executor_template_config_map( airflow: &v1alpha2::AirflowCluster, resolved_product_image: &ResolvedProductImage, authentication_config: &AirflowClientAuthenticationDetailsResolved, + metadata_database_connection_details: &SQLAlchemyDatabaseConnectionDetails, sa_name: &str, merged_executor_config: &ExecutorConfig, env_overrides: &HashMap, @@ -1299,6 +1353,7 @@ fn build_executor_template_config_map( airflow, env_overrides, merged_executor_config, + metadata_database_connection_details, git_sync_resources, resolved_product_image, )) diff --git a/rust/operator-binary/src/crd/affinity.rs b/rust/operator-binary/src/crd/affinity.rs index 3fe53e1d..f77671dc 100644 --- a/rust/operator-binary/src/crd/affinity.rs +++ b/rust/operator-binary/src/crd/affinity.rs @@ -235,8 +235,8 @@ mod tests { }; let executor_config = match &airflow.spec.executor { - AirflowExecutor::CeleryExecutor { .. } => unreachable!(), - AirflowExecutor::KubernetesExecutor { + AirflowExecutor::CeleryExecutors { .. } => unreachable!(), + AirflowExecutor::KubernetesExecutors { common_configuration, } => &common_configuration.config, }; diff --git a/rust/operator-binary/src/crd/databases.rs b/rust/operator-binary/src/crd/databases.rs new file mode 100644 index 00000000..792fe143 --- /dev/null +++ b/rust/operator-binary/src/crd/databases.rs @@ -0,0 +1,68 @@ +use serde::{Deserialize, Serialize}; +use stackable_operator::{ + databases::{ + databases::{postgresql::PostgresqlConnection, redis::RedisConnection}, + drivers::{ + celery::{CeleryDatabaseConnection, GenericCeleryDatabaseConnection}, + sqlalchemy::{GenericSQLAlchemyDatabaseConnection, SQLAlchemyDatabaseConnection}, + }, + }, + schemars::{self, JsonSchema}, +}; + +#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub enum MetadataDatabaseConnection { + /// TODO docs + Postgresql(PostgresqlConnection), + + /// TODO docs + Generic(GenericSQLAlchemyDatabaseConnection), +} + +impl MetadataDatabaseConnection { + pub fn as_sqlalchemy_database_connection(&self) -> &dyn SQLAlchemyDatabaseConnection { + match self { + Self::Postgresql(p) => p, + Self::Generic(g) => g, + } + } +} + +#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub enum CeleryResultBackendConnection { + /// TODO docs + Postgresql(PostgresqlConnection), + + /// TODO docs + Generic(GenericCeleryDatabaseConnection), +} + +impl CeleryResultBackendConnection { + pub fn as_celery_database_connection(&self) -> &dyn CeleryDatabaseConnection { + match self { + Self::Postgresql(p) => p, + Self::Generic(g) => g, + } + } +} + +#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub enum CeleryBrokerConnection { + /// TODO docs + Redis(RedisConnection), + + /// TODO docs + Generic(GenericCeleryDatabaseConnection), +} + +impl CeleryBrokerConnection { + pub fn as_celery_database_connection(&self) -> &dyn CeleryDatabaseConnection { + match self { + Self::Redis(r) => r, + Self::Generic(g) => g, + } + } +} diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index 2138011c..9073d50c 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -53,6 +53,9 @@ use crate::{ AirflowAuthenticationClassResolved, AirflowClientAuthenticationDetails, AirflowClientAuthenticationDetailsResolved, }, + databases::{ + CeleryBrokerConnection, CeleryResultBackendConnection, MetadataDatabaseConnection, + }, v1alpha2::WebserverRoleConfig, }, util::role_service_name, @@ -61,6 +64,7 @@ use crate::{ pub mod affinity; pub mod authentication; pub mod authorization; +pub mod databases; pub mod internal_secret; pub const APP_NAME: &str = "airflow"; @@ -244,14 +248,15 @@ pub mod versioned { #[serde(skip_serializing_if = "Option::is_none")] pub authorization: Option, - /// The name of the Secret object containing the admin user credentials and database connection details. - /// Read the + /// TODO docs + pub metadata_database: MetadataDatabaseConnection, + + /// The name of the Secret object containing the admin user credentials. Read the /// [getting started guide first steps](DOCS_BASE_URL_PLACEHOLDER/airflow/getting_started/first_steps) /// to find out more. pub credentials_secret: String, - /// The `gitSync` settings allow configuring DAGs to mount via `git-sync`. - /// Learn more in the + /// The `gitSync` settings allow configuring DAGs to mount via `git-sync`. Learn more in the /// [mounting DAGs documentation](DOCS_BASE_URL_PLACEHOLDER/airflow/usage-guide/mounting-dags#_via_git_sync). #[serde(default)] #[versioned( @@ -260,7 +265,7 @@ pub mod versioned { )] pub dags_git_sync: Vec, - /// for internal use only - not for production use. + /// For internal use only - not for production use. #[serde(default)] pub expose_config: bool, @@ -381,8 +386,8 @@ impl v1alpha2::AirflowCluster { AirflowRole::DagProcessor => self.spec.dag_processors.to_owned(), AirflowRole::Triggerer => self.spec.triggerers.to_owned(), AirflowRole::Worker => { - if let AirflowExecutor::CeleryExecutor { config } = &self.spec.executor { - Some(config.clone()) + if let AirflowExecutor::CeleryExecutors { config, .. } = &self.spec.executor { + Some(*config.clone()) } else { None } @@ -525,6 +530,7 @@ pub struct AirflowAuthorization { pub struct AirflowOpaConfig { #[serde(flatten)] pub opa: OpaConfig, + #[serde(default)] pub cache: UserInformationCache, } @@ -787,7 +793,7 @@ impl AirflowRole { .context(UnknownAirflowRoleSnafu { role, roles })?, ), AirflowRole::Worker => { - if let AirflowExecutor::CeleryExecutor { config } = &airflow.spec.executor { + if let AirflowExecutor::CeleryExecutors { config, .. } = &airflow.spec.executor { config } else { return Err(Error::NoRoleForExecutorFailure); @@ -817,25 +823,41 @@ fn container_debug_command() -> String { format!("containerdebug --output={STACKABLE_LOG_DIR}/containerdebug-state.json --loop &") } -#[derive(Clone, Debug, Deserialize, Display, JsonSchema, PartialEq, Serialize)] +#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] pub enum AirflowExecutor { /// The celery executor. /// Deployed with an explicit number of replicas. - #[serde(rename = "celeryExecutors")] - CeleryExecutor { + #[serde(rename_all = "camelCase")] + CeleryExecutors { #[serde(flatten)] - config: Role, + config: Box>, + + /// Connection information for the celery backend database. + celery_result_backend: CeleryResultBackendConnection, + + /// Connection information for the celery broker queue. + celery_broker: CeleryBrokerConnection, }, - /// With the Kuberentes executor, executor Pods are created on demand. - #[serde(rename = "kubernetesExecutors")] - KubernetesExecutor { + /// With the Kubernetes executor, executor Pods are created on demand. + KubernetesExecutors { #[serde(flatten)] common_configuration: - CommonConfiguration, + Box>, }, } +impl AirflowExecutor { + /// Name of the executor as expected to be passed via `AIRFLOW__CORE__EXECUTOR` + pub fn as_airflow_core_executor(&self) -> &'static str { + match self { + AirflowExecutor::CeleryExecutors { .. } => "CeleryExecutor", + AirflowExecutor::KubernetesExecutors { .. } => "KubernetesExecutor", + } + } +} + #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, Debug, Default, JsonSchema, PartialEq, Fragment)] #[fragment_attrs( @@ -1112,7 +1134,7 @@ mod tests { assert_eq!("3.1.6", &resolved_airflow_image.product_version); - assert_eq!("KubernetesExecutor", cluster.spec.executor.to_string()); + assert_eq!("KubernetesExecutor", cluster.spec.executor.as_airflow_core_executor()); assert!(cluster.spec.cluster_config.load_examples); assert!(cluster.spec.cluster_config.expose_config); // defaults to true diff --git a/rust/operator-binary/src/env_vars.rs b/rust/operator-binary/src/env_vars.rs index d67c1c33..c57f2e4e 100644 --- a/rust/operator-binary/src/env_vars.rs +++ b/rust/operator-binary/src/env_vars.rs @@ -8,6 +8,9 @@ use snafu::Snafu; use stackable_operator::{ commons::product_image_selection::ResolvedProductImage, crd::{authentication::oidc, git_sync}, + databases::drivers::{ + celery::CeleryDatabaseConnectionDetails, sqlalchemy::SQLAlchemyDatabaseConnectionDetails, + }, k8s_openapi::api::core::v1::EnvVar, kube::ResourceExt, product_logging::framework::create_vector_shutdown_file_command, @@ -80,11 +83,15 @@ pub fn build_airflow_statefulset_envs( executor: &AirflowExecutor, auth_config: &AirflowClientAuthenticationDetailsResolved, authorization_config: &AirflowAuthorizationResolved, + metadata_database_connection_details: &SQLAlchemyDatabaseConnectionDetails, + celery_database_connection_details: &Option<( + CeleryDatabaseConnectionDetails, + CeleryDatabaseConnectionDetails, + )>, git_sync_resources: &git_sync::v1alpha2::GitSyncResources, resolved_product_image: &ResolvedProductImage, ) -> Result, Error> { let mut env: BTreeMap = BTreeMap::new(); - let secret = airflow.spec.cluster_config.credentials_secret.as_str(); let internal_secret_name = airflow.shared_internal_secret_secret_name(); env.extend(static_envs(git_sync_resources)); @@ -126,31 +133,29 @@ pub fn build_airflow_statefulset_envs( env.insert( AIRFLOW_DATABASE_SQL_ALCHEMY_CONN.into(), - env_var_from_secret( - AIRFLOW_DATABASE_SQL_ALCHEMY_CONN, - secret, - "connections.sqlalchemyDatabaseUri", - ), + EnvVar { + name: AIRFLOW_DATABASE_SQL_ALCHEMY_CONN.into(), + value: Some(metadata_database_connection_details.uri_template.clone()), + ..Default::default() + }, ); - - // Redis is only needed when celery executors are used - // see https://github.com/stackabletech/airflow-operator/issues/424 for details - if matches!(executor, AirflowExecutor::CeleryExecutor { .. }) { + // Only needed when celery executors are used + if let Some((celery_result_backend, celery_broker)) = celery_database_connection_details { env.insert( AIRFLOW_CELERY_RESULT_BACKEND.into(), - env_var_from_secret( - AIRFLOW_CELERY_RESULT_BACKEND, - secret, - "connections.celeryResultBackend", - ), + EnvVar { + name: AIRFLOW_CELERY_RESULT_BACKEND.into(), + value: Some(celery_result_backend.uri_template.clone()), + ..Default::default() + }, ); env.insert( AIRFLOW_CELERY_BROKER_URL.into(), - env_var_from_secret( - AIRFLOW_CELERY_BROKER_URL, - secret, - "connections.celeryBrokerUrl", - ), + EnvVar { + name: AIRFLOW_CELERY_BROKER_URL.into(), + value: Some(celery_broker.uri_template.clone()), + ..Default::default() + }, ); } @@ -199,12 +204,12 @@ pub fn build_airflow_statefulset_envs( AIRFLOW_CORE_EXECUTOR.into(), EnvVar { name: AIRFLOW_CORE_EXECUTOR.into(), - value: Some(executor.to_string()), + value: Some(executor.as_airflow_core_executor().to_owned()), ..Default::default() }, ); - if let AirflowExecutor::KubernetesExecutor { .. } = executor { + if let AirflowExecutor::KubernetesExecutors { .. } = executor { env.insert( AIRFLOW_KUBERNETES_EXECUTOR_POD_TEMPLATE_FILE.into(), EnvVar { @@ -372,19 +377,19 @@ pub fn build_airflow_template_envs( airflow: &v1alpha2::AirflowCluster, env_overrides: &HashMap, config: &ExecutorConfig, + metadata_database_connection_details: &SQLAlchemyDatabaseConnectionDetails, git_sync_resources: &git_sync::v1alpha2::GitSyncResources, resolved_product_image: &ResolvedProductImage, ) -> Vec { let mut env: BTreeMap = BTreeMap::new(); - let secret = airflow.spec.cluster_config.credentials_secret.as_str(); env.insert( AIRFLOW_DATABASE_SQL_ALCHEMY_CONN.into(), - env_var_from_secret( - AIRFLOW_DATABASE_SQL_ALCHEMY_CONN, - secret, - "connections.sqlalchemyDatabaseUri", - ), + EnvVar { + name: AIRFLOW_DATABASE_SQL_ALCHEMY_CONN.into(), + value: Some(metadata_database_connection_details.uri_template.clone()), + ..Default::default() + }, ); env.insert( diff --git a/rust/operator-binary/src/operations/pdb.rs b/rust/operator-binary/src/operations/pdb.rs index 9f010800..b3261678 100644 --- a/rust/operator-binary/src/operations/pdb.rs +++ b/rust/operator-binary/src/operations/pdb.rs @@ -40,8 +40,8 @@ pub async fn add_pdbs( AirflowRole::DagProcessor => max_unavailable_dag_processors(), AirflowRole::Triggerer => max_unavailable_triggerers(), AirflowRole::Worker => match airflow.spec.executor { - AirflowExecutor::CeleryExecutor { .. } => max_unavailable_workers(), - AirflowExecutor::KubernetesExecutor { .. } => { + AirflowExecutor::CeleryExecutors { .. } => max_unavailable_workers(), + AirflowExecutor::KubernetesExecutors { .. } => { // In case Airflow creates the Pods, we don't want to influence that. return Ok(()); } diff --git a/tests/templates/kuttl/smoke/40-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/smoke/40-install-airflow-cluster.yaml.j2 index 5227979c..a6e14350 100644 --- a/tests/templates/kuttl/smoke/40-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/smoke/40-install-airflow-cluster.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,10 +15,23 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow {% if test_scenario['values']['executor'] == 'celery' %} - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis {% endif %} --- apiVersion: airflow.stackable.tech/v1alpha1 @@ -39,7 +52,12 @@ spec: vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} loadExamples: true - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable @@ -62,6 +80,15 @@ spec: COMMON_HEADER_VAR = "group-value" {% if test_scenario['values']['executor'] == 'celery' %} celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials config: logging: enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} From b0356221825656fdc126eadc156787bab898d1a6 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Tue, 3 Mar 2026 11:59:12 +0100 Subject: [PATCH 02/10] fix: Add to Pod template as well --- rust/operator-binary/src/airflow_controller.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rust/operator-binary/src/airflow_controller.rs b/rust/operator-binary/src/airflow_controller.rs index 2da4d97a..338fd3cf 100644 --- a/rust/operator-binary/src/airflow_controller.rs +++ b/rust/operator-binary/src/airflow_controller.rs @@ -1374,6 +1374,8 @@ fn build_executor_template_config_map( true, )?; + metadata_database_connection_details.add_to_container(&mut airflow_container); + pb.add_container(airflow_container.build()); pb.add_volumes(airflow.volumes().clone()) .context(AddVolumeSnafu)?; From a67081bc69b4c0c94cb5e5f9801407a81598e8e0 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Tue, 3 Mar 2026 12:10:44 +0100 Subject: [PATCH 03/10] Bump op-rs --- Cargo.lock | 21 ++++++++---- Cargo.nix | 85 ++++++++++++++++++++++++++++++++++++----------- Cargo.toml | 4 +-- crate-hashes.json | 9 +++++ 4 files changed, 92 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d1772102..f539fc78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1410,9 +1410,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" @@ -1568,6 +1568,7 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "darling", "regex", @@ -2962,6 +2963,7 @@ dependencies = [ [[package]] name = "stackable-certs" version = "0.4.0" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "const-oid", "ecdsa", @@ -2985,6 +2987,7 @@ dependencies = [ [[package]] name = "stackable-operator" version = "0.106.2" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "clap", "const_format", @@ -3023,6 +3026,7 @@ dependencies = [ [[package]] name = "stackable-operator-derive" version = "0.3.1" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "darling", "proc-macro2", @@ -3033,6 +3037,7 @@ dependencies = [ [[package]] name = "stackable-shared" version = "0.1.0" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "jiff", "k8s-openapi", @@ -3049,6 +3054,7 @@ dependencies = [ [[package]] name = "stackable-telemetry" version = "0.6.1" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "axum", "clap", @@ -3072,6 +3078,7 @@ dependencies = [ [[package]] name = "stackable-versioned" version = "0.8.3" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "schemars", "serde", @@ -3084,6 +3091,7 @@ dependencies = [ [[package]] name = "stackable-versioned-macros" version = "0.8.3" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "convert_case", "convert_case_extras", @@ -3101,6 +3109,7 @@ dependencies = [ [[package]] name = "stackable-webhook" version = "0.9.0" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" dependencies = [ "arc-swap", "async-trait", @@ -3316,9 +3325,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.49.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", @@ -3333,9 +3342,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.nix b/Cargo.nix index 2c435491..2a6f3251 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -4578,18 +4578,20 @@ rec { }; "ipnet" = rec { crateName = "ipnet"; - version = "2.11.0"; + version = "2.12.0"; edition = "2018"; - sha256 = "0c5i9sfi2asai28m8xp48k5gvwkqrg5ffpi767py6mzsrswv17s6"; + sha256 = "1qpq2y0asyv0jppw7zww9y96fpnpinwap8a0phhqqgyy3znnz3yr"; authors = [ "Kris Price " ]; features = { "default" = [ "std" ]; - "heapless" = [ "dep:heapless" ]; - "json" = [ "serde" "schemars" ]; - "schemars" = [ "dep:schemars" ]; - "ser_as_str" = [ "heapless" ]; + "heapless" = [ "dep:heapless" "serde" ]; + "json" = [ "schemars08" "serde" ]; + "schemars" = [ "schemars08" ]; + "schemars08" = [ "dep:schemars08" ]; + "schemars1" = [ "dep:schemars1" ]; + "ser_as_str" = [ "dep:heapless" ]; "serde" = [ "dep:serde" ]; }; resolvedDefaultFeatures = [ "default" "std" ]; @@ -5049,7 +5051,12 @@ rec { crateName = "k8s-version"; version = "0.1.3"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/k8s-version; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; libName = "k8s_version"; authors = [ "Stackable GmbH " @@ -9863,7 +9870,12 @@ rec { crateName = "stackable-certs"; version = "0.4.0"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-certs; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; libName = "stackable_certs"; authors = [ "Stackable GmbH " @@ -9961,7 +9973,12 @@ rec { crateName = "stackable-operator"; version = "0.106.2"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-operator; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; libName = "stackable_operator"; authors = [ "Stackable GmbH " @@ -10129,7 +10146,12 @@ rec { crateName = "stackable-operator-derive"; version = "0.3.1"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-operator-derive; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; procMacro = true; libName = "stackable_operator_derive"; authors = [ @@ -10159,7 +10181,12 @@ rec { crateName = "stackable-shared"; version = "0.1.0"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-shared; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; libName = "stackable_shared"; authors = [ "Stackable GmbH " @@ -10235,7 +10262,12 @@ rec { crateName = "stackable-telemetry"; version = "0.6.1"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-telemetry; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; libName = "stackable_telemetry"; authors = [ "Stackable GmbH " @@ -10340,7 +10372,12 @@ rec { crateName = "stackable-versioned"; version = "0.8.3"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-versioned; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; libName = "stackable_versioned"; authors = [ "Stackable GmbH " @@ -10379,7 +10416,12 @@ rec { crateName = "stackable-versioned-macros"; version = "0.8.3"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-versioned-macros; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; procMacro = true; libName = "stackable_versioned_macros"; authors = [ @@ -10442,7 +10484,12 @@ rec { crateName = "stackable-webhook"; version = "0.9.0"; edition = "2024"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ../operator-rs/crates/stackable-webhook; }; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech//operator-rs.git"; + rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; + }; libName = "stackable_webhook"; authors = [ "Stackable GmbH " @@ -11071,9 +11118,9 @@ rec { }; "tokio" = rec { crateName = "tokio"; - version = "1.49.0"; + version = "1.50.0"; edition = "2021"; - sha256 = "11ix3pl03s0bp71q3wddrbf8xr0cpn47d7fzr6m42r3kswy918kj"; + sha256 = "0bc2c5kd57p2xd4l6hagb0bkrp798k5vw0f3xzzwy0sf6ws5xb97"; authors = [ "Tokio Contributors " ]; @@ -11186,9 +11233,9 @@ rec { }; "tokio-macros" = rec { crateName = "tokio-macros"; - version = "2.6.0"; + version = "2.6.1"; edition = "2021"; - sha256 = "19czvgliginbzyhhfbmj77wazqn2y8g27y2nirfajdlm41bphh5g"; + sha256 = "172nwz3s7mmh266hb8l5xdnc7v9kqahisppqhinfd75nz3ps4maw"; procMacro = true; libName = "tokio_macros"; authors = [ diff --git a/Cargo.toml b/Cargo.toml index 03d713f2..b0d8b303 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,5 +33,5 @@ tokio = { version = "1.40", features = ["full"] } tracing = "0.1" [patch."https://github.com/stackabletech/operator-rs.git"] -# stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "spike/generic-databases" } -stackable-operator = { path = "../operator-rs/crates/stackable-operator" } +stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "spike/generic-databases" } +# stackable-operator = { path = "../operator-rs/crates/stackable-operator" } diff --git a/crate-hashes.json b/crate-hashes.json index a7ddcc2d..096ee5cc 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -4,5 +4,14 @@ "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-derive@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube-runtime@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", "git+https://github.com/kube-rs/kube-rs?rev=fe69cc486ff8e62a7da61d64ec3ebbd9e64c43b5#kube@3.0.1": "1irm4g79crlxjm3iqrgvx0f6wxdcj394ky84q89pk9i36y2mlw3n", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#k8s-version@0.1.3": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#stackable-certs@0.4.0": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#stackable-operator-derive@0.3.1": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#stackable-operator@0.106.2": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#stackable-shared@0.1.0": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#stackable-telemetry@0.6.1": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#stackable-versioned-macros@0.8.3": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#stackable-versioned@0.8.3": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", + "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#stackable-webhook@0.9.0": "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9", "git+https://github.com/stackabletech/product-config.git?tag=0.8.0#product-config@0.8.0": "1dz70kapm2wdqcr7ndyjji0lhsl98bsq95gnb2lw487wf6yr7987" } \ No newline at end of file From cfb0481abe41d58fcec93dbff8409d443619bb8c Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Tue, 3 Mar 2026 14:12:51 +0100 Subject: [PATCH 04/10] Fix tests --- rust/operator-binary/src/crd/affinity.rs | 21 ++++++++++++++++++++- rust/operator-binary/src/crd/mod.rs | 7 ++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/rust/operator-binary/src/crd/affinity.rs b/rust/operator-binary/src/crd/affinity.rs index f77671dc..b2326eda 100644 --- a/rust/operator-binary/src/crd/affinity.rs +++ b/rust/operator-binary/src/crd/affinity.rs @@ -71,12 +71,26 @@ mod tests { image: productVersion: 3.1.6 clusterConfig: - credentialsSecret: airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleGroups: default: replicas: 1 celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials roleGroups: default: replicas: 2 @@ -166,6 +180,11 @@ mod tests { productVersion: 3.1.6 clusterConfig: credentialsSecret: airflow-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleGroups: default: diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index 9073d50c..0284bbce 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -1109,7 +1109,12 @@ mod tests { clusterConfig: loadExamples: true exposeConfig: true - credentialsSecret: simple-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleGroups: default: From c00b6293be2cc2b78a99bffe40ca3c30a00cf9c6 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Tue, 3 Mar 2026 14:56:13 +0100 Subject: [PATCH 05/10] Update kuttl tests Co-authored-by: Andrew Kenworthy --- .../08-install-airflow.yaml.j2 | 37 ++++++++++++++--- .../10-pause-airflow.yaml.j2 | 36 ---------------- .../cluster-operation/20-stop-airflow.yaml.j2 | 36 ---------------- .../30-restart-airflow.yaml.j2 | 38 ----------------- .../install-airflow-cluster.yaml.j2 | 37 ++++++++++++++--- .../ldap/60-install-airflow-cluster.yaml.j2 | 37 ++++++++++++++--- .../41-install-airflow-cluster.yaml.j2 | 37 ++++++++++++++--- .../30-install-airflow-cluster.yaml.j2 | 37 ++++++++++++++--- .../30-install-airflow-cluster.yaml.j2 | 41 +++++++++++++++---- .../kuttl/oidc/install-airflow.yaml.j2 | 18 ++++++-- .../kuttl/opa/30-install-airflow.yaml.j2 | 26 ++++++++++-- .../30-install-airflow-cluster.yaml.j2 | 37 ++++++++++++++--- .../overrides/10-install-airflow.yaml.j2 | 40 ++++++++++++++---- .../overrides/20-install-airflow2.yaml.j2 | 7 +++- .../40-install-airflow-cluster.yaml.j2 | 37 ++++++++++++++--- .../30-install-airflow-cluster.yaml.j2 | 37 ++++++++++++++--- .../30-install-airflow-cluster.yaml.j2 | 37 ++++++++++++++--- .../30-install-airflow-cluster.yaml.j2 | 22 +++++++--- 18 files changed, 415 insertions(+), 182 deletions(-) diff --git a/tests/templates/kuttl/cluster-operation/08-install-airflow.yaml.j2 b/tests/templates/kuttl/cluster-operation/08-install-airflow.yaml.j2 index 3aa50e6e..727191ab 100644 --- a/tests/templates/kuttl/cluster-operation/08-install-airflow.yaml.j2 +++ b/tests/templates/kuttl/cluster-operation/08-install-airflow.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,9 +15,22 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis --- apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster @@ -36,7 +49,12 @@ spec: {% if lookup('env', 'VECTOR_AGGREGATOR') %} vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable @@ -47,6 +65,15 @@ spec: default: replicas: 1 celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials config: logging: enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} diff --git a/tests/templates/kuttl/cluster-operation/10-pause-airflow.yaml.j2 b/tests/templates/kuttl/cluster-operation/10-pause-airflow.yaml.j2 index e84c9653..41157793 100644 --- a/tests/templates/kuttl/cluster-operation/10-pause-airflow.yaml.j2 +++ b/tests/templates/kuttl/cluster-operation/10-pause-airflow.yaml.j2 @@ -12,39 +12,3 @@ spec: clusterOperation: reconciliationPaused: true stopped: false - image: -{% if test_scenario['values']['airflow-latest'].find(",") > 0 %} - custom: "{{ test_scenario['values']['airflow-latest'].split(',')[1] }}" - productVersion: "{{ test_scenario['values']['airflow-latest'].split(',')[0] }}" -{% else %} - productVersion: "{{ test_scenario['values']['airflow-latest'] }}" -{% endif %} - pullPolicy: IfNotPresent - clusterConfig: -{% if lookup('env', 'VECTOR_AGGREGATOR') %} - vectorAggregatorConfigMapName: vector-aggregator-discovery -{% endif %} - credentialsSecret: test-airflow-credentials - webservers: - roleConfig: - listenerClass: external-unstable - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 1 - celeryExecutors: - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 3 # ignored because paused - schedulers: - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 1 diff --git a/tests/templates/kuttl/cluster-operation/20-stop-airflow.yaml.j2 b/tests/templates/kuttl/cluster-operation/20-stop-airflow.yaml.j2 index 470f8d7d..fea242b9 100644 --- a/tests/templates/kuttl/cluster-operation/20-stop-airflow.yaml.j2 +++ b/tests/templates/kuttl/cluster-operation/20-stop-airflow.yaml.j2 @@ -12,39 +12,3 @@ spec: clusterOperation: reconciliationPaused: false stopped: true - image: -{% if test_scenario['values']['airflow-latest'].find(",") > 0 %} - custom: "{{ test_scenario['values']['airflow-latest'].split(',')[1] }}" - productVersion: "{{ test_scenario['values']['airflow-latest'].split(',')[0] }}" -{% else %} - productVersion: "{{ test_scenario['values']['airflow-latest'] }}" -{% endif %} - pullPolicy: IfNotPresent - clusterConfig: -{% if lookup('env', 'VECTOR_AGGREGATOR') %} - vectorAggregatorConfigMapName: vector-aggregator-discovery -{% endif %} - credentialsSecret: test-airflow-credentials - webservers: - roleConfig: - listenerClass: external-unstable - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 1 - celeryExecutors: - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 3 # ignored because paused - schedulers: - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 1 diff --git a/tests/templates/kuttl/cluster-operation/30-restart-airflow.yaml.j2 b/tests/templates/kuttl/cluster-operation/30-restart-airflow.yaml.j2 index 7b90ad6b..27049b6f 100644 --- a/tests/templates/kuttl/cluster-operation/30-restart-airflow.yaml.j2 +++ b/tests/templates/kuttl/cluster-operation/30-restart-airflow.yaml.j2 @@ -12,41 +12,3 @@ spec: clusterOperation: reconciliationPaused: false stopped: false - image: -{% if test_scenario['values']['airflow-latest'].find(",") > 0 %} - custom: "{{ test_scenario['values']['airflow-latest'].split(',')[1] }}" - productVersion: "{{ test_scenario['values']['airflow-latest'].split(',')[0] }}" -{% else %} - productVersion: "{{ test_scenario['values']['airflow-latest'] }}" -{% endif %} - pullPolicy: IfNotPresent - clusterConfig: -{% if lookup('env', 'VECTOR_AGGREGATOR') %} - vectorAggregatorConfigMapName: vector-aggregator-discovery -{% endif %} - credentialsSecret: test-airflow-credentials - databaseInitialization: - enabled: false - webservers: - roleConfig: - listenerClass: external-unstable - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 1 - celeryExecutors: - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 3 - schedulers: - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleGroups: - default: - replicas: 1 diff --git a/tests/templates/kuttl/external-access/install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/external-access/install-airflow-cluster.yaml.j2 index 84f6547a..974687d8 100644 --- a/tests/templates/kuttl/external-access/install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/external-access/install-airflow-cluster.yaml.j2 @@ -2,7 +2,7 @@ apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -10,9 +10,22 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis --- apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster @@ -29,7 +42,12 @@ spec: pullPolicy: IfNotPresent clusterConfig: loadExamples: false - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: test-external-stable-$NAMESPACE @@ -45,6 +63,15 @@ spec: replicas: 1 {% if test_scenario['values']['executor'] == 'celery' %} celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials roleGroups: default: replicas: 1 diff --git a/tests/templates/kuttl/ldap/60-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/ldap/60-install-airflow-cluster.yaml.j2 index cbba7152..f1ee7200 100644 --- a/tests/templates/kuttl/ldap/60-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/ldap/60-install-airflow-cluster.yaml.j2 @@ -10,7 +10,7 @@ commands: apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -18,10 +18,23 @@ commands: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow + --- + apiVersion: v1 + kind: Secret + metadata: + name: airflow-postgresql-credentials + stringData: + username: airflow + password: airflow {% if test_scenario['values']['executor'] == 'celery' %} - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 + --- + apiVersion: v1 + kind: Secret + metadata: + name: airflow-redis-credentials + stringData: + username: "" + password: redis {% endif %} --- apiVersion: v1 @@ -52,7 +65,12 @@ commands: vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} loadExamples: true - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials authentication: - authenticationClass: {% if test_scenario['values']['ldap-authentication'] == 'no-tls' -%} no-tls-$NAMESPACE @@ -74,6 +92,15 @@ commands: replicas: 1 {% if test_scenario['values']['executor'] == 'celery' %} celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials config: logging: enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} diff --git a/tests/templates/kuttl/logging/41-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/logging/41-install-airflow-cluster.yaml.j2 index 498f6db0..0e6786ba 100644 --- a/tests/templates/kuttl/logging/41-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/logging/41-install-airflow-cluster.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,10 +15,23 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow {% if test_scenario['values']['executor'] == 'celery' %} - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis {% endif %} --- apiVersion: v1 @@ -70,7 +83,12 @@ spec: clusterConfig: vectorAggregatorConfigMapName: airflow-vector-aggregator-discovery loadExamples: true - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials dagsGitSync: - repo: https://github.com/stackabletech/example-dags gitFolder: dags @@ -137,6 +155,15 @@ spec: configMap: airflow-log-config {% if test_scenario['values']['executor'] == 'celery' %} celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials config: resources: cpu: diff --git a/tests/templates/kuttl/mount-dags-configmap/30-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/mount-dags-configmap/30-install-airflow-cluster.yaml.j2 index b3bf36c8..c7e435c7 100644 --- a/tests/templates/kuttl/mount-dags-configmap/30-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/mount-dags-configmap/30-install-airflow-cluster.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,10 +15,23 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow {% if test_scenario['values']['executor'] == 'celery' %} - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis {% endif %} --- apiVersion: v1 @@ -74,7 +87,12 @@ spec: {% if lookup('env', 'VECTOR_AGGREGATOR') %} vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials volumes: - name: test-cm-dag configMap: @@ -96,6 +114,15 @@ spec: replicas: 1 {% if test_scenario['values']['executor'] == 'celery' %} celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials config: logging: enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} diff --git a/tests/templates/kuttl/mount-dags-gitsync/30-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/mount-dags-gitsync/30-install-airflow-cluster.yaml.j2 index 1e3620dd..d7a201df 100644 --- a/tests/templates/kuttl/mount-dags-gitsync/30-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/mount-dags-gitsync/30-install-airflow-cluster.yaml.j2 @@ -21,7 +21,7 @@ data: apiVersion: v1 kind: Secret metadata: - name: git-credentials + name: airflow-git-credentials type: Opaque data: # This is a fine-grained access token for the owner of the repo (stackable-airflow/dags) which has read only access @@ -34,7 +34,7 @@ data: apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -42,10 +42,23 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow {% if test_scenario['values']['executor'] == 'celery' %} - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis {% endif %} --- apiVersion: v1 @@ -73,7 +86,12 @@ spec: {% if lookup('env', 'VECTOR_AGGREGATOR') %} vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials dagsGitSync: {% if test_scenario['values']['access'] == 'ssh' %} - repo: ssh://git@github.com/stackable-airflow/dags.git @@ -83,7 +101,7 @@ spec: {% if test_scenario['values']['access'] == 'https' %} - repo: https://github.com/stackable-airflow/dags credentials: - basicAuthSecretName: git-credentials + basicAuthSecretName: airflow-git-credentials {% endif %} {% if test_scenario['values']['executor'] == 'celery' %} # Just setting some values to increase the test coverage (defaults should work just fine) @@ -116,6 +134,15 @@ spec: replicas: 1 {% if test_scenario['values']['executor'] == 'celery' %} celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials config: logging: enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} diff --git a/tests/templates/kuttl/oidc/install-airflow.yaml.j2 b/tests/templates/kuttl/oidc/install-airflow.yaml.j2 index 48826e4b..da0ad6f5 100644 --- a/tests/templates/kuttl/oidc/install-airflow.yaml.j2 +++ b/tests/templates/kuttl/oidc/install-airflow.yaml.j2 @@ -3,7 +3,7 @@ apiVersion: v1 kind: Secret metadata: - name: airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -11,7 +11,14 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow --- apiVersion: v1 kind: Secret @@ -52,7 +59,12 @@ spec: oidc: clientCredentialsSecret: airflow-keycloak2-client userRegistrationRole: Admin - credentialsSecret: airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials {% if lookup('env', 'VECTOR_AGGREGATOR') %} vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} diff --git a/tests/templates/kuttl/opa/30-install-airflow.yaml.j2 b/tests/templates/kuttl/opa/30-install-airflow.yaml.j2 index 9fe3daa0..ae10b967 100644 --- a/tests/templates/kuttl/opa/30-install-airflow.yaml.j2 +++ b/tests/templates/kuttl/opa/30-install-airflow.yaml.j2 @@ -7,7 +7,7 @@ metadata: apiVersion: v1 kind: Secret metadata: - name: airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,7 +15,22 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis --- apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster @@ -38,7 +53,12 @@ spec: cache: entryTimeToLive: 5s maxEntries: 10 - credentialsSecret: airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials exposeConfig: true loadExamples: true {% if lookup('env', 'VECTOR_AGGREGATOR') %} diff --git a/tests/templates/kuttl/orphaned-resources/30-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/orphaned-resources/30-install-airflow-cluster.yaml.j2 index 3aa50e6e..727191ab 100644 --- a/tests/templates/kuttl/orphaned-resources/30-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/orphaned-resources/30-install-airflow-cluster.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,9 +15,22 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis --- apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster @@ -36,7 +49,12 @@ spec: {% if lookup('env', 'VECTOR_AGGREGATOR') %} vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable @@ -47,6 +65,15 @@ spec: default: replicas: 1 celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials config: logging: enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} diff --git a/tests/templates/kuttl/overrides/10-install-airflow.yaml.j2 b/tests/templates/kuttl/overrides/10-install-airflow.yaml.j2 index 7ae53a0c..caf412f2 100644 --- a/tests/templates/kuttl/overrides/10-install-airflow.yaml.j2 +++ b/tests/templates/kuttl/overrides/10-install-airflow.yaml.j2 @@ -2,7 +2,7 @@ apiVersion: v1 kind: Secret metadata: - name: airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -10,9 +10,22 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis --- apiVersion: v1 kind: Secret @@ -25,9 +38,6 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 --- apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster @@ -45,7 +55,12 @@ spec: clusterConfig: loadExamples: true exposeConfig: false - credentialsSecret: airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable @@ -60,6 +75,15 @@ spec: COMMON_VAR: group-value # overrides role value GROUP_VAR: group-value # only defined here at group level celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials envOverrides: COMMON_VAR: role-value # overridden by role group below ROLE_VAR: role-value # only defined here at role level diff --git a/tests/templates/kuttl/overrides/20-install-airflow2.yaml.j2 b/tests/templates/kuttl/overrides/20-install-airflow2.yaml.j2 index 96edce21..83808bfe 100644 --- a/tests/templates/kuttl/overrides/20-install-airflow2.yaml.j2 +++ b/tests/templates/kuttl/overrides/20-install-airflow2.yaml.j2 @@ -15,7 +15,12 @@ spec: clusterConfig: loadExamples: true exposeConfig: false - credentialsSecret: airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable diff --git a/tests/templates/kuttl/remote-logging/40-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/remote-logging/40-install-airflow-cluster.yaml.j2 index c0719d48..139af922 100644 --- a/tests/templates/kuttl/remote-logging/40-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/remote-logging/40-install-airflow-cluster.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,10 +15,23 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow {% if test_scenario['values']['executor'] == 'celery' %} - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis {% endif %} --- apiVersion: airflow.stackable.tech/v1alpha1 @@ -36,7 +49,12 @@ spec: pullPolicy: IfNotPresent clusterConfig: loadExamples: true - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable @@ -50,6 +68,15 @@ spec: AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio_conn {% if test_scenario['values']['executor'] == 'celery' %} celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials roleGroups: default: replicas: 2 diff --git a/tests/templates/kuttl/resources/30-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/resources/30-install-airflow-cluster.yaml.j2 index 5af22cb8..62546714 100644 --- a/tests/templates/kuttl/resources/30-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/resources/30-install-airflow-cluster.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,9 +15,22 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis --- apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster @@ -36,7 +49,12 @@ spec: {% if lookup('env', 'VECTOR_AGGREGATOR') %} vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable @@ -47,6 +65,15 @@ spec: default: replicas: 1 celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials config: logging: enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} diff --git a/tests/templates/kuttl/triggerer/30-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/triggerer/30-install-airflow-cluster.yaml.j2 index 2f728798..e16997e3 100644 --- a/tests/templates/kuttl/triggerer/30-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/triggerer/30-install-airflow-cluster.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -15,10 +15,23 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow {% if test_scenario['values']['executor'] == 'celery' %} - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis {% endif %} --- apiVersion: v1 @@ -96,7 +109,12 @@ spec: {% endif %} pullPolicy: IfNotPresent clusterConfig: - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials volumes: - name: triggerer-dag configMap: @@ -115,6 +133,15 @@ spec: replicas: 1 {% if test_scenario['values']['executor'] == 'celery' %} celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials roleGroups: default: envOverrides: *envOverrides diff --git a/tests/templates/kuttl/versioning/30-install-airflow-cluster.yaml.j2 b/tests/templates/kuttl/versioning/30-install-airflow-cluster.yaml.j2 index 21c05198..0f228aa6 100644 --- a/tests/templates/kuttl/versioning/30-install-airflow-cluster.yaml.j2 +++ b/tests/templates/kuttl/versioning/30-install-airflow-cluster.yaml.j2 @@ -7,7 +7,7 @@ timeout: 480 apiVersion: v1 kind: Secret metadata: - name: git-credentials + name: airflow-git-credentials type: Opaque data: # This is a fine-grained access token for the owner of the repo (stackable-airflow/dags) which has read only access @@ -19,7 +19,7 @@ data: apiVersion: v1 kind: Secret metadata: - name: test-airflow-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow @@ -27,7 +27,14 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql/airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow --- apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster @@ -46,12 +53,17 @@ spec: {% if lookup('env', 'VECTOR_AGGREGATOR') %} vectorAggregatorConfigMapName: vector-aggregator-discovery {% endif %} - credentialsSecret: test-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials dagsGitSync: - repo: https://github.com/stackable-airflow/dags # v1alpha1 field which should be converted to an enum # N.B. only works for the existing v1 field - credentialsSecret: git-credentials + credentialsSecret: airflow-git-credentials gitFolder: "mount-dags-gitsync/dags_airflow3" wait: 5s webservers: From 30c83e2015428e8ac968281cc55c781b4f008d14 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Tue, 3 Mar 2026 15:06:16 +0100 Subject: [PATCH 06/10] Update docs Co-authored-by: Andrew Kenworthy --- .../example-airflow-dags-configmap.yaml | 21 +- .../example-airflow-gitsync-https.yaml | 6 +- .../examples/example-airflow-incluster.yaml | 27 ++- .../examples/example-airflow-secret.yaml | 16 -- .../code/airflow-credentials.yaml | 22 ++- .../getting_started/code/airflow.yaml | 16 +- .../airflow/pages/usage-guide/logging.adoc | 1 + .../pages/usage-guide/storage-resources.adoc | 1 + .../using-kubernetes-executors.adoc | 1 + .../simple-airflow-cluster-dags-cmap.yaml | 116 ----------- ...ple-airflow-cluster-ldap-insecure-tls.yaml | 181 ------------------ examples/simple-airflow-cluster-ldap.yaml | 179 ----------------- examples/simple-airflow-cluster.yaml | 42 ---- rust/operator-binary/src/crd/affinity.rs | 2 +- 14 files changed, 65 insertions(+), 566 deletions(-) delete mode 100644 docs/modules/airflow/examples/example-airflow-secret.yaml delete mode 100644 examples/simple-airflow-cluster-dags-cmap.yaml delete mode 100644 examples/simple-airflow-cluster-ldap-insecure-tls.yaml delete mode 100644 examples/simple-airflow-cluster-ldap.yaml delete mode 100644 examples/simple-airflow-cluster.yaml diff --git a/docs/modules/airflow/examples/example-airflow-dags-configmap.yaml b/docs/modules/airflow/examples/example-airflow-dags-configmap.yaml index afb8f558..f9ef80c4 100644 --- a/docs/modules/airflow/examples/example-airflow-dags-configmap.yaml +++ b/docs/modules/airflow/examples/example-airflow-dags-configmap.yaml @@ -7,9 +7,12 @@ spec: image: productVersion: 3.1.6 clusterConfig: - loadExamples: false - exposeConfig: false - credentialsSecret: simple-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials volumes: - name: cm-dag # <3> configMap: @@ -27,14 +30,4 @@ spec: AIRFLOW__CORE__DAGS_FOLDER: "/dags" # <8> replicas: 1 celeryExecutors: - roleGroups: - default: - envOverrides: - AIRFLOW__CORE__DAGS_FOLDER: "/dags" # <8> - replicas: 2 - schedulers: - roleGroups: - default: - envOverrides: - AIRFLOW__CORE__DAGS_FOLDER: "/dags" # <8> - replicas: 1 + # ... diff --git a/docs/modules/airflow/examples/example-airflow-gitsync-https.yaml b/docs/modules/airflow/examples/example-airflow-gitsync-https.yaml index 7589c9eb..c14abeae 100644 --- a/docs/modules/airflow/examples/example-airflow-gitsync-https.yaml +++ b/docs/modules/airflow/examples/example-airflow-gitsync-https.yaml @@ -9,7 +9,7 @@ spec: clusterConfig: loadExamples: false exposeConfig: false - credentialsSecret: test-airflow-credentials # <1> + credentialsSecret: airflow-admin-credentials # <1> dagsGitSync: # <2> - repo: https://github.com/stackabletech/airflow-operator # <3> branch: "main" # <4> @@ -17,7 +17,7 @@ spec: depth: 10 # <6> wait: 20s # <7> credentials: - basicAuthSecretName: git-credentials # <8> + basicAuthSecretName: airflow-git-credentials # <8> gitSyncConf: # <9> --rev: HEAD # <10> # --rev: git-sync-tag # N.B. tag must be covered by "depth" (the number of commits to clone) @@ -29,7 +29,7 @@ spec: apiVersion: v1 kind: Secret metadata: - name: git-credentials # <8> + name: airflow-git-credentials # <8> type: Opaque data: user: c3Rh... diff --git a/docs/modules/airflow/examples/example-airflow-incluster.yaml b/docs/modules/airflow/examples/example-airflow-incluster.yaml index ca437df9..d126db10 100644 --- a/docs/modules/airflow/examples/example-airflow-incluster.yaml +++ b/docs/modules/airflow/examples/example-airflow-incluster.yaml @@ -9,28 +9,39 @@ spec: clusterConfig: loadExamples: false exposeConfig: false - credentialsSecret: simple-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable roleGroups: default: - envOverrides: + envOverrides: &envOverrides AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" replicas: 1 schedulers: roleGroups: default: - envOverrides: - AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + envOverrides: *envOverrides replicas: 1 celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials roleGroups: default: - envOverrides: - AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + envOverrides: *envOverrides replicas: 1 # in case of using kubernetesExecutors # kubernetesExecutors: -# envOverrides: -# AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" +# envOverrides: *envOverrides diff --git a/docs/modules/airflow/examples/example-airflow-secret.yaml b/docs/modules/airflow/examples/example-airflow-secret.yaml deleted file mode 100644 index 5e112e91..00000000 --- a/docs/modules/airflow/examples/example-airflow-secret.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: simple-airflow-credentials -type: Opaque -stringData: - adminUser.username: airflow - adminUser.firstname: Airflow - adminUser.lastname: Admin - adminUser.email: airflow@airflow.com - adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - # Only needed when using celery workers (instead of Kubernetes executors) - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 diff --git a/docs/modules/airflow/examples/getting_started/code/airflow-credentials.yaml b/docs/modules/airflow/examples/getting_started/code/airflow-credentials.yaml index 5e112e91..7468cd67 100644 --- a/docs/modules/airflow/examples/getting_started/code/airflow-credentials.yaml +++ b/docs/modules/airflow/examples/getting_started/code/airflow-credentials.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Secret metadata: - name: simple-airflow-credentials + name: airflow-admin-user-credentials type: Opaque stringData: adminUser.username: airflow @@ -10,7 +10,19 @@ stringData: adminUser.lastname: Admin adminUser.email: airflow@airflow.com adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - # Only needed when using celery workers (instead of Kubernetes executors) - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-postgresql-credentials +stringData: + username: airflow + password: airflow +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-redis-credentials +stringData: + username: "" + password: redis diff --git a/docs/modules/airflow/examples/getting_started/code/airflow.yaml b/docs/modules/airflow/examples/getting_started/code/airflow.yaml index a2c1b646..0436cfea 100644 --- a/docs/modules/airflow/examples/getting_started/code/airflow.yaml +++ b/docs/modules/airflow/examples/getting_started/code/airflow.yaml @@ -10,7 +10,12 @@ spec: clusterConfig: loadExamples: true exposeConfig: false - credentialsSecret: simple-airflow-credentials + credentialsSecret: airflow-admin-credentials + metadataDatabase: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials webservers: roleConfig: listenerClass: external-unstable @@ -18,6 +23,15 @@ spec: default: replicas: 1 celeryExecutors: + celeryResultBackend: + postgresql: + host: airflow-postgresql + database: airflow + credentialsSecret: airflow-postgresql-credentials + celeryBroker: + redis: + host: airflow-redis-master + credentialsSecret: airflow-redis-credentials roleGroups: default: replicas: 1 diff --git a/docs/modules/airflow/pages/usage-guide/logging.adoc b/docs/modules/airflow/pages/usage-guide/logging.adoc index bd82ee39..6b682690 100644 --- a/docs/modules/airflow/pages/usage-guide/logging.adoc +++ b/docs/modules/airflow/pages/usage-guide/logging.adoc @@ -23,6 +23,7 @@ spec: "flask_appbuilder": level: WARN celeryExecutors: + ... config: logging: enableVectorAgent: true diff --git a/docs/modules/airflow/pages/usage-guide/storage-resources.adoc b/docs/modules/airflow/pages/usage-guide/storage-resources.adoc index 3c399557..69b7772c 100644 --- a/docs/modules/airflow/pages/usage-guide/storage-resources.adoc +++ b/docs/modules/airflow/pages/usage-guide/storage-resources.adoc @@ -27,6 +27,7 @@ spec: default: replicas: 2 celeryExecutors: + ... config: resources: cpu: diff --git a/docs/modules/airflow/pages/usage-guide/using-kubernetes-executors.adoc b/docs/modules/airflow/pages/usage-guide/using-kubernetes-executors.adoc index cdfa0ae5..499872d9 100644 --- a/docs/modules/airflow/pages/usage-guide/using-kubernetes-executors.adoc +++ b/docs/modules/airflow/pages/usage-guide/using-kubernetes-executors.adoc @@ -12,6 +12,7 @@ E.g. you would change the following example ---- spec: celeryExecutors: + ... roleGroups: default: replicas: 2 diff --git a/examples/simple-airflow-cluster-dags-cmap.yaml b/examples/simple-airflow-cluster-dags-cmap.yaml deleted file mode 100644 index d9f38242..00000000 --- a/examples/simple-airflow-cluster-dags-cmap.yaml +++ /dev/null @@ -1,116 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: simple-airflow-credentials -type: Opaque -stringData: - adminUser.username: airflow - adminUser.firstname: Airflow - adminUser.lastname: Admin - adminUser.email: airflow@airflow.com - adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - # Only needed when using celery workers (instead of Kubernetes executors) - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: cm-dag -data: - test_airflow_dag.py: | - from datetime import datetime, timedelta - from airflow import DAG - from airflow.operators.bash import BashOperator - from airflow.operators.dummy import DummyOperator - - with DAG( - dag_id='test_airflow_dag', - schedule='0 0 * * *', - start_date=datetime(2021, 1, 1), - catchup=False, - dagrun_timeout=timedelta(minutes=60), - tags=['example', 'example2'], - params={"example_key": "example_value"}, - ) as dag: - run_this_last = DummyOperator( - task_id='run_this_last', - ) - - # [START howto_operator_bash] - run_this = BashOperator( - task_id='run_after_loop', - bash_command='echo 1', - ) - # [END howto_operator_bash] - - run_this >> run_this_last - - for i in range(3): - task = BashOperator( - task_id='runme_' + str(i), - bash_command='echo "{{ task_instance_key_str }}" && sleep 1', - ) - task >> run_this - - # [START howto_operator_bash_template] - also_run_this = BashOperator( - task_id='also_run_this', - bash_command='echo "run_id={{ run_id }} | dag_run={{ dag_run }}"', - ) - # [END howto_operator_bash_template] - also_run_this >> run_this_last - - # [START howto_operator_bash_skip] - this_will_skip = BashOperator( - task_id='this_will_skip', - bash_command='echo "hello world"; exit 99;', - dag=dag, - ) - # [END howto_operator_bash_skip] - this_will_skip >> run_this_last - - if __name__ == "__main__": - dag.cli() ---- -apiVersion: airflow.stackable.tech/v1alpha1 -kind: AirflowCluster -metadata: - name: airflow-dags-cmap -spec: - image: - productVersion: 3.1.6 - clusterConfig: - loadExamples: false - exposeConfig: false - credentialsSecret: simple-airflow-credentials - volumes: - - name: cm-dag - configMap: - name: cm-dag - volumeMounts: - - name: cm-dag - mountPath: /dags/test_airflow_dag.py - subPath: test_airflow_dag.py - webservers: - roleConfig: - listenerClass: external-unstable - roleGroups: - default: - envOverrides: - AIRFLOW__CORE__DAGS_FOLDER: "/dags" - replicas: 1 - celeryExecutors: - roleGroups: - default: - envOverrides: - AIRFLOW__CORE__DAGS_FOLDER: "/dags" - replicas: 2 - schedulers: - roleGroups: - default: - envOverrides: - AIRFLOW__CORE__DAGS_FOLDER: "/dags" - replicas: 1 diff --git a/examples/simple-airflow-cluster-ldap-insecure-tls.yaml b/examples/simple-airflow-cluster-ldap-insecure-tls.yaml deleted file mode 100644 index d8a96ee2..00000000 --- a/examples/simple-airflow-cluster-ldap-insecure-tls.yaml +++ /dev/null @@ -1,181 +0,0 @@ -# helm install secret-operator oci://oci.stackable.tech/sdp-charts/secret-operator -# helm install commons-operator oci://oci.stackable.tech/sdp-charts/commons-operator -# helm install listener-operator oci://oci.stackable.tech/sdp-charts/listener-operator -# helm install airflow-operator oci://oci.stackable.tech/sdp-charts/airflow-operator -# helm install --repo https://charts.bitnami.com/bitnami --version 12.1.5 --set auth.username=airflow --set auth.password=airflow --set auth.database=airflow --set image.repository=bitnamilegacy/postgresql --set volumePermissions.image.repository=bitnamilegacy/os-shell --set metrics.image.repository=bitnamilegacy/postgres-exporter --set global.security.allowInsecureImages=true airflow-postgresql postgresql -# helm install --repo https://charts.bitnami.com/bitnami --version 17.3.7 --set auth.password=redis --set replica.replicaCount=1 --set global.security.allowInsecureImages=true --set image.repository=bitnamilegacy/redis --set sentinel.image.repository=bitnamilegacy/redis-sentinel --set metrics.image.repository=bitnamilegacy/redis-exporter --set volumePermissions.image.repository=bitnamilegacy/os-shell --set kubectl.image.repository=bitnamilegacy/kubectl --set sysctl.image.repository=bitnamilegacy/os-shell airflow-redis redis -# Log in with user01/user01 or user02/user02 ---- -apiVersion: secrets.stackable.tech/v1alpha1 -kind: SecretClass -metadata: - name: openldap-tls -spec: - backend: - autoTls: - ca: - autoGenerate: true - secret: - name: openldap-tls-ca - namespace: default ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: openldap - labels: - app.kubernetes.io/name: openldap -spec: - selector: - matchLabels: - app.kubernetes.io/name: openldap - serviceName: openldap - replicas: 1 - template: - metadata: - labels: - app.kubernetes.io/name: openldap - spec: - containers: - - name: openldap - image: docker.io/bitnamilegacy/openldap:2.5 - env: - - name: LDAP_ADMIN_USERNAME - value: admin - - name: LDAP_ADMIN_PASSWORD - value: admin - - name: LDAP_USERS - value: user01,user02 - - name: LDAP_PASSWORDS - value: user01,user02 - - name: LDAP_ENABLE_TLS - value: "yes" - - name: LDAP_TLS_CERT_FILE - value: /tls/tls.crt - - name: LDAP_TLS_KEY_FILE - value: /tls/tls.key - - name: LDAP_TLS_CA_FILE - value: /tls/ca.crt - ports: - - name: tls-ldap - containerPort: 1636 - volumeMounts: - - name: tls - mountPath: /tls - volumes: - - name: tls - ephemeral: - volumeClaimTemplate: - metadata: - annotations: - secrets.stackable.tech/class: openldap-tls - secrets.stackable.tech/scope: pod - spec: - storageClassName: secrets.stackable.tech - accessModes: - - ReadWriteOnce - resources: - requests: - storage: "1" ---- -apiVersion: v1 -kind: Service -metadata: - name: openldap - labels: - app.kubernetes.io/name: openldap -spec: - type: ClusterIP - ports: - - name: tls-ldap - port: 1636 - targetPort: tls-ldap - selector: - app.kubernetes.io/name: openldap ---- -apiVersion: authentication.stackable.tech/v1alpha1 -kind: AuthenticationClass -metadata: - name: airflow-with-ldap-insecure-tls-ldap -spec: - provider: - ldap: - hostname: openldap.default.svc.cluster.local - port: 1636 - searchBase: ou=users,dc=example,dc=org - ldapFieldNames: - uid: uid - group: memberof - givenName: givenName - surname: sn - email: mail - bindCredentials: - secretClass: airflow-with-ldap-bind - tls: - verification: - none: {} ---- -apiVersion: secrets.stackable.tech/v1alpha1 -kind: SecretClass -metadata: - name: airflow-with-ldap-bind -spec: - backend: - k8sSearch: - searchNamespace: - pod: {} ---- -apiVersion: v1 -kind: Secret -metadata: - name: airflow-with-ldap-bind - labels: - secrets.stackable.tech/class: airflow-with-ldap-bind -stringData: - user: cn=admin,dc=example,dc=org - password: admin ---- -apiVersion: v1 -kind: Secret -metadata: - name: airflow-with-ldap-server-veri-tls-credentials -type: Opaque -stringData: - adminUser.username: airflow - adminUser.firstname: Airflow - adminUser.lastname: Admin - adminUser.email: airflow@airflow.com - adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - # Only needed when using celery workers (instead of Kubernetes executors) - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 ---- -apiVersion: airflow.stackable.tech/v1alpha1 -kind: AirflowCluster -metadata: - name: airflow-insecure-tls -spec: - image: - productVersion: 3.1.6 - clusterConfig: - loadExamples: true - exposeConfig: true - credentialsSecret: airflow-with-ldap-server-veri-tls-credentials - authentication: - - authenticationClass: airflow-with-ldap-insecure-tls-ldap - userRegistrationRole: Admin - webservers: - roleConfig: - listenerClass: external-unstable - roleGroups: - default: - replicas: 1 - celeryExecutors: - roleGroups: - default: - replicas: 1 - schedulers: - roleGroups: - default: - replicas: 1 diff --git a/examples/simple-airflow-cluster-ldap.yaml b/examples/simple-airflow-cluster-ldap.yaml deleted file mode 100644 index 2cf1b515..00000000 --- a/examples/simple-airflow-cluster-ldap.yaml +++ /dev/null @@ -1,179 +0,0 @@ -# helm install secret-operator oci://oci.stackable.tech/sdp-charts/secret-operator -# helm install commons-operator oci://oci.stackable.tech/sdp-charts/commons-operator -# helm install listener-operator oci://oci.stackable.tech/sdp-charts/listener-operator -# helm install airflow-operator oci://oci.stackable.tech/sdp-charts/airflow-operator -# helm install --repo https://charts.bitnami.com/bitnami --version 12.1.5 --set auth.username=airflow --set auth.password=airflow --set auth.database=airflow --set image.repository=bitnamilegacy/postgresql --set volumePermissions.image.repository=bitnamilegacy/os-shell --set metrics.image.repository=bitnamilegacy/postgres-exporter --set global.security.allowInsecureImages=true airflow-postgresql postgresql -# helm install --repo https://charts.bitnami.com/bitnami --version 17.3.7 --set auth.password=redis --set replica.replicaCount=1 --set global.security.allowInsecureImages=true --set image.repository=bitnamilegacy/redis --set sentinel.image.repository=bitnamilegacy/redis-sentinel --set metrics.image.repository=bitnamilegacy/redis-exporter --set volumePermissions.image.repository=bitnamilegacy/os-shell --set kubectl.image.repository=bitnamilegacy/kubectl --set sysctl.image.repository=bitnamilegacy/os-shell airflow-redis redis -# Log in with user01/user01 or user02/user02 ---- -apiVersion: secrets.stackable.tech/v1alpha1 -kind: SecretClass -metadata: - name: openldap-tls -spec: - backend: - autoTls: - ca: - autoGenerate: true - secret: - name: openldap-tls-ca - namespace: default ---- -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: openldap - labels: - app.kubernetes.io/name: openldap -spec: - selector: - matchLabels: - app.kubernetes.io/name: openldap - serviceName: openldap - replicas: 1 - template: - metadata: - labels: - app.kubernetes.io/name: openldap - spec: - containers: - - name: openldap - image: docker.io/bitnamilegacy/openldap:2.5 - env: - - name: LDAP_ADMIN_USERNAME - value: admin - - name: LDAP_ADMIN_PASSWORD - value: admin - - name: LDAP_USERS - value: user01,user02 - - name: LDAP_PASSWORDS - value: user01,user02 - - name: LDAP_ENABLE_TLS - value: "yes" - - name: LDAP_TLS_CERT_FILE - value: /tls/tls.crt - - name: LDAP_TLS_KEY_FILE - value: /tls/tls.key - - name: LDAP_TLS_CA_FILE - value: /tls/ca.crt - ports: - - name: tls-ldap - containerPort: 1636 - volumeMounts: - - name: tls - mountPath: /tls - volumes: - - name: tls - ephemeral: - volumeClaimTemplate: - metadata: - annotations: - secrets.stackable.tech/class: openldap-tls - secrets.stackable.tech/scope: pod - spec: - storageClassName: secrets.stackable.tech - accessModes: - - ReadWriteOnce - resources: - requests: - storage: "1" ---- -apiVersion: v1 -kind: Service -metadata: - name: openldap - labels: - app.kubernetes.io/name: openldap -spec: - type: ClusterIP - ports: - - name: tls-ldap - port: 636 - targetPort: tls-ldap - selector: - app.kubernetes.io/name: openldap ---- -apiVersion: authentication.stackable.tech/v1alpha1 -kind: AuthenticationClass -metadata: - name: airflow-with-ldap-server-veri-tls-ldap -spec: - provider: - ldap: - hostname: openldap.default.svc.cluster.local - port: 636 - searchBase: ou=users,dc=example,dc=org - ldapFieldNames: - uid: uid - bindCredentials: - secretClass: airflow-with-ldap-server-veri-tls-ldap-bind - tls: - verification: - server: - caCert: - secretClass: openldap-tls ---- -apiVersion: secrets.stackable.tech/v1alpha1 -kind: SecretClass -metadata: - name: airflow-with-ldap-server-veri-tls-ldap-bind -spec: - backend: - k8sSearch: - searchNamespace: - pod: {} ---- -apiVersion: v1 -kind: Secret -metadata: - name: airflow-with-ldap-server-veri-tls-ldap-bind - labels: - secrets.stackable.tech/class: airflow-with-ldap-server-veri-tls-ldap-bind -stringData: - user: cn=admin,dc=example,dc=org - password: admin ---- -apiVersion: v1 -kind: Secret -metadata: - name: airflow-with-ldap-server-veri-tls-credentials -type: Opaque -stringData: - adminUser.username: airflow - adminUser.firstname: Airflow - adminUser.lastname: Admin - adminUser.email: airflow@airflow.com - adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - # Only needed when using celery workers (instead of Kubernetes executors) - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 ---- -apiVersion: airflow.stackable.tech/v1alpha1 -kind: AirflowCluster -metadata: - name: airflow-with-ldap-server-veri-tls -spec: - image: - productVersion: 3.1.6 - clusterConfig: - loadExamples: true - exposeConfig: true - credentialsSecret: airflow-with-ldap-server-veri-tls-credentials - authentication: - - authenticationClass: airflow-with-ldap-server-veri-tls-ldap - userRegistrationRole: Admin - webservers: - roleConfig: - listenerClass: external-unstable - roleGroups: - default: - replicas: 1 - celeryExecutors: - roleGroups: - default: - replicas: 1 - schedulers: - roleGroups: - default: - replicas: 1 diff --git a/examples/simple-airflow-cluster.yaml b/examples/simple-airflow-cluster.yaml deleted file mode 100644 index 0dd0449e..00000000 --- a/examples/simple-airflow-cluster.yaml +++ /dev/null @@ -1,42 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: simple-airflow-credentials -type: Opaque -stringData: - adminUser.username: airflow - adminUser.firstname: Airflow - adminUser.lastname: Admin - adminUser.email: airflow@airflow.com - adminUser.password: airflow - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - # Only needed when using celery workers (instead of Kubernetes executors) - connections.celeryResultBackend: db+postgresql://airflow:airflow@airflow-postgresql.default.svc.cluster.local/airflow - connections.celeryBrokerUrl: redis://:redis@airflow-redis-master:6379/0 ---- -apiVersion: airflow.stackable.tech/v1alpha1 -kind: AirflowCluster -metadata: - name: airflow -spec: - image: - productVersion: 3.1.6 - clusterConfig: - loadExamples: true - exposeConfig: false - credentialsSecret: simple-airflow-credentials - webservers: - roleConfig: - listenerClass: external-unstable - roleGroups: - default: - replicas: 1 - celeryExecutors: - roleGroups: - default: - replicas: 2 - schedulers: - roleGroups: - default: - replicas: 1 diff --git a/rust/operator-binary/src/crd/affinity.rs b/rust/operator-binary/src/crd/affinity.rs index b2326eda..e6b0b333 100644 --- a/rust/operator-binary/src/crd/affinity.rs +++ b/rust/operator-binary/src/crd/affinity.rs @@ -179,7 +179,7 @@ mod tests { image: productVersion: 3.1.6 clusterConfig: - credentialsSecret: airflow-credentials + credentialsSecret: airflow-admin-credentials metadataDatabase: postgresql: host: airflow-postgresql From ba6c88da7753b78109f74a881a60748266dc541b Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Tue, 3 Mar 2026 15:22:30 +0100 Subject: [PATCH 07/10] Further update docs --- .../examples/getting_started/code/airflow-credentials.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/airflow/examples/getting_started/code/airflow-credentials.yaml b/docs/modules/airflow/examples/getting_started/code/airflow-credentials.yaml index 7468cd67..01399eb2 100644 --- a/docs/modules/airflow/examples/getting_started/code/airflow-credentials.yaml +++ b/docs/modules/airflow/examples/getting_started/code/airflow-credentials.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Secret metadata: - name: airflow-admin-user-credentials + name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow From a850a8ad366c71bc01bb0127714b370d2b525f6b Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 4 Mar 2026 11:42:07 +0100 Subject: [PATCH 08/10] bump op-rs --- Cargo.lock | 50 +++++++++++++++------------- Cargo.nix | 59 +++++++++++++++++++-------------- extra/crds.yaml | 88 +++++++++++++++++++++++++++++++++---------------- 3 files changed, 123 insertions(+), 74 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f539fc78..02c2dc28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1002,19 +1002,19 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "rand_core 0.10.0", "wasip2", "wasip3", @@ -1458,9 +1458,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819b44bc7c87d9117eb522f14d46e918add69ff12713c475946b0a29363ed1c2" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -1473,9 +1473,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "470252db18ecc35fd766c0891b1e3ec6cbbcd62507e85276c01bf75d8e94d4a1" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", @@ -1484,9 +1484,9 @@ dependencies = [ [[package]] name = "jiff-tzdb" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" +checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076" [[package]] name = "jiff-tzdb-platform" @@ -1568,7 +1568,7 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "darling", "regex", @@ -2265,9 +2265,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -2278,6 +2278,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.8.5" @@ -2305,7 +2311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" dependencies = [ "chacha20", - "getrandom 0.4.1", + "getrandom 0.4.2", "rand_core 0.10.0", ] @@ -2963,7 +2969,7 @@ dependencies = [ [[package]] name = "stackable-certs" version = "0.4.0" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "const-oid", "ecdsa", @@ -2987,7 +2993,7 @@ dependencies = [ [[package]] name = "stackable-operator" version = "0.106.2" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "clap", "const_format", @@ -3026,7 +3032,7 @@ dependencies = [ [[package]] name = "stackable-operator-derive" version = "0.3.1" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "darling", "proc-macro2", @@ -3037,7 +3043,7 @@ dependencies = [ [[package]] name = "stackable-shared" version = "0.1.0" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "jiff", "k8s-openapi", @@ -3054,7 +3060,7 @@ dependencies = [ [[package]] name = "stackable-telemetry" version = "0.6.1" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "axum", "clap", @@ -3078,7 +3084,7 @@ dependencies = [ [[package]] name = "stackable-versioned" version = "0.8.3" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "schemars", "serde", @@ -3091,7 +3097,7 @@ dependencies = [ [[package]] name = "stackable-versioned-macros" version = "0.8.3" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "convert_case", "convert_case_extras", @@ -3109,7 +3115,7 @@ dependencies = [ [[package]] name = "stackable-webhook" version = "0.9.0" -source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#49f8ba016ac35d69508bd01cb4c88e9737be124a" +source = "git+https://github.com/stackabletech//operator-rs.git?branch=spike%2Fgeneric-databases#3e391ff13fa57fd0d07913e730ad9a6eefff8448" dependencies = [ "arc-swap", "async-trait", diff --git a/Cargo.nix b/Cargo.nix index 2a6f3251..5235772d 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -3150,7 +3150,7 @@ rec { } { name = "r-efi"; - packageId = "r-efi"; + packageId = "r-efi 5.3.0"; usesDefaultFeatures = false; target = { target, features }: (("uefi" == target."os" or null) && ("efi_rng" == target."getrandom_backend" or null)); } @@ -3166,11 +3166,11 @@ rec { }; resolvedDefaultFeatures = [ "std" ]; }; - "getrandom 0.4.1" = rec { + "getrandom 0.4.2" = rec { crateName = "getrandom"; - version = "0.4.1"; + version = "0.4.2"; edition = "2024"; - sha256 = "1v7fm84f2jh6x7w3bd2ncl3sw29wnb0rhg7xya1pd30i02cg77hk"; + sha256 = "0mb5833hf9pvn9dhvxjgfg5dx0m77g8wavvjdpvpnkp9fil1xr8d"; authors = [ "The Rand Project Developers" ]; @@ -3229,7 +3229,7 @@ rec { } { name = "r-efi"; - packageId = "r-efi"; + packageId = "r-efi 6.0.0"; usesDefaultFeatures = false; target = { target, features }: (("uefi" == target."os" or null) && ("efi_rng" == target."getrandom_backend" or null)); } @@ -4698,9 +4698,9 @@ rec { }; "jiff" = rec { crateName = "jiff"; - version = "0.2.22"; + version = "0.2.23"; edition = "2021"; - sha256 = "1hni7qv2j2kbjisw84r7y6gxdb8qx534vw92nmz13nc7gjy496w1"; + sha256 = "0nc37n7jvgrzxdkcgc2hsfdf70lfagigjalh4igjrm5njvf4cd8s"; authors = [ "Andrew Gallant " ]; @@ -4780,9 +4780,9 @@ rec { }; "jiff-static" = rec { crateName = "jiff-static"; - version = "0.2.22"; + version = "0.2.23"; edition = "2021"; - sha256 = "18fljj75vxqvq1v55s074pbbrjy67qg1p2f0cvbmzhzc33dm40j7"; + sha256 = "192ss3cnixvg79cpa76clwkhn4mmz10vnwsbf7yjw8i484s8p31a"; procMacro = true; libName = "jiff_static"; authors = [ @@ -4809,9 +4809,9 @@ rec { }; "jiff-tzdb" = rec { crateName = "jiff-tzdb"; - version = "0.1.5"; + version = "0.1.6"; edition = "2021"; - sha256 = "1hm5xn3q092zac6apjy4492ddid473mwa0d64z5f5f95yyzix5v8"; + sha256 = "0xihzlnnyk0xnrzpq4xcyjdcmy8xc3ychzb9ayjkh4vgha2fy069"; libName = "jiff_tzdb"; libPath = "lib.rs"; authors = [ @@ -5054,7 +5054,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; libName = "k8s_version"; @@ -7520,9 +7520,9 @@ rec { }; "quote" = rec { crateName = "quote"; - version = "1.0.44"; + version = "1.0.45"; edition = "2021"; - sha256 = "1r7c7hxl66vz3q9qizgjhy77pdrrypqgk4ghc7260xvvfb7ypci1"; + sha256 = "095rb5rg7pbnwdp6v8w5jw93wndwyijgci1b5lw8j1h5cscn3wj1"; authors = [ "David Tolnay " ]; @@ -7539,7 +7539,7 @@ rec { }; resolvedDefaultFeatures = [ "default" "proc-macro" ]; }; - "r-efi" = rec { + "r-efi 5.3.0" = rec { crateName = "r-efi"; version = "5.3.0"; edition = "2018"; @@ -7551,6 +7551,17 @@ rec { "rustc-dep-of-std" = [ "core" ]; }; }; + "r-efi 6.0.0" = rec { + crateName = "r-efi"; + version = "6.0.0"; + edition = "2018"; + sha256 = "1gyrl2k5fyzj9k7kchg2n296z5881lg7070msabid09asp3wkp7q"; + libName = "r_efi"; + features = { + "core" = [ "dep:core" ]; + "rustc-dep-of-std" = [ "core" ]; + }; + }; "rand 0.10.0" = rec { crateName = "rand"; version = "0.10.0"; @@ -7570,7 +7581,7 @@ rec { } { name = "getrandom"; - packageId = "getrandom 0.4.1"; + packageId = "getrandom 0.4.2"; optional = true; } { @@ -9873,7 +9884,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; libName = "stackable_certs"; @@ -9976,7 +9987,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; libName = "stackable_operator"; @@ -10149,7 +10160,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; procMacro = true; @@ -10184,7 +10195,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; libName = "stackable_shared"; @@ -10265,7 +10276,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; libName = "stackable_telemetry"; @@ -10375,7 +10386,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; libName = "stackable_versioned"; @@ -10419,7 +10430,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; procMacro = true; @@ -10487,7 +10498,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech//operator-rs.git"; - rev = "49f8ba016ac35d69508bd01cb4c88e9737be124a"; + rev = "3e391ff13fa57fd0d07913e730ad9a6eefff8448"; sha256 = "09vjgrikwnjkjkqd558vjf15jw9s1gjpwv2v7vwa1l8j2xsjlrg9"; }; libName = "stackable_webhook"; diff --git a/extra/crds.yaml b/extra/crds.yaml index 8ac69ffa..58fc0407 100644 --- a/extra/crds.yaml +++ b/extra/crds.yaml @@ -60,21 +60,27 @@ spec: description: TODO docs properties: credentialsSecret: - description: TODO docs + description: |- + Name of a Secret containing the `username` and `password` keys used to authenticate + against the Redis server. type: string databaseId: default: 0 - description: TODO docs + description: |- + Numeric index of the Redis logical database to use. Defaults to `0`. + + Redis supports multiple logical databases within a single instance, identified by an + integer index. Database `0` is the default. format: uint16 maximum: 65535.0 minimum: 0.0 type: integer host: - description: TODO docs + description: Hostname or IP address of the Redis server. type: string port: default: 6379 - description: TODO docs + description: Port the Redis server is listening on. Defaults to `6379`. format: uint16 maximum: 65535.0 minimum: 0.0 @@ -105,23 +111,28 @@ spec: description: TODO docs properties: credentialsSecret: - description: TODO docs + description: |- + Name of a Secret containing the `username` and `password` keys used to authenticate + against the PostgreSQL server. type: string database: - description: TODO docs + description: Name of the database (schema) to connect to. type: string host: - description: TODO docs + description: Hostname or IP address of the PostgreSQL server. type: string parameters: additionalProperties: type: string default: {} - description: TODO docs + description: |- + Additional map of JDBC connection parameters to append to the connection URL. The given + `HashMap` will be converted to query parameters in the form of + `?param1=value1¶m2=value2`. type: object port: default: 5432 - description: TODO docs + description: Port the PostgreSQL server is listening on. Defaults to `5432`. format: uint16 maximum: 65535.0 minimum: 0.0 @@ -1361,23 +1372,28 @@ spec: description: TODO docs properties: credentialsSecret: - description: TODO docs + description: |- + Name of a Secret containing the `username` and `password` keys used to authenticate + against the PostgreSQL server. type: string database: - description: TODO docs + description: Name of the database (schema) to connect to. type: string host: - description: TODO docs + description: Hostname or IP address of the PostgreSQL server. type: string parameters: additionalProperties: type: string default: {} - description: TODO docs + description: |- + Additional map of JDBC connection parameters to append to the connection URL. The given + `HashMap` will be converted to query parameters in the form of + `?param1=value1¶m2=value2`. type: object port: default: 5432 - description: TODO docs + description: Port the PostgreSQL server is listening on. Defaults to `5432`. format: uint16 maximum: 65535.0 minimum: 0.0 @@ -6081,21 +6097,27 @@ spec: description: TODO docs properties: credentialsSecret: - description: TODO docs + description: |- + Name of a Secret containing the `username` and `password` keys used to authenticate + against the Redis server. type: string databaseId: default: 0 - description: TODO docs + description: |- + Numeric index of the Redis logical database to use. Defaults to `0`. + + Redis supports multiple logical databases within a single instance, identified by an + integer index. Database `0` is the default. format: uint16 maximum: 65535.0 minimum: 0.0 type: integer host: - description: TODO docs + description: Hostname or IP address of the Redis server. type: string port: default: 6379 - description: TODO docs + description: Port the Redis server is listening on. Defaults to `6379`. format: uint16 maximum: 65535.0 minimum: 0.0 @@ -6126,23 +6148,28 @@ spec: description: TODO docs properties: credentialsSecret: - description: TODO docs + description: |- + Name of a Secret containing the `username` and `password` keys used to authenticate + against the PostgreSQL server. type: string database: - description: TODO docs + description: Name of the database (schema) to connect to. type: string host: - description: TODO docs + description: Hostname or IP address of the PostgreSQL server. type: string parameters: additionalProperties: type: string default: {} - description: TODO docs + description: |- + Additional map of JDBC connection parameters to append to the connection URL. The given + `HashMap` will be converted to query parameters in the form of + `?param1=value1¶m2=value2`. type: object port: default: 5432 - description: TODO docs + description: Port the PostgreSQL server is listening on. Defaults to `5432`. format: uint16 maximum: 65535.0 minimum: 0.0 @@ -7358,23 +7385,28 @@ spec: description: TODO docs properties: credentialsSecret: - description: TODO docs + description: |- + Name of a Secret containing the `username` and `password` keys used to authenticate + against the PostgreSQL server. type: string database: - description: TODO docs + description: Name of the database (schema) to connect to. type: string host: - description: TODO docs + description: Hostname or IP address of the PostgreSQL server. type: string parameters: additionalProperties: type: string default: {} - description: TODO docs + description: |- + Additional map of JDBC connection parameters to append to the connection URL. The given + `HashMap` will be converted to query parameters in the form of + `?param1=value1¶m2=value2`. type: object port: default: 5432 - description: TODO docs + description: Port the PostgreSQL server is listening on. Defaults to `5432`. format: uint16 maximum: 65535.0 minimum: 0.0 From d268bd78079ddb44fa632b5043f2619b3133e528 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 4 Mar 2026 15:24:31 +0100 Subject: [PATCH 09/10] cargo fmt --- rust/operator-binary/src/crd/mod.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index 0284bbce..8d5ddc68 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -1139,7 +1139,10 @@ mod tests { assert_eq!("3.1.6", &resolved_airflow_image.product_version); - assert_eq!("KubernetesExecutor", cluster.spec.executor.as_airflow_core_executor()); + assert_eq!( + "KubernetesExecutor", + cluster.spec.executor.as_airflow_core_executor() + ); assert!(cluster.spec.cluster_config.load_examples); assert!(cluster.spec.cluster_config.expose_config); // defaults to true From 773f2070f453fb63b4b450162c97f6493abaeb75 Mon Sep 17 00:00:00 2001 From: Sebastian Bernauer Date: Wed, 4 Mar 2026 15:35:18 +0100 Subject: [PATCH 10/10] Use docs from op-rs --- extra/crds.yaml | 68 ++++++++++++++++++----- rust/operator-binary/src/crd/databases.rs | 12 ++-- rust/operator-binary/src/crd/mod.rs | 2 +- 3 files changed, 61 insertions(+), 21 deletions(-) diff --git a/extra/crds.yaml b/extra/crds.yaml index 58fc0407..b247142c 100644 --- a/extra/crds.yaml +++ b/extra/crds.yaml @@ -48,7 +48,13 @@ spec: - generic properties: generic: - description: TODO docs + description: |- + A generic Celery database connection for broker or result backend types not covered by a + dedicated variant. + + Use this when you need a Celery-compatible connection that does not have a first-class + connection type. The complete connection URI is read from a Secret, giving the user full + control over the connection string. properties: uriSecret: description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. @@ -57,7 +63,10 @@ spec: - uriSecret type: object redis: - description: TODO docs + description: |- + Connection settings for a [Redis](https://redis.io/) instance. + + Redis is commonly used as a Celery message broker or result backend (e.g. for Apache Airflow). properties: credentialsSecret: description: |- @@ -99,7 +108,13 @@ spec: - generic properties: generic: - description: TODO docs + description: |- + A generic Celery database connection for broker or result backend types not covered by a + dedicated variant. + + Use this when you need a Celery-compatible connection that does not have a first-class + connection type. The complete connection URI is read from a Secret, giving the user full + control over the connection string. properties: uriSecret: description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. @@ -108,7 +123,7 @@ spec: - uriSecret type: object postgresql: - description: TODO docs + description: Connection settings for a [PostgreSQL](https://www.postgresql.org/) database. properties: credentialsSecret: description: |- @@ -1352,7 +1367,7 @@ spec: [getting started guide](https://docs.stackable.tech/home/nightly/airflow/getting_started/). type: boolean metadataDatabase: - description: TODO docs + description: Configure the database where Airflow stores all it's internal metadata oneOf: - required: - postgresql @@ -1360,7 +1375,12 @@ spec: - generic properties: generic: - description: TODO docs + description: |- + A generic SQLAlchemy database connection for database types not covered by a dedicated variant. + + Use this when you need to connect to a SQLAlchemy-compatible database that does not have a + first-class connection type. The complete connection URI is read from a Secret, giving the user + full control over the connection string including any driver-specific options. properties: uriSecret: description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. @@ -1369,7 +1389,7 @@ spec: - uriSecret type: object postgresql: - description: TODO docs + description: Connection settings for a [PostgreSQL](https://www.postgresql.org/) database. properties: credentialsSecret: description: |- @@ -6085,7 +6105,13 @@ spec: - generic properties: generic: - description: TODO docs + description: |- + A generic Celery database connection for broker or result backend types not covered by a + dedicated variant. + + Use this when you need a Celery-compatible connection that does not have a first-class + connection type. The complete connection URI is read from a Secret, giving the user full + control over the connection string. properties: uriSecret: description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. @@ -6094,7 +6120,10 @@ spec: - uriSecret type: object redis: - description: TODO docs + description: |- + Connection settings for a [Redis](https://redis.io/) instance. + + Redis is commonly used as a Celery message broker or result backend (e.g. for Apache Airflow). properties: credentialsSecret: description: |- @@ -6136,7 +6165,13 @@ spec: - generic properties: generic: - description: TODO docs + description: |- + A generic Celery database connection for broker or result backend types not covered by a + dedicated variant. + + Use this when you need a Celery-compatible connection that does not have a first-class + connection type. The complete connection URI is read from a Secret, giving the user full + control over the connection string. properties: uriSecret: description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. @@ -6145,7 +6180,7 @@ spec: - uriSecret type: object postgresql: - description: TODO docs + description: Connection settings for a [PostgreSQL](https://www.postgresql.org/) database. properties: credentialsSecret: description: |- @@ -7365,7 +7400,7 @@ spec: [getting started guide](https://docs.stackable.tech/home/nightly/airflow/getting_started/). type: boolean metadataDatabase: - description: TODO docs + description: Configure the database where Airflow stores all it's internal metadata oneOf: - required: - postgresql @@ -7373,7 +7408,12 @@ spec: - generic properties: generic: - description: TODO docs + description: |- + A generic SQLAlchemy database connection for database types not covered by a dedicated variant. + + Use this when you need to connect to a SQLAlchemy-compatible database that does not have a + first-class connection type. The complete connection URI is read from a Secret, giving the user + full control over the connection string including any driver-specific options. properties: uriSecret: description: The name of the Secret that contains an `uri` key with the complete SQLAlchemy URI. @@ -7382,7 +7422,7 @@ spec: - uriSecret type: object postgresql: - description: TODO docs + description: Connection settings for a [PostgreSQL](https://www.postgresql.org/) database. properties: credentialsSecret: description: |- diff --git a/rust/operator-binary/src/crd/databases.rs b/rust/operator-binary/src/crd/databases.rs index 792fe143..000bd0b9 100644 --- a/rust/operator-binary/src/crd/databases.rs +++ b/rust/operator-binary/src/crd/databases.rs @@ -13,10 +13,10 @@ use stackable_operator::{ #[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub enum MetadataDatabaseConnection { - /// TODO docs + // Docs are on the struct Postgresql(PostgresqlConnection), - /// TODO docs + // Docs are on the struct Generic(GenericSQLAlchemyDatabaseConnection), } @@ -32,10 +32,10 @@ impl MetadataDatabaseConnection { #[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub enum CeleryResultBackendConnection { - /// TODO docs + // Docs are on the struct Postgresql(PostgresqlConnection), - /// TODO docs + // Docs are on the struct Generic(GenericCeleryDatabaseConnection), } @@ -51,10 +51,10 @@ impl CeleryResultBackendConnection { #[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub enum CeleryBrokerConnection { - /// TODO docs + // Docs are on the struct Redis(RedisConnection), - /// TODO docs + // Docs are on the struct Generic(GenericCeleryDatabaseConnection), } diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index 8d5ddc68..34f3f924 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -248,7 +248,7 @@ pub mod versioned { #[serde(skip_serializing_if = "Option::is_none")] pub authorization: Option, - /// TODO docs + /// Configure the database where Airflow stores all it's internal metadata pub metadata_database: MetadataDatabaseConnection, /// The name of the Secret object containing the admin user credentials. Read the