diff --git a/Cargo.lock b/Cargo.lock index 357f166a..6c2f42b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -147,18 +147,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -220,6 +220,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.8.0" @@ -237,9 +243,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.5" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" dependencies = [ "chrono", "git2", @@ -259,15 +265,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cc" -version = "1.2.10" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" dependencies = [ "jobserver", "libc", @@ -295,9 +301,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.27" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" dependencies = [ "clap_builder", "clap_derive", @@ -305,9 +311,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" dependencies = [ "anstream", "anstyle", @@ -317,14 +323,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -368,6 +374,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -449,7 +464,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -460,7 +475,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -471,7 +486,7 @@ checksum = "297806318ef30ad066b15792a8372858020ae3ca2e414ee6c2133b1eb9e9e945" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -501,7 +516,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -526,9 +541,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" [[package]] name = "educe" @@ -539,7 +554,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -583,14 +598,14 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "event-listener" @@ -624,6 +639,15 @@ dependencies = [ "regex-syntax 0.8.5", ] +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "fnv" version = "1.0.7" @@ -707,7 +731,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -776,11 +800,11 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" +checksum = "3fda788993cc341f69012feba8bf45c0ba4f3291fcc08e214b4d5a7332d88aff" dependencies = [ - "bitflags", + "bitflags 2.8.0", "libc", "libgit2-sys", "log", @@ -793,6 +817,16 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.15.2" @@ -1134,7 +1168,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1171,7 +1205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.2", ] [[package]] @@ -1201,6 +1235,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -1237,18 +1280,45 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-patch" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +dependencies = [ + "jsonptr 0.4.7", + "serde", + "serde_json", + "thiserror 1.0.69", +] + [[package]] name = "json-patch" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" dependencies = [ - "jsonptr", + "jsonptr 0.6.3", "serde", "serde_json", "thiserror 1.0.69", ] +[[package]] +name = "jsonpath-rust" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d8fe85bd70ff715f31ce8c739194b423d79811a19602115d611a3ec85d6200" +dependencies = [ + "lazy_static", + "once_cell", + "pest", + "pest_derive", + "regex", + "serde_json", + "thiserror 1.0.69", +] + [[package]] name = "jsonpath-rust" version = "0.7.5" @@ -1262,6 +1332,17 @@ dependencies = [ "thiserror 2.0.11", ] +[[package]] +name = "jsonptr" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +dependencies = [ + "fluent-uri", + "serde", + "serde_json", +] + [[package]] name = "jsonptr" version = "0.6.3" @@ -1272,6 +1353,20 @@ dependencies = [ "serde_json", ] +[[package]] +name = "k8s-openapi" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8847402328d8301354c94d605481f25a6bdc1ed65471fd96af8eca71141b13" +dependencies = [ + "base64 0.22.1", + "chrono", + "schemars", + "serde", + "serde-value", + "serde_json", +] + [[package]] name = "k8s-openapi" version = "0.24.0" @@ -1286,17 +1381,78 @@ dependencies = [ "serde_json", ] +[[package]] +name = "k8s-version" +version = "0.1.2" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-versioned-0.5.0#048c7d8befddc2f2c6414444006871c95412d67c" +dependencies = [ + "darling", + "regex", + "snafu 0.8.5", +] + +[[package]] +name = "kube" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efffeb3df0bd4ef3e5d65044573499c0e4889b988070b08c50b25b1329289a1f" +dependencies = [ + "k8s-openapi 0.23.0", + "kube-client 0.96.0", + "kube-core 0.96.0", + "kube-derive 0.96.0", + "kube-runtime 0.96.0", +] + [[package]] name = "kube" version = "0.98.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32053dc495efad4d188c7b33cc7c02ef4a6e43038115348348876efd39a53cba" dependencies = [ - "k8s-openapi", - "kube-client", - "kube-core", - "kube-derive", - "kube-runtime", + "k8s-openapi 0.24.0", + "kube-client 0.98.0", + "kube-core 0.98.0", + "kube-derive 0.98.0", + "kube-runtime 0.98.0", +] + +[[package]] +name = "kube-client" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf471ece8ff8d24735ce78dac4d091e9fcb8d74811aeb6b75de4d1c3f5de0f1" +dependencies = [ + "base64 0.22.1", + "bytes", + "chrono", + "either", + "futures 0.3.31", + "home", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-http-proxy", + "hyper-rustls", + "hyper-timeout", + "hyper-util", + "jsonpath-rust 0.5.1", + "k8s-openapi 0.23.0", + "kube-core 0.96.0", + "pem", + "rustls", + "rustls-pemfile", + "secrecy", + "serde", + "serde_json", + "serde_yaml", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tracing", ] [[package]] @@ -1319,9 +1475,9 @@ dependencies = [ "hyper-rustls", "hyper-timeout", "hyper-util", - "jsonpath-rust", - "k8s-openapi", - "kube-core", + "jsonpath-rust 0.7.5", + "k8s-openapi 0.24.0", + "kube-core 0.98.0", "pem", "rustls", "rustls-pemfile", @@ -1337,6 +1493,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "kube-core" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f42346d30bb34d1d7adc5c549b691bce7aa3a1e60254e68fab7e2d7b26fe3d77" +dependencies = [ + "chrono", + "form_urlencoded", + "http", + "json-patch 2.0.0", + "k8s-openapi 0.23.0", + "schemars", + "serde", + "serde-value", + "serde_json", + "thiserror 1.0.69", +] + [[package]] name = "kube-core" version = "0.98.0" @@ -1346,8 +1520,8 @@ dependencies = [ "chrono", "form_urlencoded", "http", - "json-patch", - "k8s-openapi", + "json-patch 3.0.1", + "k8s-openapi 0.24.0", "schemars", "serde", "serde-value", @@ -1355,6 +1529,19 @@ dependencies = [ "thiserror 2.0.11", ] +[[package]] +name = "kube-derive" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9364e04cc5e0482136c6ee8b7fb7551812da25802249f35b3def7aaa31e82ad" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.98", +] + [[package]] name = "kube-derive" version = "0.98.0" @@ -1365,7 +1552,35 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.96", + "syn 2.0.98", +] + +[[package]] +name = "kube-runtime" +version = "0.96.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fbf1f6ffa98e65f1d2a9a69338bb60605d46be7edf00237784b89e62c9bd44" +dependencies = [ + "ahash", + "async-broadcast", + "async-stream", + "async-trait", + "backoff", + "educe", + "futures 0.3.31", + "hashbrown 0.14.5", + "json-patch 2.0.0", + "jsonptr 0.4.7", + "k8s-openapi 0.23.0", + "kube-client 0.96.0", + "parking_lot", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "tracing", ] [[package]] @@ -1381,12 +1596,12 @@ dependencies = [ "backoff", "educe", "futures 0.3.31", - "hashbrown", + "hashbrown 0.15.2", "hostname", - "json-patch", - "jsonptr", - "k8s-openapi", - "kube-client", + "json-patch 3.0.1", + "jsonptr 0.6.3", + "k8s-openapi 0.24.0", + "kube-client 0.98.0", "parking_lot", "pin-project", "serde", @@ -1411,9 +1626,9 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libgit2-sys" -version = "0.17.0+1.8.1" +version = "0.18.0+1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" +checksum = "e1a117465e7e1597e8febea8bb0c410f1c7fb93b1e1cddf34363f8390367ffec" dependencies = [ "cc", "libc", @@ -1478,9 +1693,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", ] @@ -1542,9 +1757,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "openssl-probe" @@ -1710,7 +1925,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1726,22 +1941,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1856,7 +2071,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags", + "bitflags 2.8.0", ] [[package]] @@ -1911,15 +2126,14 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "ring" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" dependencies = [ "cc", "cfg-if", "getrandom", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -1950,7 +2164,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.96", + "syn 2.0.98", "unicode-ident", ] @@ -1971,9 +2185,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.21" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "log", "once_cell", @@ -2078,7 +2292,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2102,7 +2316,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.8.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -2115,7 +2329,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags", + "bitflags 2.8.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -2165,7 +2379,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2176,7 +2390,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2267,9 +2481,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "snafu" @@ -2310,7 +2524,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2323,35 +2537,12 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "stackable-hbase-crd" -version = "0.0.0-dev" -dependencies = [ - "indoc", - "product-config", - "rstest", - "serde", - "serde_json", - "serde_yaml", - "shell-escape", - "snafu 0.8.5", - "stackable-operator", - "strum", - "tracing", -] - [[package]] name = "stackable-hbase-operator" version = "0.0.0-dev" @@ -2362,13 +2553,16 @@ dependencies = [ "const_format", "fnv", "futures 0.3.31", + "indoc", "product-config", "rstest", "serde", + "serde_json", "serde_yaml", + "shell-escape", "snafu 0.8.5", - "stackable-hbase-crd", "stackable-operator", + "stackable-versioned", "strum", "tokio", "tracing", @@ -2388,9 +2582,9 @@ dependencies = [ "either", "futures 0.3.31", "indexmap", - "json-patch", - "k8s-openapi", - "kube", + "json-patch 3.0.1", + "k8s-openapi 0.24.0", + "kube 0.98.0", "opentelemetry-jaeger", "opentelemetry_sdk", "product-config", @@ -2420,7 +2614,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2428,13 +2622,37 @@ name = "stackable-shared" version = "0.0.1" source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.85.0#59506c6202778889a27b6ae8153457e60a49c68d" dependencies = [ - "kube", + "kube 0.98.0", "semver", "serde", "serde_yaml", "snafu 0.8.5", ] +[[package]] +name = "stackable-versioned" +version = "0.5.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-versioned-0.5.0#048c7d8befddc2f2c6414444006871c95412d67c" +dependencies = [ + "stackable-versioned-macros", +] + +[[package]] +name = "stackable-versioned-macros" +version = "0.5.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-versioned-0.5.0#048c7d8befddc2f2c6414444006871c95412d67c" +dependencies = [ + "convert_case", + "darling", + "itertools", + "k8s-openapi 0.23.0", + "k8s-version", + "kube 0.96.0", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "strsim" version = "0.11.1" @@ -2460,7 +2678,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2482,9 +2700,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -2505,7 +2723,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2534,7 +2752,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2545,7 +2763,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2647,7 +2865,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2693,9 +2911,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "toml_datetime", @@ -2726,7 +2944,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ "base64 0.22.1", - "bitflags", + "bitflags 2.8.0", "bytes", "http", "http-body", @@ -2781,7 +2999,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2878,6 +3096,12 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -2981,7 +3205,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-shared", ] @@ -3003,7 +3227,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3152,9 +3376,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.25" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad699df48212c6cc6eb4435f35500ac6fd3b9913324f938aea302022ce19d310" +checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" dependencies = [ "memchr", ] @@ -3197,7 +3421,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -3219,7 +3443,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3239,7 +3463,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -3268,5 +3492,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] diff --git a/Cargo.nix b/Cargo.nix index f3845f29..b22c9738 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -32,21 +32,23 @@ rec { # "public" attributes that we attempt to keep stable with new versions of crate2nix. # + rootCrate = rec { + packageId = "stackable-hbase-operator"; + # Use this attribute to refer to the derivation building your root crate package. + # You can override the features with rootCrate.build.override { features = [ "default" "feature1" ... ]; }. + build = internal.buildRustCrateWithFeatures { + inherit packageId; + }; + + # Debug support which might change between releases. + # File a bug if you depend on any for non-debug work! + debug = internal.debugCrate { inherit packageId; }; + }; # Refer your crate build derivation by name here. # You can override the features with # workspaceMembers."${crateName}".build.override { features = [ "default" "feature1" ... ]; }. workspaceMembers = { - "stackable-hbase-crd" = rec { - packageId = "stackable-hbase-crd"; - build = internal.buildRustCrateWithFeatures { - packageId = "stackable-hbase-crd"; - }; - - # Debug support which might change between releases. - # File a bug if you depend on any for non-debug work! - debug = internal.debugCrate { inherit packageId; }; - }; "stackable-hbase-operator" = rec { packageId = "stackable-hbase-operator"; build = internal.buildRustCrateWithFeatures { @@ -453,7 +455,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" "visit-mut" ]; } ]; @@ -461,9 +463,9 @@ rec { }; "async-trait" = rec { crateName = "async-trait"; - version = "0.1.85"; + version = "0.1.86"; edition = "2021"; - sha256 = "0mm0gwad44zs7mna4a0m1z4dhzpmydfj73w4wm23c8xpnhrli4rz"; + sha256 = "17g7pk7fxbsf61hdbmf727q56bcqvdpjapxw5wd7gwvb114xfkb4"; procMacro = true; libName = "async_trait"; authors = [ @@ -480,7 +482,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; usesDefaultFeatures = false; features = [ "clone-impls" "full" "parsing" "printing" "proc-macro" "visit-mut" ]; } @@ -655,7 +657,22 @@ rec { }; resolvedDefaultFeatures = [ "std" ]; }; - "bitflags" = rec { + "bitflags 1.3.2" = rec { + crateName = "bitflags"; + version = "1.3.2"; + edition = "2018"; + sha256 = "12ki6w8gn1ldq7yz9y680llwk5gmrhrzszaa17g1sbrw2r2qvwxy"; + authors = [ + "The Rust Project Developers" + ]; + features = { + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "rustc-dep-of-std" = [ "core" "compiler_builtins" ]; + }; + resolvedDefaultFeatures = [ "default" ]; + }; + "bitflags 2.8.0" = rec { crateName = "bitflags"; version = "2.8.0"; edition = "2021"; @@ -691,9 +708,9 @@ rec { }; "built" = rec { crateName = "built"; - version = "0.7.5"; + version = "0.7.7"; edition = "2021"; - sha256 = "0fyhzjgymls3qylggd6rs4vkq44rkl1kyv33lfbfrdsjxmd50q63"; + sha256 = "0ywn0m11xm80pg6zrzq3sdj3vmzg3qs6baqnvfmkd377ly8n3van"; authors = [ "Lukas Lueg " ]; @@ -723,9 +740,9 @@ rec { }; "bumpalo" = rec { crateName = "bumpalo"; - version = "3.16.0"; + version = "3.17.0"; edition = "2021"; - sha256 = "0b015qb4knwanbdlp1x48pkb4pm57b8gidbhhhxr900q2wb6fabr"; + sha256 = "1gxxsn2fsjmv03g8p3m749mczv2k4m8xspifs5l7bcx0vx3gna0n"; authors = [ "Nick Fitzgerald " ]; @@ -750,24 +767,25 @@ rec { }; "bytes" = rec { crateName = "bytes"; - version = "1.9.0"; + version = "1.10.0"; edition = "2018"; - sha256 = "16ykzx24v1x4f42v2lxyvlczqhdfji3v7r4ghwckpwijzvb1hn9j"; + sha256 = "1ybcmdrlxrsrn7lnl0xrjg10j7zb4r01jjs5b2sqhrcwh62aq7gn"; authors = [ "Carl Lerche " "Sean McArthur " ]; features = { "default" = [ "std" ]; + "extra-platforms" = [ "dep:extra-platforms" ]; "serde" = [ "dep:serde" ]; }; resolvedDefaultFeatures = [ "default" "std" ]; }; "cc" = rec { crateName = "cc"; - version = "1.2.10"; + version = "1.2.14"; edition = "2018"; - sha256 = "0aaj2ivamhfzhgb9maasnfkh03s2mzhzpzwrkghgzbkfnv5qy80k"; + sha256 = "1jg38k6a2hirhsfk8mdg3k8l3f8b9h7dn6hllq07nfjsj0p1ng8c"; authors = [ "Alex Crichton " ]; @@ -873,10 +891,10 @@ rec { }; "clap" = rec { crateName = "clap"; - version = "4.5.27"; + version = "4.5.29"; edition = "2021"; crateBin = []; - sha256 = "15j720q1z953h1qxm2q5nwkmyhhl2vb45v017rqlhjrbk12h36vn"; + sha256 = "110193i6270qsr6mpc4nghqs4bcz2d1631a3ncrkca3rv25bvkla"; dependencies = [ { name = "clap_builder"; @@ -905,6 +923,7 @@ rec { "unicode" = [ "clap_builder/unicode" ]; "unstable-doc" = [ "clap_builder/unstable-doc" "derive" ]; "unstable-ext" = [ "clap_builder/unstable-ext" ]; + "unstable-markdown" = [ "clap_derive/unstable-markdown" ]; "unstable-styles" = [ "clap_builder/unstable-styles" ]; "unstable-v5" = [ "clap_builder/unstable-v5" "clap_derive?/unstable-v5" "deprecated" ]; "usage" = [ "clap_builder/usage" ]; @@ -914,9 +933,9 @@ rec { }; "clap_builder" = rec { crateName = "clap_builder"; - version = "4.5.27"; + version = "4.5.29"; edition = "2021"; - sha256 = "1mys7v60lys8zkwpk49wif9qnja9zamm4dnrsbj40wdmni78h9hv"; + sha256 = "1yf2r66wl4ybia10wdpycidyqz8sp9bi9k4sskgy3isivb5k5fpn"; dependencies = [ { name = "anstream"; @@ -953,9 +972,9 @@ rec { }; "clap_derive" = rec { crateName = "clap_derive"; - version = "4.5.24"; + version = "4.5.28"; edition = "2021"; - sha256 = "131ih3dm76srkbpfx7zfspp9b556zgzj31wqhl0ji2b39lcmbdsl"; + sha256 = "1vgigkhljp3r8r5lwdrn1ij93nafmjwh8cx77nppb9plqsaysk5z"; procMacro = true; dependencies = [ { @@ -972,12 +991,13 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" ]; } ]; features = { "raw-deprecated" = [ "deprecated" ]; + "unstable-markdown" = [ "dep:pulldown-cmark" "dep:anstyle" ]; "unstable-v5" = [ "deprecated" ]; }; resolvedDefaultFeatures = [ "default" ]; @@ -1086,6 +1106,25 @@ rec { }; resolvedDefaultFeatures = [ "default" ]; }; + "convert_case" = rec { + crateName = "convert_case"; + version = "0.6.0"; + edition = "2018"; + sha256 = "1jn1pq6fp3rri88zyw6jlhwwgf6qiyc08d6gjv0qypgkl862n67c"; + authors = [ + "Rutrum " + ]; + dependencies = [ + { + name = "unicode-segmentation"; + packageId = "unicode-segmentation"; + } + ]; + features = { + "rand" = [ "dep:rand" ]; + "random" = [ "rand" ]; + }; + }; "core-foundation 0.10.0" = rec { crateName = "core-foundation"; version = "0.10.0"; @@ -1164,9 +1203,9 @@ rec { }; "cpufeatures" = rec { crateName = "cpufeatures"; - version = "0.2.16"; + version = "0.2.17"; edition = "2018"; - sha256 = "1hy466fkhxjbb16i7na95wz8yr14d0kd578pwzj5lbkz14jh5f0n"; + sha256 = "10023dnnaghhdl70xcds12fsx2b966sxbxjq5sxs49mvxqw5ivar"; authors = [ "RustCrypto Developers" ]; @@ -1174,21 +1213,25 @@ rec { { name = "libc"; packageId = "libc"; + usesDefaultFeatures = false; target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "aarch64-linux-android"); } { name = "libc"; packageId = "libc"; + usesDefaultFeatures = false; target = { target, features }: (("aarch64" == target."arch" or null) && ("linux" == target."os" or null)); } { name = "libc"; packageId = "libc"; + usesDefaultFeatures = false; target = { target, features }: (("aarch64" == target."arch" or null) && ("apple" == target."vendor" or null)); } { name = "libc"; packageId = "libc"; + usesDefaultFeatures = false; target = { target, features }: (("loongarch64" == target."arch" or null) && ("linux" == target."os" or null)); } ]; @@ -1308,7 +1351,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" "extra-traits" ]; } ]; @@ -1338,7 +1381,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; @@ -1364,7 +1407,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" "visit-mut" ]; } ]; @@ -1451,7 +1494,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; features = { @@ -1509,9 +1552,9 @@ rec { }; "dyn-clone" = rec { crateName = "dyn-clone"; - version = "1.0.17"; + version = "1.0.18"; edition = "2018"; - sha256 = "09cig7dgg6jnqa10p4233nd8wllbjf4ffsw7wj0m4lwa5w3z0vhd"; + sha256 = "0dag651ph5q0mcax74y4m1k9hyl737q1v03isck3mzxsfd7g9vpy"; libName = "dyn_clone"; authors = [ "David Tolnay " @@ -1544,13 +1587,13 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; devDependencies = [ { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" ]; } ]; @@ -1652,7 +1695,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; features = { @@ -1660,9 +1703,9 @@ rec { }; "equivalent" = rec { crateName = "equivalent"; - version = "1.0.1"; + version = "1.0.2"; edition = "2015"; - sha256 = "1malmx5f4lkfvqasz319lq6gb3ddg19yzf9s8cykfsgzdmyq0hsl"; + sha256 = "03swzqznragy8n0x31lqc78g2af054jwivp7lkrbrc0khz74lyl7"; }; "event-listener" = rec { @@ -1767,6 +1810,26 @@ rec { }; resolvedDefaultFeatures = [ "default" "perf" "std" "unicode" ]; }; + "fluent-uri" = rec { + crateName = "fluent-uri"; + version = "0.1.4"; + edition = "2021"; + sha256 = "03ah2qajw5l1zbc81kh1n8g7n24mfxbg6vqyv9ixipg1vglh9iqp"; + libName = "fluent_uri"; + authors = [ + "Scallop Ye " + ]; + dependencies = [ + { + name = "bitflags"; + packageId = "bitflags 1.3.2"; + } + ]; + features = { + "default" = [ "std" ]; + }; + resolvedDefaultFeatures = [ "std" ]; + }; "fnv" = rec { crateName = "fnv"; version = "1.0.7"; @@ -1990,7 +2053,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" ]; } ]; @@ -2210,9 +2273,9 @@ rec { }; "git2" = rec { crateName = "git2"; - version = "0.19.0"; + version = "0.20.0"; edition = "2018"; - sha256 = "091pv7866z1qjq800ys0wjv8n73wrv7fqdrddxcnq36w8lzbf0xr"; + sha256 = "1zwav0r76njd9chqxh7wj4r4zfn08nzsisrg05liyd6cjf4piniz"; authors = [ "Josh Triplett " "Alex Crichton " @@ -2220,7 +2283,7 @@ rec { dependencies = [ { name = "bitflags"; - packageId = "bitflags"; + packageId = "bitflags 2.8.0"; } { name = "libc"; @@ -2240,12 +2303,11 @@ rec { } ]; features = { - "default" = [ "ssh" "https" "ssh_key_from_memory" ]; + "default" = [ "ssh" "https" ]; "https" = [ "libgit2-sys/https" "openssl-sys" "openssl-probe" ]; "openssl-probe" = [ "dep:openssl-probe" ]; "openssl-sys" = [ "dep:openssl-sys" ]; "ssh" = [ "libgit2-sys/ssh" ]; - "ssh_key_from_memory" = [ "libgit2-sys/ssh_key_from_memory" ]; "vendored-libgit2" = [ "libgit2-sys/vendored" ]; "vendored-openssl" = [ "openssl-sys/vendored" "libgit2-sys/vendored-openssl" ]; "zlib-ng-compat" = [ "libgit2-sys/zlib-ng-compat" ]; @@ -2261,7 +2323,46 @@ rec { ]; }; - "hashbrown" = rec { + "hashbrown 0.14.5" = rec { + crateName = "hashbrown"; + version = "0.14.5"; + edition = "2021"; + sha256 = "1wa1vy1xs3mp11bn3z9dv0jricgr6a2j0zkf1g19yz3vw4il89z5"; + authors = [ + "Amanieu d'Antras " + ]; + dependencies = [ + { + name = "ahash"; + packageId = "ahash"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "allocator-api2"; + packageId = "allocator-api2"; + optional = true; + usesDefaultFeatures = false; + features = [ "alloc" ]; + } + ]; + features = { + "ahash" = [ "dep:ahash" ]; + "alloc" = [ "dep:alloc" ]; + "allocator-api2" = [ "dep:allocator-api2" ]; + "compiler_builtins" = [ "dep:compiler_builtins" ]; + "core" = [ "dep:core" ]; + "default" = [ "ahash" "inline-more" "allocator-api2" ]; + "equivalent" = [ "dep:equivalent" ]; + "nightly" = [ "allocator-api2?/nightly" "bumpalo/allocator_api" ]; + "rayon" = [ "dep:rayon" ]; + "rkyv" = [ "dep:rkyv" ]; + "rustc-dep-of-std" = [ "nightly" "core" "compiler_builtins" "alloc" "rustc-internal-api" ]; + "serde" = [ "dep:serde" ]; + }; + resolvedDefaultFeatures = [ "ahash" "allocator-api2" "default" "inline-more" ]; + }; + "hashbrown 0.15.2" = rec { crateName = "hashbrown"; version = "0.15.2"; edition = "2021"; @@ -2525,9 +2626,9 @@ rec { }; "httparse" = rec { crateName = "httparse"; - version = "1.9.5"; + version = "1.10.0"; edition = "2018"; - sha256 = "0ip9v8m9lvgvq1lznl31wvn0ch1v254na7lhid9p29yx9rbx6wbx"; + sha256 = "0ahyh51rrpizd7m1jy5p791xfwn9cnmv0snd2q528h3i9vghimzj"; authors = [ "Sean McArthur " ]; @@ -2548,9 +2649,9 @@ rec { }; "hyper" = rec { crateName = "hyper"; - version = "1.5.2"; + version = "1.6.0"; edition = "2021"; - sha256 = "1q7akfb443yrjzkmnnbp2vs8zi15hgbk466rr4y144v4ppabhvr5"; + sha256 = "103ggny2k31z0iq2gzwk2vbx601wx6xkpjpxn40hr3p3b0b5fayc"; authors = [ "Sean McArthur " ]; @@ -3450,7 +3551,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; @@ -3531,7 +3632,7 @@ rec { } { name = "hashbrown"; - packageId = "hashbrown"; + packageId = "hashbrown 0.15.2"; usesDefaultFeatures = false; } ]; @@ -3605,6 +3706,27 @@ rec { }; resolvedDefaultFeatures = [ "default" ]; }; + "itertools" = rec { + crateName = "itertools"; + version = "0.13.0"; + edition = "2018"; + sha256 = "11hiy3qzl643zcigknclh446qb9zlg4dpdzfkjaa9q9fqpgyfgj1"; + authors = [ + "bluss" + ]; + dependencies = [ + { + name = "either"; + packageId = "either"; + usesDefaultFeatures = false; + } + ]; + features = { + "default" = [ "use_std" ]; + "use_std" = [ "use_alloc" "either/use_std" ]; + }; + resolvedDefaultFeatures = [ "default" "use_alloc" "use_std" ]; + }; "itoa" = rec { crateName = "itoa"; version = "1.0.14"; @@ -3686,7 +3808,48 @@ rec { }; resolvedDefaultFeatures = [ "default" "std" ]; }; - "json-patch" = rec { + "json-patch 2.0.0" = rec { + crateName = "json-patch"; + version = "2.0.0"; + edition = "2021"; + sha256 = "1z1h6dyy4lx4z74yby2hvgl4jbm8mh5ymjp6fwcdkyi3923bh7sv"; + libName = "json_patch"; + authors = [ + "Ivan Dubrov " + ]; + dependencies = [ + { + name = "jsonptr"; + packageId = "jsonptr 0.4.7"; + } + { + name = "serde"; + packageId = "serde"; + features = [ "derive" ]; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "thiserror"; + packageId = "thiserror 1.0.69"; + } + ]; + devDependencies = [ + { + name = "serde_json"; + packageId = "serde_json"; + features = [ "preserve_order" ]; + } + ]; + features = { + "default" = [ "diff" ]; + "utoipa" = [ "dep:utoipa" ]; + }; + resolvedDefaultFeatures = [ "default" "diff" ]; + }; + "json-patch 3.0.1" = rec { crateName = "json-patch"; version = "3.0.1"; edition = "2021"; @@ -3698,7 +3861,7 @@ rec { dependencies = [ { name = "jsonptr"; - packageId = "jsonptr"; + packageId = "jsonptr 0.6.3"; } { name = "serde"; @@ -3727,7 +3890,48 @@ rec { }; resolvedDefaultFeatures = [ "default" "diff" ]; }; - "jsonpath-rust" = rec { + "jsonpath-rust 0.5.1" = rec { + crateName = "jsonpath-rust"; + version = "0.5.1"; + edition = "2018"; + sha256 = "0032bp43w6k1bl8h55m126cdf8xljj8p736f65gp3zvhpn2zxn0r"; + libName = "jsonpath_rust"; + authors = [ + "BorisZhguchev " + ]; + dependencies = [ + { + name = "lazy_static"; + packageId = "lazy_static"; + } + { + name = "once_cell"; + packageId = "once_cell"; + } + { + name = "pest"; + packageId = "pest"; + } + { + name = "pest_derive"; + packageId = "pest_derive"; + } + { + name = "regex"; + packageId = "regex"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "thiserror"; + packageId = "thiserror 1.0.69"; + } + ]; + + }; + "jsonpath-rust 0.7.5" = rec { crateName = "jsonpath-rust"; version = "0.7.5"; edition = "2021"; @@ -3760,7 +3964,44 @@ rec { ]; }; - "jsonptr" = rec { + "jsonptr 0.4.7" = rec { + crateName = "jsonptr"; + version = "0.4.7"; + edition = "2021"; + sha256 = "09s6bqjlkd1m5z9hi9iwjimiri7wx3fd6d88hara0p27968m4vhw"; + authors = [ + "chance dinkins" + ]; + dependencies = [ + { + name = "fluent-uri"; + packageId = "fluent-uri"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "serde"; + packageId = "serde"; + usesDefaultFeatures = false; + features = [ "alloc" ]; + } + { + name = "serde_json"; + packageId = "serde_json"; + usesDefaultFeatures = false; + features = [ "alloc" ]; + } + ]; + features = { + "default" = [ "std" ]; + "fluent-uri" = [ "dep:fluent-uri" ]; + "std" = [ "serde/std" "serde_json/std" "fluent-uri?/std" ]; + "uniresid" = [ "dep:uniresid" ]; + "url" = [ "dep:url" ]; + }; + resolvedDefaultFeatures = [ "default" "std" ]; + }; + "jsonptr 0.6.3" = rec { crateName = "jsonptr"; version = "0.6.3"; edition = "2021"; @@ -3794,12 +4035,12 @@ rec { }; resolvedDefaultFeatures = [ "assign" "default" "delete" "json" "resolve" "serde" "std" ]; }; - "k8s-openapi" = rec { + "k8s-openapi 0.23.0" = rec { crateName = "k8s-openapi"; - version = "0.24.0"; + version = "0.23.0"; edition = "2021"; - links = "k8s-openapi-0.24.0"; - sha256 = "1m8ahw59g44kp9p4yd4ar0px15m2nyvhc5krbvqvw2ag6a8bjx9c"; + links = "k8s-openapi-0.23.0"; + sha256 = "04qv2iqwm3mgjvyp2m6n3vf6nnpjh5a60kf9ah9k1n184d04g24w"; libName = "k8s_openapi"; authors = [ "Arnav Singh " @@ -3841,53 +4082,140 @@ rec { } ]; features = { - "earliest" = [ "v1_28" ]; - "latest" = [ "v1_32" ]; + "earliest" = [ "v1_26" ]; + "latest" = [ "v1_31" ]; "schemars" = [ "dep:schemars" ]; }; - resolvedDefaultFeatures = [ "schemars" "v1_32" ]; + resolvedDefaultFeatures = [ "schemars" "v1_31" ]; }; - "kube" = rec { - crateName = "kube"; - version = "0.98.0"; + "k8s-openapi 0.24.0" = rec { + crateName = "k8s-openapi"; + version = "0.24.0"; edition = "2021"; - sha256 = "1fiwllwzsvl7921k85c10d1nwjpg09ycqcvvihc4vbggjp23s19j"; + links = "k8s-openapi-0.24.0"; + sha256 = "1m8ahw59g44kp9p4yd4ar0px15m2nyvhc5krbvqvw2ag6a8bjx9c"; + libName = "k8s_openapi"; authors = [ - "clux " - "Natalie Klestrup Röijezon " - "kazk " + "Arnav Singh " ]; dependencies = [ { - name = "k8s-openapi"; - packageId = "k8s-openapi"; + name = "base64"; + packageId = "base64 0.22.1"; usesDefaultFeatures = false; + features = [ "alloc" ]; } { - name = "kube-client"; - packageId = "kube-client"; - optional = true; + name = "chrono"; + packageId = "chrono"; usesDefaultFeatures = false; + features = [ "alloc" "serde" ]; } { - name = "kube-core"; - packageId = "kube-core"; - } - { - name = "kube-derive"; - packageId = "kube-derive"; + name = "schemars"; + packageId = "schemars"; optional = true; + usesDefaultFeatures = false; } { - name = "kube-runtime"; - packageId = "kube-runtime"; - optional = true; + name = "serde"; + packageId = "serde"; + usesDefaultFeatures = false; } - ]; - devDependencies = [ { - name = "k8s-openapi"; - packageId = "k8s-openapi"; + name = "serde-value"; + packageId = "serde-value"; + usesDefaultFeatures = false; + } + { + name = "serde_json"; + packageId = "serde_json"; + usesDefaultFeatures = false; + features = [ "alloc" ]; + } + ]; + features = { + "earliest" = [ "v1_28" ]; + "latest" = [ "v1_32" ]; + "schemars" = [ "dep:schemars" ]; + }; + resolvedDefaultFeatures = [ "schemars" "v1_32" ]; + }; + "k8s-version" = rec { + crateName = "k8s-version"; + version = "0.1.2"; + edition = "2021"; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech/operator-rs.git"; + rev = "048c7d8befddc2f2c6414444006871c95412d67c"; + sha256 = "1x2pfibrsysmkkmajyj30qkwsjf3rzmc3dxsd09jb9r4x7va6mr6"; + }; + libName = "k8s_version"; + authors = [ + "Stackable GmbH " + ]; + dependencies = [ + { + name = "darling"; + packageId = "darling"; + optional = true; + } + { + name = "regex"; + packageId = "regex"; + } + { + name = "snafu"; + packageId = "snafu 0.8.5"; + } + ]; + features = { + "darling" = [ "dep:darling" ]; + }; + resolvedDefaultFeatures = [ "darling" ]; + }; + "kube 0.96.0" = rec { + crateName = "kube"; + version = "0.96.0"; + edition = "2021"; + sha256 = "07ws50li6nxja26b0w40k2dqir60k4s5fi2hsvjz6kmxy0yypzzg"; + authors = [ + "clux " + "Natalie Klestrup Röijezon " + "kazk " + ]; + dependencies = [ + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; + usesDefaultFeatures = false; + } + { + name = "kube-client"; + packageId = "kube-client 0.96.0"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "kube-core"; + packageId = "kube-core 0.96.0"; + } + { + name = "kube-derive"; + packageId = "kube-derive 0.96.0"; + optional = true; + } + { + name = "kube-runtime"; + packageId = "kube-runtime 0.96.0"; + optional = true; + } + ]; + devDependencies = [ + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; usesDefaultFeatures = false; features = [ "latest" ]; } @@ -3919,11 +4247,83 @@ rec { }; resolvedDefaultFeatures = [ "client" "config" "derive" "jsonpatch" "kube-client" "kube-derive" "kube-runtime" "runtime" "rustls-tls" ]; }; - "kube-client" = rec { - crateName = "kube-client"; + "kube 0.98.0" = rec { + crateName = "kube"; version = "0.98.0"; edition = "2021"; - sha256 = "1jd06xwhnmzrzqrfwq7jlmmxl7dvaygmchjx363zmlgvrlwasd4x"; + sha256 = "1fiwllwzsvl7921k85c10d1nwjpg09ycqcvvihc4vbggjp23s19j"; + authors = [ + "clux " + "Natalie Klestrup Röijezon " + "kazk " + ]; + dependencies = [ + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; + usesDefaultFeatures = false; + } + { + name = "kube-client"; + packageId = "kube-client 0.98.0"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "kube-core"; + packageId = "kube-core 0.98.0"; + } + { + name = "kube-derive"; + packageId = "kube-derive 0.98.0"; + optional = true; + } + { + name = "kube-runtime"; + packageId = "kube-runtime 0.98.0"; + optional = true; + } + ]; + devDependencies = [ + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; + usesDefaultFeatures = false; + features = [ "latest" ]; + } + ]; + features = { + "admission" = [ "kube-core/admission" ]; + "aws-lc-rs" = [ "kube-client?/aws-lc-rs" ]; + "client" = [ "kube-client/client" "config" ]; + "config" = [ "kube-client/config" ]; + "default" = [ "client" "rustls-tls" ]; + "derive" = [ "kube-derive" "kube-core/schema" ]; + "gzip" = [ "kube-client/gzip" "client" ]; + "http-proxy" = [ "kube-client/http-proxy" "client" ]; + "jsonpatch" = [ "kube-core/jsonpatch" ]; + "kube-client" = [ "dep:kube-client" ]; + "kube-derive" = [ "dep:kube-derive" ]; + "kube-runtime" = [ "dep:kube-runtime" ]; + "kubelet-debug" = [ "kube-client/kubelet-debug" "kube-core/kubelet-debug" ]; + "oauth" = [ "kube-client/oauth" "client" ]; + "oidc" = [ "kube-client/oidc" "client" ]; + "openssl-tls" = [ "kube-client/openssl-tls" "client" ]; + "runtime" = [ "kube-runtime" ]; + "rustls-tls" = [ "kube-client/rustls-tls" "client" ]; + "socks5" = [ "kube-client/socks5" "client" ]; + "unstable-client" = [ "kube-client/unstable-client" "client" ]; + "unstable-runtime" = [ "kube-runtime/unstable-runtime" "runtime" ]; + "webpki-roots" = [ "kube-client/webpki-roots" "client" ]; + "ws" = [ "kube-client/ws" "kube-core/ws" ]; + }; + resolvedDefaultFeatures = [ "client" "config" "derive" "jsonpatch" "kube-client" "kube-derive" "kube-runtime" "runtime" "rustls-tls" ]; + }; + "kube-client 0.96.0" = rec { + crateName = "kube-client"; + version = "0.96.0"; + edition = "2021"; + sha256 = "1wg0blziqkfyfmmyn6l1fj6wp7qy156sr3g7birj93gzx3n73x4b"; libName = "kube_client"; authors = [ "clux " @@ -4010,17 +4410,17 @@ rec { } { name = "jsonpath-rust"; - packageId = "jsonpath-rust"; + packageId = "jsonpath-rust 0.5.1"; optional = true; } { name = "k8s-openapi"; - packageId = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; usesDefaultFeatures = false; } { name = "kube-core"; - packageId = "kube-core"; + packageId = "kube-core 0.96.0"; } { name = "pem"; @@ -4058,7 +4458,7 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.11"; + packageId = "thiserror 1.0.69"; } { name = "tokio"; @@ -4098,14 +4498,9 @@ rec { usesDefaultFeatures = false; features = [ "async-await" ]; } - { - name = "hyper"; - packageId = "hyper"; - features = [ "server" ]; - } { name = "k8s-openapi"; - packageId = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; usesDefaultFeatures = false; features = [ "latest" ]; } @@ -4166,55 +4561,559 @@ rec { }; resolvedDefaultFeatures = [ "__non_core" "base64" "bytes" "chrono" "client" "config" "either" "futures" "home" "http-body" "http-body-util" "hyper" "hyper-rustls" "hyper-timeout" "hyper-util" "jsonpatch" "jsonpath-rust" "pem" "rustls" "rustls-pemfile" "rustls-tls" "serde_yaml" "tokio" "tokio-util" "tower" "tower-http" "tracing" ]; }; - "kube-core" = rec { - crateName = "kube-core"; + "kube-client 0.98.0" = rec { + crateName = "kube-client"; version = "0.98.0"; edition = "2021"; - sha256 = "1wwnsn1wk7bd2jiv9iw8446j0bczagqv1lc4wy88l5wa505q7alp"; - libName = "kube_core"; + sha256 = "1jd06xwhnmzrzqrfwq7jlmmxl7dvaygmchjx363zmlgvrlwasd4x"; + libName = "kube_client"; authors = [ "clux " "Natalie Klestrup Röijezon " "kazk " ]; dependencies = [ + { + name = "base64"; + packageId = "base64 0.22.1"; + optional = true; + } + { + name = "bytes"; + packageId = "bytes"; + optional = true; + } { name = "chrono"; packageId = "chrono"; + optional = true; usesDefaultFeatures = false; - features = [ "now" ]; } { - name = "form_urlencoded"; - packageId = "form_urlencoded"; + name = "either"; + packageId = "either"; + optional = true; + } + { + name = "futures"; + packageId = "futures 0.3.31"; + optional = true; + usesDefaultFeatures = false; + features = [ "std" ]; + } + { + name = "home"; + packageId = "home"; + optional = true; + } + { + name = "http"; + packageId = "http"; + } + { + name = "http-body"; + packageId = "http-body"; + optional = true; + } + { + name = "http-body-util"; + packageId = "http-body-util"; + optional = true; + } + { + name = "hyper"; + packageId = "hyper"; + optional = true; + features = [ "client" "http1" ]; + } + { + name = "hyper-http-proxy"; + packageId = "hyper-http-proxy"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "hyper-rustls"; + packageId = "hyper-rustls"; + optional = true; + usesDefaultFeatures = false; + features = [ "http1" "logging" "native-tokio" "ring" "tls12" ]; + } + { + name = "hyper-timeout"; + packageId = "hyper-timeout"; + optional = true; + } + { + name = "hyper-util"; + packageId = "hyper-util"; + optional = true; + features = [ "client" "client-legacy" "http1" "tokio" ]; + } + { + name = "jsonpath-rust"; + packageId = "jsonpath-rust 0.7.5"; + optional = true; + } + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; + usesDefaultFeatures = false; + } + { + name = "kube-core"; + packageId = "kube-core 0.98.0"; + } + { + name = "pem"; + packageId = "pem"; + optional = true; + } + { + name = "rustls"; + packageId = "rustls"; + optional = true; + usesDefaultFeatures = false; + } + { + name = "rustls-pemfile"; + packageId = "rustls-pemfile"; + optional = true; + } + { + name = "secrecy"; + packageId = "secrecy"; + } + { + name = "serde"; + packageId = "serde"; + features = [ "derive" ]; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "serde_yaml"; + packageId = "serde_yaml"; + optional = true; + } + { + name = "thiserror"; + packageId = "thiserror 2.0.11"; + } + { + name = "tokio"; + packageId = "tokio"; + optional = true; + features = [ "time" "signal" "sync" ]; + } + { + name = "tokio-util"; + packageId = "tokio-util"; + optional = true; + features = [ "io" "codec" ]; + } + { + name = "tower"; + packageId = "tower"; + optional = true; + features = [ "buffer" "filter" "util" ]; + } + { + name = "tower-http"; + packageId = "tower-http"; + optional = true; + features = [ "auth" "map-response-body" "trace" ]; + } + { + name = "tracing"; + packageId = "tracing"; + optional = true; + features = [ "log" ]; + } + ]; + devDependencies = [ + { + name = "futures"; + packageId = "futures 0.3.31"; + usesDefaultFeatures = false; + features = [ "async-await" ]; + } + { + name = "hyper"; + packageId = "hyper"; + features = [ "server" ]; + } + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; + usesDefaultFeatures = false; + features = [ "latest" ]; + } + { + name = "tokio"; + packageId = "tokio"; + features = [ "full" ]; + } + ]; + features = { + "__non_core" = [ "tracing" "serde_yaml" "base64" ]; + "admission" = [ "kube-core/admission" ]; + "aws-lc-rs" = [ "rustls?/aws-lc-rs" ]; + "base64" = [ "dep:base64" ]; + "bytes" = [ "dep:bytes" ]; + "chrono" = [ "dep:chrono" ]; + "client" = [ "config" "__non_core" "hyper" "hyper-util" "http-body" "http-body-util" "tower" "tower-http" "hyper-timeout" "chrono" "jsonpath-rust" "bytes" "futures" "tokio" "tokio-util" "either" ]; + "config" = [ "__non_core" "pem" "home" ]; + "default" = [ "client" ]; + "either" = [ "dep:either" ]; + "form_urlencoded" = [ "dep:form_urlencoded" ]; + "futures" = [ "dep:futures" ]; + "gzip" = [ "client" "tower-http/decompression-gzip" ]; + "home" = [ "dep:home" ]; + "http-body" = [ "dep:http-body" ]; + "http-body-util" = [ "dep:http-body-util" ]; + "http-proxy" = [ "hyper-http-proxy" ]; + "hyper" = [ "dep:hyper" ]; + "hyper-http-proxy" = [ "dep:hyper-http-proxy" ]; + "hyper-openssl" = [ "dep:hyper-openssl" ]; + "hyper-rustls" = [ "dep:hyper-rustls" ]; + "hyper-socks2" = [ "dep:hyper-socks2" ]; + "hyper-timeout" = [ "dep:hyper-timeout" ]; + "hyper-util" = [ "dep:hyper-util" ]; + "jsonpatch" = [ "kube-core/jsonpatch" ]; + "jsonpath-rust" = [ "dep:jsonpath-rust" ]; + "kubelet-debug" = [ "ws" "kube-core/kubelet-debug" ]; + "oauth" = [ "client" "tame-oauth" ]; + "oidc" = [ "client" "form_urlencoded" ]; + "openssl" = [ "dep:openssl" ]; + "openssl-tls" = [ "openssl" "hyper-openssl" ]; + "pem" = [ "dep:pem" ]; + "rand" = [ "dep:rand" ]; + "rustls" = [ "dep:rustls" ]; + "rustls-pemfile" = [ "dep:rustls-pemfile" ]; + "rustls-tls" = [ "rustls" "rustls-pemfile" "hyper-rustls" "hyper-http-proxy?/rustls-tls-native-roots" ]; + "serde_yaml" = [ "dep:serde_yaml" ]; + "socks5" = [ "hyper-socks2" ]; + "tame-oauth" = [ "dep:tame-oauth" ]; + "tokio" = [ "dep:tokio" ]; + "tokio-tungstenite" = [ "dep:tokio-tungstenite" ]; + "tokio-util" = [ "dep:tokio-util" ]; + "tower" = [ "dep:tower" ]; + "tower-http" = [ "dep:tower-http" ]; + "tracing" = [ "dep:tracing" ]; + "webpki-roots" = [ "hyper-rustls/webpki-roots" ]; + "ws" = [ "client" "tokio-tungstenite" "rand" "kube-core/ws" "tokio/macros" ]; + }; + resolvedDefaultFeatures = [ "__non_core" "base64" "bytes" "chrono" "client" "config" "either" "futures" "home" "http-body" "http-body-util" "hyper" "hyper-rustls" "hyper-timeout" "hyper-util" "jsonpatch" "jsonpath-rust" "pem" "rustls" "rustls-pemfile" "rustls-tls" "serde_yaml" "tokio" "tokio-util" "tower" "tower-http" "tracing" ]; + }; + "kube-core 0.96.0" = rec { + crateName = "kube-core"; + version = "0.96.0"; + edition = "2021"; + sha256 = "0xrxzqk7nbbymf7ycm02wshs6ynf3dlrnm2wvix1skdk1g9lc8zl"; + libName = "kube_core"; + authors = [ + "clux " + "Natalie Klestrup Röijezon " + "kazk " + ]; + dependencies = [ + { + name = "chrono"; + packageId = "chrono"; + usesDefaultFeatures = false; + features = [ "now" ]; + } + { + name = "form_urlencoded"; + packageId = "form_urlencoded"; + } + { + name = "http"; + packageId = "http"; + } + { + name = "json-patch"; + packageId = "json-patch 2.0.0"; + optional = true; + } + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; + usesDefaultFeatures = false; + } + { + name = "schemars"; + packageId = "schemars"; + optional = true; + } + { + name = "serde"; + packageId = "serde"; + features = [ "derive" ]; + } + { + name = "serde-value"; + packageId = "serde-value"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "thiserror"; + packageId = "thiserror 1.0.69"; + } + ]; + devDependencies = [ + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; + usesDefaultFeatures = false; + features = [ "latest" ]; + } + ]; + features = { + "admission" = [ "json-patch" ]; + "json-patch" = [ "dep:json-patch" ]; + "jsonpatch" = [ "json-patch" ]; + "kubelet-debug" = [ "ws" ]; + "schema" = [ "schemars" ]; + "schemars" = [ "dep:schemars" ]; + }; + resolvedDefaultFeatures = [ "json-patch" "jsonpatch" "schema" "schemars" ]; + }; + "kube-core 0.98.0" = rec { + crateName = "kube-core"; + version = "0.98.0"; + edition = "2021"; + sha256 = "1wwnsn1wk7bd2jiv9iw8446j0bczagqv1lc4wy88l5wa505q7alp"; + libName = "kube_core"; + authors = [ + "clux " + "Natalie Klestrup Röijezon " + "kazk " + ]; + dependencies = [ + { + name = "chrono"; + packageId = "chrono"; + usesDefaultFeatures = false; + features = [ "now" ]; + } + { + name = "form_urlencoded"; + packageId = "form_urlencoded"; + } + { + name = "http"; + packageId = "http"; + } + { + name = "json-patch"; + packageId = "json-patch 3.0.1"; + optional = true; + } + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; + usesDefaultFeatures = false; + } + { + name = "schemars"; + packageId = "schemars"; + optional = true; + } + { + name = "serde"; + packageId = "serde"; + features = [ "derive" ]; + } + { + name = "serde-value"; + packageId = "serde-value"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "thiserror"; + packageId = "thiserror 2.0.11"; + } + ]; + devDependencies = [ + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; + usesDefaultFeatures = false; + features = [ "latest" ]; + } + ]; + features = { + "admission" = [ "json-patch" ]; + "json-patch" = [ "dep:json-patch" ]; + "jsonpatch" = [ "json-patch" ]; + "kubelet-debug" = [ "ws" ]; + "schema" = [ "schemars" ]; + "schemars" = [ "dep:schemars" ]; + }; + resolvedDefaultFeatures = [ "json-patch" "jsonpatch" "schema" "schemars" ]; + }; + "kube-derive 0.96.0" = rec { + crateName = "kube-derive"; + version = "0.96.0"; + edition = "2021"; + sha256 = "1bc23sismxyyncsry902b2i2v0aifpxvgs3fdh9q412yrh24wdpr"; + procMacro = true; + libName = "kube_derive"; + authors = [ + "clux " + "Natalie Klestrup Röijezon " + "kazk " + ]; + dependencies = [ + { + name = "darling"; + packageId = "darling"; + } + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "syn"; + packageId = "syn 2.0.98"; + features = [ "extra-traits" ]; + } + ]; + + }; + "kube-derive 0.98.0" = rec { + crateName = "kube-derive"; + version = "0.98.0"; + edition = "2021"; + sha256 = "0n46p76pvm3plsnbm57c2j76r1i6hwslxsaj345pxdvn8255sx1p"; + procMacro = true; + libName = "kube_derive"; + authors = [ + "clux " + "Natalie Klestrup Röijezon " + "kazk " + ]; + dependencies = [ + { + name = "darling"; + packageId = "darling"; + } + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "syn"; + packageId = "syn 2.0.98"; + features = [ "extra-traits" ]; + } + ]; + + }; + "kube-runtime 0.96.0" = rec { + crateName = "kube-runtime"; + version = "0.96.0"; + edition = "2021"; + sha256 = "0i5xr5i9xf44fwih1pvypr35sq30pcw979m9sbqnb3m9zzvg3yyk"; + libName = "kube_runtime"; + authors = [ + "clux " + "Natalie Klestrup Röijezon " + "kazk " + ]; + dependencies = [ + { + name = "ahash"; + packageId = "ahash"; + } + { + name = "async-broadcast"; + packageId = "async-broadcast"; + } + { + name = "async-stream"; + packageId = "async-stream"; + } + { + name = "async-trait"; + packageId = "async-trait"; + } + { + name = "backoff"; + packageId = "backoff"; + } + { + name = "educe"; + packageId = "educe"; + usesDefaultFeatures = false; + features = [ "Clone" "Debug" "Hash" "PartialEq" ]; + } + { + name = "futures"; + packageId = "futures 0.3.31"; + usesDefaultFeatures = false; + features = [ "async-await" ]; + } + { + name = "hashbrown"; + packageId = "hashbrown 0.14.5"; } { - name = "http"; - packageId = "http"; + name = "json-patch"; + packageId = "json-patch 2.0.0"; } { - name = "json-patch"; - packageId = "json-patch"; - optional = true; + name = "jsonptr"; + packageId = "jsonptr 0.4.7"; } { name = "k8s-openapi"; - packageId = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; usesDefaultFeatures = false; } { - name = "schemars"; - packageId = "schemars"; - optional = true; + name = "kube-client"; + packageId = "kube-client 0.96.0"; + usesDefaultFeatures = false; + features = [ "jsonpatch" "client" ]; } { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; + name = "parking_lot"; + packageId = "parking_lot"; } { - name = "serde-value"; - packageId = "serde-value"; + name = "pin-project"; + packageId = "pin-project"; + } + { + name = "serde"; + packageId = "serde"; } { name = "serde_json"; @@ -4222,65 +5121,45 @@ rec { } { name = "thiserror"; - packageId = "thiserror 2.0.11"; + packageId = "thiserror 1.0.69"; } - ]; - devDependencies = [ { - name = "k8s-openapi"; - packageId = "k8s-openapi"; - usesDefaultFeatures = false; - features = [ "latest" ]; + name = "tokio"; + packageId = "tokio"; + features = [ "time" ]; } - ]; - features = { - "admission" = [ "json-patch" ]; - "json-patch" = [ "dep:json-patch" ]; - "jsonpatch" = [ "json-patch" ]; - "kubelet-debug" = [ "ws" ]; - "schema" = [ "schemars" ]; - "schemars" = [ "dep:schemars" ]; - }; - resolvedDefaultFeatures = [ "json-patch" "jsonpatch" "schema" "schemars" ]; - }; - "kube-derive" = rec { - crateName = "kube-derive"; - version = "0.98.0"; - edition = "2021"; - sha256 = "0n46p76pvm3plsnbm57c2j76r1i6hwslxsaj345pxdvn8255sx1p"; - procMacro = true; - libName = "kube_derive"; - authors = [ - "clux " - "Natalie Klestrup Röijezon " - "kazk " - ]; - dependencies = [ { - name = "darling"; - packageId = "darling"; + name = "tokio-util"; + packageId = "tokio-util"; + features = [ "time" ]; } { - name = "proc-macro2"; - packageId = "proc-macro2"; + name = "tracing"; + packageId = "tracing"; } + ]; + devDependencies = [ { - name = "quote"; - packageId = "quote"; + name = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; + usesDefaultFeatures = false; + features = [ "latest" ]; } { name = "serde_json"; packageId = "serde_json"; } { - name = "syn"; - packageId = "syn 2.0.96"; - features = [ "extra-traits" ]; + name = "tokio"; + packageId = "tokio"; + features = [ "full" "test-util" ]; } ]; - + features = { + "unstable-runtime" = [ "unstable-runtime-subscribe" "unstable-runtime-stream-control" "unstable-runtime-reconcile-on" ]; + }; }; - "kube-runtime" = rec { + "kube-runtime 0.98.0" = rec { crateName = "kube-runtime"; version = "0.98.0"; edition = "2021"; @@ -4326,7 +5205,7 @@ rec { } { name = "hashbrown"; - packageId = "hashbrown"; + packageId = "hashbrown 0.15.2"; } { name = "hostname"; @@ -4334,20 +5213,20 @@ rec { } { name = "json-patch"; - packageId = "json-patch"; + packageId = "json-patch 3.0.1"; } { name = "jsonptr"; - packageId = "jsonptr"; + packageId = "jsonptr 0.6.3"; } { name = "k8s-openapi"; - packageId = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; usesDefaultFeatures = false; } { name = "kube-client"; - packageId = "kube-client"; + packageId = "kube-client 0.98.0"; usesDefaultFeatures = false; features = [ "jsonpatch" "client" ]; } @@ -4389,7 +5268,7 @@ rec { devDependencies = [ { name = "k8s-openapi"; - packageId = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; usesDefaultFeatures = false; features = [ "latest" ]; } @@ -4438,10 +5317,10 @@ rec { }; "libgit2-sys" = rec { crateName = "libgit2-sys"; - version = "0.17.0+1.8.1"; + version = "0.18.0+1.9.0"; edition = "2018"; links = "git2"; - sha256 = "093jxfl2i9vxdlgf7vk9d040sjwy0nq4fid640y7qix6m0k26iqh"; + sha256 = "1v7zcw1kky338grxs70y7fwpy70g846bpa5yzvl9f5bybr31g8g1"; libName = "libgit2_sys"; libPath = "lib.rs"; authors = [ @@ -4639,9 +5518,9 @@ rec { }; "miniz_oxide" = rec { crateName = "miniz_oxide"; - version = "0.8.3"; + version = "0.8.4"; edition = "2021"; - sha256 = "093r1kd1r9dyf05cbvsibgmh96pxp3qhzfvpd6f15bpggamjqh5q"; + sha256 = "06ydc8zp00832jwyyl2pbqc2dam1njrrxsznhyrziw719yywkcdk"; authors = [ "Frommi " "oyvindln " @@ -4828,9 +5707,9 @@ rec { }; "once_cell" = rec { crateName = "once_cell"; - version = "1.20.2"; + version = "1.20.3"; edition = "2021"; - sha256 = "0xb7rw1aqr7pa4z3b00y7786gyf8awx2gca3md73afy76dzgwq8j"; + sha256 = "0bp6rgrsri1vfdcahsimk08zdiilv14ppgcnpbiw8hqyp2j64m4l"; authors = [ "Aleksey Kladov " ]; @@ -5397,7 +6276,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; features = { @@ -5440,9 +6319,9 @@ rec { }; "pin-project" = rec { crateName = "pin-project"; - version = "1.1.8"; + version = "1.1.9"; edition = "2021"; - sha256 = "05jr3xfy1spgmz3q19l4mmvv46vgvkvsgphamifx7x45swxcabhy"; + sha256 = "0z9jgkcqg00fxjrbbcjlkiy940hbf5gp5gq6jiq0gzki2hgfgqnz"; libName = "pin_project"; dependencies = [ { @@ -5454,9 +6333,9 @@ rec { }; "pin-project-internal" = rec { crateName = "pin-project-internal"; - version = "1.1.8"; + version = "1.1.9"; edition = "2021"; - sha256 = "1yzfhf6l27nhzv7r5hfrwj2g0x7xmfhgil19fj9am4srqp06csnm"; + sha256 = "0rzsqcf4mdrpx39w6wvw3wjjc3y9mgmy6irwnq548l5xwpk5ks7n"; procMacro = true; libName = "pin_project_internal"; dependencies = [ @@ -5470,7 +6349,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; usesDefaultFeatures = false; features = [ "parsing" "printing" "clone-impls" "proc-macro" "full" "visit-mut" ]; } @@ -5766,7 +6645,7 @@ rec { dependencies = [ { name = "bitflags"; - packageId = "bitflags"; + packageId = "bitflags 2.8.0"; } ]; features = { @@ -5968,10 +6847,10 @@ rec { }; "ring" = rec { crateName = "ring"; - version = "0.17.8"; + version = "0.17.9"; edition = "2021"; - links = "ring_core_0_17_8"; - sha256 = "03fwlb1ssrmfxdckvqv033pfmk01rhx9ynwi7r186dcfcp5s8zy1"; + links = "ring_core_0_17_9_"; + sha256 = "097dqw1s0dgdk6ah4xlyc90la8s6h0wdqshj8plfv2jd5klwapp7"; authors = [ "Brian Smith " ]; @@ -5989,14 +6868,13 @@ rec { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = { target, features }: ((("android" == target."os" or null) || ("linux" == target."os" or null)) && (("aarch64" == target."arch" or null) || ("arm" == target."arch" or null))); + target = { target, features }: ((("aarch64" == target."arch" or null) && ("little" == target."endian" or null)) && ("apple" == target."vendor" or null) && (("ios" == target."os" or null) || ("macos" == target."os" or null) || ("tvos" == target."os" or null) || ("visionos" == target."os" or null) || ("watchos" == target."os" or null))); } { - name = "spin"; - packageId = "spin"; + name = "libc"; + packageId = "libc"; usesDefaultFeatures = false; - target = { target, features }: (("aarch64" == target."arch" or null) || ("arm" == target."arch" or null) || ("x86" == target."arch" or null) || ("x86_64" == target."arch" or null)); - features = [ "once" ]; + target = { target, features }: (((("aarch64" == target."arch" or null) && ("little" == target."endian" or null)) || (("arm" == target."arch" or null) && ("little" == target."endian" or null))) && (("android" == target."os" or null) || ("linux" == target."os" or null))); } { name = "untrusted"; @@ -6005,7 +6883,7 @@ rec { { name = "windows-sys"; packageId = "windows-sys 0.52.0"; - target = { target, features }: (("aarch64" == target."arch" or null) && ("windows" == target."os" or null)); + target = { target, features }: ((("aarch64" == target."arch" or null) && ("little" == target."endian" or null)) && ("windows" == target."os" or null)); features = [ "Win32_Foundation" "Win32_System_Threading" ]; } ]; @@ -6015,6 +6893,12 @@ rec { packageId = "cc"; usesDefaultFeatures = false; } + { + name = "cc"; + packageId = "cc"; + usesDefaultFeatures = false; + target = {target, features}: (("apple" == target."vendor" or null) && ("visionos" == target."os" or null)); + } ]; devDependencies = [ { @@ -6110,7 +6994,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" "parsing" "extra-traits" "visit" "visit-mut" ]; } { @@ -6160,9 +7044,9 @@ rec { }; "rustls" = rec { crateName = "rustls"; - version = "0.23.21"; + version = "0.23.23"; edition = "2021"; - sha256 = "1f75gicypi40bdq20h1rglwaapr3ifnchgf697clkxibc0j7ja4g"; + sha256 = "15gk2bmry78cps3ya38a7cn4jxc36xv1r7gndr0fbz40qjc6qya7"; dependencies = [ { name = "log"; @@ -6218,6 +7102,7 @@ rec { "hashbrown" = [ "dep:hashbrown" ]; "log" = [ "dep:log" ]; "logging" = [ "log" ]; + "prefer-post-quantum" = [ "aws_lc_rs" ]; "read_buf" = [ "rustversion" "std" ]; "ring" = [ "dep:ring" "webpki/ring" ]; "rustversion" = [ "dep:rustversion" ]; @@ -6312,9 +7197,9 @@ rec { }; "rustls-pki-types" = rec { crateName = "rustls-pki-types"; - version = "1.10.1"; + version = "1.11.0"; edition = "2021"; - sha256 = "0dqb3d0cbld1yrp084wyzgw6yk3qzzic8l5pbs1b6bcjzzk4ggyj"; + sha256 = "0755isc0x5iymm3wsn59s0ad1pm9zidw7p34qfqlsjsac9jf4z4i"; libName = "rustls_pki_types"; features = { "default" = [ "alloc" ]; @@ -6371,9 +7256,9 @@ rec { }; "ryu" = rec { crateName = "ryu"; - version = "1.0.18"; + version = "1.0.19"; edition = "2018"; - sha256 = "17xx2s8j1lln7iackzd9p0sv546vjq71i779gphjq923vjh5pjzk"; + sha256 = "1pg6a0b80m32ahygsdkwzs3bfydk4snw695akz4rqxj4lv8a58bf"; authors = [ "David Tolnay " ]; @@ -6496,7 +7381,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "extra-traits" ]; } ]; @@ -6547,7 +7432,7 @@ rec { dependencies = [ { name = "bitflags"; - packageId = "bitflags"; + packageId = "bitflags 2.8.0"; } { name = "core-foundation"; @@ -6594,7 +7479,7 @@ rec { dependencies = [ { name = "bitflags"; - packageId = "bitflags"; + packageId = "bitflags 2.8.0"; } { name = "core-foundation"; @@ -6750,7 +7635,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" "proc-macro" ]; } @@ -6782,7 +7667,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; usesDefaultFeatures = false; features = [ "clone-impls" "derive" "parsing" "printing" ]; } @@ -6791,9 +7676,9 @@ rec { }; "serde_json" = rec { crateName = "serde_json"; - version = "1.0.137"; + version = "1.0.138"; edition = "2021"; - sha256 = "0sql0gndrw2miw440sl0m2lrk6bsxyxrmlnpma52k6dzd9pgn34k"; + sha256 = "0j99hyp2plvdcyrfzdz0875d0dm04q5ngsd7dr5fk1x7glp1jd6l"; authors = [ "Erick Tryzelaar " "David Tolnay " @@ -7032,9 +7917,9 @@ rec { }; "smallvec" = rec { crateName = "smallvec"; - version = "1.13.2"; + version = "1.14.0"; edition = "2018"; - sha256 = "0rsw5samawl3wsw6glrsb127rx6sh89a8wyikicw6dkdcjd1lpiw"; + sha256 = "1z8wpr53x6jisklqhkkvkgyi8s5cn69h2d2alhqfxahzxwiq7kvz"; authors = [ "The Servo Project Developers" ]; @@ -7042,6 +7927,7 @@ rec { "arbitrary" = [ "dep:arbitrary" ]; "const_new" = [ "const_generics" ]; "drain_keep_rest" = [ "drain_filter" ]; + "malloc_size_of" = [ "dep:malloc_size_of" ]; "serde" = [ "dep:serde" ]; }; resolvedDefaultFeatures = [ "const_generics" "const_new" ]; @@ -7165,7 +8051,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" ]; } ]; @@ -7199,31 +8085,6 @@ rec { }; resolvedDefaultFeatures = [ "all" ]; }; - "spin" = rec { - crateName = "spin"; - version = "0.9.8"; - edition = "2015"; - sha256 = "0rvam5r0p3a6qhc18scqpvpgb3ckzyqxpgdfyjnghh8ja7byi039"; - authors = [ - "Mathijs van de Nes " - "John Ericson " - "Joshua Barretto " - ]; - features = { - "barrier" = [ "mutex" ]; - "default" = [ "lock_api" "mutex" "spin_mutex" "rwlock" "once" "lazy" "barrier" ]; - "fair_mutex" = [ "mutex" ]; - "lazy" = [ "once" ]; - "lock_api" = [ "lock_api_crate" ]; - "lock_api_crate" = [ "dep:lock_api_crate" ]; - "portable-atomic" = [ "dep:portable-atomic" ]; - "portable_atomic" = [ "portable-atomic" ]; - "spin_mutex" = [ "mutex" ]; - "ticket_mutex" = [ "mutex" ]; - "use_ticket_mutex" = [ "mutex" "ticket_mutex" ]; - }; - resolvedDefaultFeatures = [ "once" ]; - }; "stable_deref_trait" = rec { crateName = "stable_deref_trait"; version = "1.2.0"; @@ -7238,67 +8099,6 @@ rec { }; resolvedDefaultFeatures = [ "alloc" ]; }; - "stackable-hbase-crd" = rec { - crateName = "stackable-hbase-crd"; - version = "0.0.0-dev"; - edition = "2021"; - src = lib.cleanSourceWith { filter = sourceFilter; src = ./rust/crd; }; - libName = "stackable_hbase_crd"; - authors = [ - "Stackable GmbH " - ]; - dependencies = [ - { - name = "product-config"; - packageId = "product-config"; - } - { - name = "serde"; - packageId = "serde"; - features = [ "derive" ]; - } - { - name = "serde_json"; - packageId = "serde_json"; - } - { - name = "shell-escape"; - packageId = "shell-escape"; - } - { - name = "snafu"; - packageId = "snafu 0.8.5"; - } - { - name = "stackable-operator"; - packageId = "stackable-operator"; - } - { - name = "strum"; - packageId = "strum"; - features = [ "derive" ]; - } - { - name = "tracing"; - packageId = "tracing"; - } - ]; - devDependencies = [ - { - name = "indoc"; - packageId = "indoc"; - } - { - name = "rstest"; - packageId = "rstest"; - } - { - name = "serde_yaml"; - packageId = "serde_yaml"; - } - ]; - - }; "stackable-hbase-operator" = rec { crateName = "stackable-hbase-operator"; version = "0.0.0-dev"; @@ -7336,6 +8136,10 @@ rec { packageId = "futures 0.3.31"; features = [ "compat" ]; } + { + name = "indoc"; + packageId = "indoc"; + } { name = "product-config"; packageId = "product-config"; @@ -7346,17 +8150,26 @@ rec { features = [ "derive" ]; } { - name = "snafu"; - packageId = "snafu 0.8.5"; + name = "serde_json"; + packageId = "serde_json"; + } + { + name = "shell-escape"; + packageId = "shell-escape"; } { - name = "stackable-hbase-crd"; - packageId = "stackable-hbase-crd"; + name = "snafu"; + packageId = "snafu 0.8.5"; } { name = "stackable-operator"; packageId = "stackable-operator"; } + { + name = "stackable-versioned"; + packageId = "stackable-versioned"; + features = [ "k8s" ]; + } { name = "strum"; packageId = "strum"; @@ -7380,10 +8193,6 @@ rec { } ]; devDependencies = [ - { - name = "indoc"; - packageId = "indoc"; - } { name = "rstest"; packageId = "rstest"; @@ -7452,17 +8261,17 @@ rec { } { name = "json-patch"; - packageId = "json-patch"; + packageId = "json-patch 3.0.1"; } { name = "k8s-openapi"; - packageId = "k8s-openapi"; + packageId = "k8s-openapi 0.24.0"; usesDefaultFeatures = false; features = [ "schemars" "v1_32" ]; } { name = "kube"; - packageId = "kube"; + packageId = "kube 0.98.0"; usesDefaultFeatures = false; features = [ "client" "jsonpatch" "runtime" "derive" "rustls-tls" ]; } @@ -7585,7 +8394,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; @@ -7607,7 +8416,7 @@ rec { dependencies = [ { name = "kube"; - packageId = "kube"; + packageId = "kube 0.98.0"; usesDefaultFeatures = false; features = [ "client" "jsonpatch" "runtime" "derive" "rustls-tls" ]; } @@ -7631,6 +8440,106 @@ rec { ]; }; + "stackable-versioned" = rec { + crateName = "stackable-versioned"; + version = "0.5.0"; + edition = "2021"; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech/operator-rs.git"; + rev = "048c7d8befddc2f2c6414444006871c95412d67c"; + sha256 = "1x2pfibrsysmkkmajyj30qkwsjf3rzmc3dxsd09jb9r4x7va6mr6"; + }; + libName = "stackable_versioned"; + authors = [ + "Stackable GmbH " + ]; + dependencies = [ + { + name = "stackable-versioned-macros"; + packageId = "stackable-versioned-macros"; + } + ]; + features = { + "full" = [ "k8s" ]; + "k8s" = [ "stackable-versioned-macros/k8s" ]; + }; + resolvedDefaultFeatures = [ "k8s" ]; + }; + "stackable-versioned-macros" = rec { + crateName = "stackable-versioned-macros"; + version = "0.5.0"; + edition = "2021"; + workspace_member = null; + src = pkgs.fetchgit { + url = "https://github.com/stackabletech/operator-rs.git"; + rev = "048c7d8befddc2f2c6414444006871c95412d67c"; + sha256 = "1x2pfibrsysmkkmajyj30qkwsjf3rzmc3dxsd09jb9r4x7va6mr6"; + }; + procMacro = true; + libName = "stackable_versioned_macros"; + authors = [ + "Stackable GmbH " + ]; + dependencies = [ + { + name = "convert_case"; + packageId = "convert_case"; + } + { + name = "darling"; + packageId = "darling"; + } + { + name = "itertools"; + packageId = "itertools"; + } + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; + optional = true; + usesDefaultFeatures = false; + features = [ "schemars" "v1_31" ]; + } + { + name = "k8s-version"; + packageId = "k8s-version"; + features = [ "darling" ]; + } + { + name = "kube"; + packageId = "kube 0.96.0"; + optional = true; + usesDefaultFeatures = false; + features = [ "client" "jsonpatch" "runtime" "derive" "rustls-tls" ]; + } + { + name = "proc-macro2"; + packageId = "proc-macro2"; + } + { + name = "quote"; + packageId = "quote"; + } + { + name = "syn"; + packageId = "syn 2.0.98"; + } + ]; + devDependencies = [ + { + name = "k8s-openapi"; + packageId = "k8s-openapi 0.23.0"; + usesDefaultFeatures = false; + features = [ "schemars" "v1_31" ]; + } + ]; + features = { + "full" = [ "k8s" ]; + "k8s" = [ "dep:kube" "dep:k8s-openapi" ]; + }; + resolvedDefaultFeatures = [ "k8s" ]; + }; "strsim" = rec { crateName = "strsim"; version = "0.11.1"; @@ -7699,7 +8608,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "parsing" "extra-traits" ]; } ]; @@ -7752,11 +8661,11 @@ rec { }; resolvedDefaultFeatures = [ "clone-impls" "default" "derive" "full" "parsing" "printing" "proc-macro" "quote" ]; }; - "syn 2.0.96" = rec { + "syn 2.0.98" = rec { crateName = "syn"; - version = "2.0.96"; + version = "2.0.98"; edition = "2021"; - sha256 = "102wk3cgawimi3i0q3r3xw3i858zkyingg6y7gsxfy733amsvl6m"; + sha256 = "1cfk0qqbl4fbr3dz61nw21d5amvl4rym6nxwnfsw43mf90d7y51n"; authors = [ "David Tolnay " ]; @@ -7819,7 +8728,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; usesDefaultFeatures = false; features = [ "derive" "parsing" "printing" "clone-impls" "visit" "extra-traits" ]; } @@ -7886,7 +8795,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; @@ -7912,7 +8821,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; @@ -8267,7 +9176,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" ]; } ]; @@ -8427,9 +9336,9 @@ rec { }; "toml_edit" = rec { crateName = "toml_edit"; - version = "0.22.22"; + version = "0.22.24"; edition = "2021"; - sha256 = "1xf7sxfzmnc45f75x302qrn5aph52vc8w226v59yhrm211i8vr2a"; + sha256 = "0x0lgp70x5cl9nla03xqs5vwwwlrwmd0djkdrp3h3lpdymgpkd0p"; authors = [ "Andronik Ordian " "Ed Page " @@ -8584,7 +9493,7 @@ rec { } { name = "bitflags"; - packageId = "bitflags"; + packageId = "bitflags 2.8.0"; } { name = "bytes"; @@ -8802,7 +9711,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; usesDefaultFeatures = false; features = [ "full" "parsing" "printing" "visit-mut" "clone-impls" "extra-traits" "proc-macro" ]; } @@ -9167,15 +10076,28 @@ rec { }; "unicode-ident" = rec { crateName = "unicode-ident"; - version = "1.0.15"; + version = "1.0.16"; edition = "2018"; - sha256 = "0hr2b72jf9zb5avd2k6p7rbwkjjgl21vdhd90114kihp5ghqik8i"; + sha256 = "0d2hji0i16naw43l02dplrz8fbv625n7475s463iqw4by1hd2452"; libName = "unicode_ident"; authors = [ "David Tolnay " ]; }; + "unicode-segmentation" = rec { + crateName = "unicode-segmentation"; + version = "1.12.0"; + edition = "2018"; + sha256 = "14qla2jfx74yyb9ds3d2mpwpa4l4lzb9z57c6d2ba511458z5k7n"; + libName = "unicode_segmentation"; + authors = [ + "kwantam " + "Manish Goregaokar " + ]; + features = { + }; + }; "unicode-xid" = rec { crateName = "unicode-xid"; version = "0.2.6"; @@ -9436,7 +10358,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "full" ]; } { @@ -9492,7 +10414,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "visit" "visit-mut" "full" ]; } { @@ -10938,9 +11860,9 @@ rec { }; "winnow" = rec { crateName = "winnow"; - version = "0.6.24"; + version = "0.7.2"; edition = "2021"; - sha256 = "0fm0z1gk9wb47s1jhh889isz657kavd1yb3fhzbjmi657icimmy8"; + sha256 = "00znis68117jk13aw41g048wvvv3h0xw5jmhlg8rh8cg2vm0ssar"; dependencies = [ { name = "memchr"; @@ -11063,7 +11985,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "fold" ]; } { @@ -11136,7 +12058,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; } ]; @@ -11184,7 +12106,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "fold" ]; } { @@ -11268,7 +12190,7 @@ rec { } { name = "syn"; - packageId = "syn 2.0.96"; + packageId = "syn 2.0.98"; features = [ "extra-traits" ]; } ]; diff --git a/Cargo.toml b/Cargo.toml index 50c4db7d..88cd9871 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["rust/crd", "rust/operator-binary"] +members = ["rust/operator-binary"] resolver = "2" [workspace.package] @@ -10,6 +10,10 @@ edition = "2021" repository = "https://github.com/stackabletech/hbase-operator" [workspace.dependencies] +stackable-versioned = { git = "https://github.com/stackabletech/operator-rs.git", features = ["k8s"], tag = "stackable-versioned-0.5.0" } +stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.85.0" } +product-config = { git = "https://github.com/stackabletech/product-config.git", tag = "0.7.0" } + anyhow = "1.0" built = { version = "0.7", features = ["chrono", "git2"] } clap = "4.5" @@ -23,8 +27,6 @@ serde_json = "1.0" serde_yaml = "0.9" shell-escape = "0.1" snafu = "0.8" -stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.85.0" } -product-config = { git = "https://github.com/stackabletech/product-config.git", tag = "0.7.0" } strum = { version = "0.26", features = ["derive"] } tokio = { version = "1.40", features = ["full"] } tracing = "0.1" diff --git a/crate-hashes.json b/crate-hashes.json index 290d87f2..c7d32c3a 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -2,5 +2,8 @@ "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.85.0#stackable-operator-derive@0.3.1": "0rh476rmn5850yj85hq8znwmlfhd7l5bkxz0n5i9m4cddxhi2cl5", "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.85.0#stackable-operator@0.85.0": "0rh476rmn5850yj85hq8znwmlfhd7l5bkxz0n5i9m4cddxhi2cl5", "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.85.0#stackable-shared@0.0.1": "0rh476rmn5850yj85hq8znwmlfhd7l5bkxz0n5i9m4cddxhi2cl5", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-versioned-0.5.0#k8s-version@0.1.2": "1x2pfibrsysmkkmajyj30qkwsjf3rzmc3dxsd09jb9r4x7va6mr6", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-versioned-0.5.0#stackable-versioned-macros@0.5.0": "1x2pfibrsysmkkmajyj30qkwsjf3rzmc3dxsd09jb9r4x7va6mr6", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-versioned-0.5.0#stackable-versioned@0.5.0": "1x2pfibrsysmkkmajyj30qkwsjf3rzmc3dxsd09jb9r4x7va6mr6", "git+https://github.com/stackabletech/product-config.git?tag=0.7.0#product-config@0.7.0": "0gjsm80g6r75pm3824dcyiz4ysq1ka4c1if6k1mjm9cnd5ym0gny" } \ No newline at end of file diff --git a/rust/crd/Cargo.toml b/rust/crd/Cargo.toml deleted file mode 100644 index 8fec0dba..00000000 --- a/rust/crd/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "stackable-hbase-crd" -description = "Contains the Apache HBase CRD structs and utilities" -version.workspace = true -authors.workspace = true -license.workspace = true -edition.workspace = true -repository.workspace = true -publish = false - -[dependencies] -product-config.workspace = true -serde.workspace = true -serde_json.workspace = true -shell-escape.workspace = true -snafu.workspace = true -stackable-operator.workspace = true -strum.workspace = true -tracing.workspace = true - -[dev-dependencies] -rstest.workspace = true -serde_yaml.workspace = true -indoc.workspace = true diff --git a/rust/operator-binary/Cargo.toml b/rust/operator-binary/Cargo.toml index 9de4298e..aa01b851 100644 --- a/rust/operator-binary/Cargo.toml +++ b/rust/operator-binary/Cargo.toml @@ -9,17 +9,20 @@ repository.workspace = true publish = false [dependencies] -stackable-hbase-crd = { path = "../crd" } +stackable-versioned.workspace = true +stackable-operator.workspace = true +product-config.workspace = true anyhow.workspace = true clap.workspace = true const_format.workspace = true fnv.workspace = true futures.workspace = true -product-config.workspace = true +indoc.workspace = true serde.workspace = true +serde_json.workspace = true +shell-escape.workspace = true snafu.workspace = true -stackable-operator.workspace = true strum.workspace = true tokio.workspace = true tracing.workspace = true diff --git a/rust/operator-binary/src/config/jvm.rs b/rust/operator-binary/src/config/jvm.rs index 4702c098..17215881 100644 --- a/rust/operator-binary/src/config/jvm.rs +++ b/rust/operator-binary/src/config/jvm.rs @@ -1,13 +1,14 @@ use snafu::{OptionExt, ResultExt, Snafu}; -use stackable_hbase_crd::{ - AnyServiceConfig, HbaseCluster, HbaseRole, CONFIG_DIR_NAME, JVM_SECURITY_PROPERTIES_FILE, - METRICS_PORT, -}; use stackable_operator::{ memory::{BinaryMultiple, MemoryQuantity}, role_utils::{self, JvmArgumentOverrides}, }; +use crate::crd::{ + v1alpha1, AnyServiceConfig, HbaseRole, CONFIG_DIR_NAME, JVM_SECURITY_PROPERTIES_FILE, + METRICS_PORT, +}; + const JAVA_HEAP_FACTOR: f32 = 0.8; #[derive(Snafu, Debug)] @@ -49,7 +50,7 @@ pub fn construct_global_jvm_args(kerberos_enabled: bool) -> String { /// JVM arguments that are specifically for the role (server), so will *not* be used e.g. by CLI tools. /// Heap settings are excluded, as they go into `HBASE_HEAPSIZE`. pub fn construct_role_specific_non_heap_jvm_args( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, hbase_role: &HbaseRole, role_group: &str, product_version: &str, @@ -142,9 +143,8 @@ fn is_heap_jvm_argument(jvm_argument: &str) -> bool { #[cfg(test)] mod tests { - use stackable_hbase_crd::{HbaseCluster, HbaseRole}; - use super::*; + use crate::crd::{v1alpha1, HbaseRole}; #[test] fn test_construct_jvm_arguments_defaults() { @@ -260,8 +260,15 @@ mod tests { fn construct_boilerplate( hbase_cluster: &str, - ) -> (HbaseCluster, HbaseRole, AnyServiceConfig, String, String) { - let hbase: HbaseCluster = serde_yaml::from_str(hbase_cluster).expect("illegal test input"); + ) -> ( + v1alpha1::HbaseCluster, + HbaseRole, + AnyServiceConfig, + String, + String, + ) { + let hbase: v1alpha1::HbaseCluster = + serde_yaml::from_str(hbase_cluster).expect("illegal test input"); let hbase_role = HbaseRole::RegionServer; let merged_config = hbase diff --git a/rust/crd/src/affinity.rs b/rust/operator-binary/src/crd/affinity.rs similarity index 98% rename from rust/crd/src/affinity.rs rename to rust/operator-binary/src/crd/affinity.rs index 1e8bd0f9..8bcff3da 100644 --- a/rust/crd/src/affinity.rs +++ b/rust/operator-binary/src/crd/affinity.rs @@ -5,7 +5,7 @@ use stackable_operator::{ k8s_openapi::api::core::v1::{PodAffinity, PodAntiAffinity}, }; -use crate::{HbaseRole, APP_NAME}; +use crate::crd::{HbaseRole, APP_NAME}; pub fn get_affinity( cluster_name: &str, @@ -91,7 +91,7 @@ mod tests { }; use super::*; - use crate::HbaseCluster; + use crate::crd::v1alpha1; #[rstest] #[case(HbaseRole::Master)] @@ -122,7 +122,8 @@ mod tests { default: replicas: 1 "#; - let hbase: HbaseCluster = serde_yaml::from_str(input).expect("illegal test input"); + let hbase: v1alpha1::HbaseCluster = + serde_yaml::from_str(input).expect("illegal test input"); let affinity = hbase .merged_config( &role, diff --git a/rust/crd/src/lib.rs b/rust/operator-binary/src/crd/mod.rs similarity index 90% rename from rust/crd/src/lib.rs rename to rust/operator-binary/src/crd/mod.rs index 2a5087d4..fd7a5aee 100644 --- a/rust/crd/src/lib.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -32,9 +32,10 @@ use stackable_operator::{ status::condition::{ClusterCondition, HasStatusCondition}, time::Duration, }; +use stackable_versioned::versioned; use strum::{Display, EnumIter, EnumString}; -use crate::{affinity::get_affinity, security::AuthorizationConfig}; +use crate::crd::{affinity::get_affinity, security::AuthorizationConfig}; pub mod affinity; pub mod security; @@ -107,1037 +108,1035 @@ pub enum Error { IncompatibleMergeTypes, } -/// An HBase cluster stacklet. This resource is managed by the Stackable operator for Apache HBase. -/// Find more information on how to use it and the resources that the operator generates in the -/// [operator documentation](DOCS_BASE_URL_PLACEHOLDER/hbase/). -/// -/// The CRD contains three roles: `masters`, `regionServers` and `restServers`. -#[derive(Clone, CustomResource, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] -#[kube( - group = "hbase.stackable.tech", - version = "v1alpha1", - kind = "HbaseCluster", - plural = "hbaseclusters", - shortname = "hbase", - status = "HbaseClusterStatus", - namespaced, - crates( - kube_core = "stackable_operator::kube::core", - k8s_openapi = "stackable_operator::k8s_openapi", - schemars = "stackable_operator::schemars" - ) -)] -#[serde(rename_all = "camelCase")] -pub struct HbaseClusterSpec { - // no doc string - See ProductImage struct - pub image: ProductImage, - - /// Configuration that applies to all roles and role groups. - /// This includes settings for logging, ZooKeeper and HDFS connection, among other things. - pub cluster_config: HbaseClusterConfig, - - // no doc string - See ClusterOperation struct - #[serde(default)] - pub cluster_operation: ClusterOperation, - - /// The HBase master process is responsible for assigning regions to region servers and - /// manages the cluster. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub masters: Option>, - - /// Region servers hold the data and handle requests from clients for their region. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub region_servers: - Option>, - - /// Rest servers provide a REST API to interact with. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub rest_servers: Option>, -} - -#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct HbaseClusterConfig { - /// Name of the [discovery ConfigMap](DOCS_BASE_URL_PLACEHOLDER/concepts/service_discovery) - /// for an HDFS cluster. - pub hdfs_config_map_name: String, - - /// Name of the Vector aggregator [discovery ConfigMap](DOCS_BASE_URL_PLACEHOLDER/concepts/service_discovery). - /// It must contain the key `ADDRESS` with the address of the Vector aggregator. - /// Follow the [logging tutorial](DOCS_BASE_URL_PLACEHOLDER/tutorials/logging-vector-aggregator) - /// to learn how to configure log aggregation with Vector. - #[serde(skip_serializing_if = "Option::is_none")] - pub vector_aggregator_config_map_name: Option, - - /// Name of the [discovery ConfigMap](DOCS_BASE_URL_PLACEHOLDER/concepts/service_discovery) - /// for a ZooKeeper cluster. - pub zookeeper_config_map_name: String, - - /// This field controls which type of Service the Operator creates for this HbaseCluster: - /// - /// * cluster-internal: Use a ClusterIP service +#[versioned(version(name = "v1alpha1"))] +pub mod versioned { + /// An HBase cluster stacklet. This resource is managed by the Stackable operator for Apache HBase. + /// Find more information on how to use it and the resources that the operator generates in the + /// [operator documentation](DOCS_BASE_URL_PLACEHOLDER/hbase/). /// - /// * external-unstable: Use a NodePort service - /// - /// This is a temporary solution with the goal to keep yaml manifests forward compatible. - /// In the future, this setting will control which [ListenerClass](DOCS_BASE_URL_PLACEHOLDER/listener-operator/listenerclass.html) - /// will be used to expose the service, and ListenerClass names will stay the same, allowing for a non-breaking change. - #[serde(default)] - pub listener_class: CurrentlySupportedListenerClasses, - - /// Settings related to user [authentication](DOCS_BASE_URL_PLACEHOLDER/usage-guide/security). - pub authentication: Option, - - #[serde(default, skip_serializing_if = "Option::is_none")] - pub authorization: Option, -} - -// TODO: Temporary solution until listener-operator is finished -#[derive(Clone, Debug, Default, Display, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] -#[serde(rename_all = "PascalCase")] -pub enum CurrentlySupportedListenerClasses { - #[default] - #[serde(rename = "cluster-internal")] - ClusterInternal, + /// The CRD contains three roles: `masters`, `regionServers` and `restServers`. + #[versioned(k8s( + group = "hbase.stackable.tech", + kind = "HbaseCluster", + plural = "hbaseclusters", + shortname = "hbase", + status = "HbaseClusterStatus", + namespaced, + crates( + kube_core = "stackable_operator::kube::core", + k8s_openapi = "stackable_operator::k8s_openapi", + schemars = "stackable_operator::schemars" + ) + ))] + #[derive(Clone, CustomResource, Debug, Deserialize, JsonSchema, PartialEq, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct HbaseClusterSpec { + // no doc string - See ProductImage struct + pub image: ProductImage, + + /// Configuration that applies to all roles and role groups. + /// This includes settings for logging, ZooKeeper and HDFS connection, among other things. + pub cluster_config: v1alpha1::HbaseClusterConfig, + + // no doc string - See ClusterOperation struct + #[serde(default)] + pub cluster_operation: ClusterOperation, + + /// The HBase master process is responsible for assigning regions to region servers and + /// manages the cluster. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub masters: Option>, + + /// Region servers hold the data and handle requests from clients for their region. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub region_servers: + Option>, + + /// Rest servers provide a REST API to interact with. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub rest_servers: Option>, + } - #[serde(rename = "external-unstable")] - ExternalUnstable, + #[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] + #[serde(rename_all = "camelCase")] + pub struct HbaseClusterConfig { + /// Name of the [discovery ConfigMap](DOCS_BASE_URL_PLACEHOLDER/concepts/service_discovery) + /// for an HDFS cluster. + pub hdfs_config_map_name: String, + + /// Name of the Vector aggregator [discovery ConfigMap](DOCS_BASE_URL_PLACEHOLDER/concepts/service_discovery). + /// It must contain the key `ADDRESS` with the address of the Vector aggregator. + /// Follow the [logging tutorial](DOCS_BASE_URL_PLACEHOLDER/tutorials/logging-vector-aggregator) + /// to learn how to configure log aggregation with Vector. + #[serde(skip_serializing_if = "Option::is_none")] + pub vector_aggregator_config_map_name: Option, + + /// Name of the [discovery ConfigMap](DOCS_BASE_URL_PLACEHOLDER/concepts/service_discovery) + /// for a ZooKeeper cluster. + pub zookeeper_config_map_name: String, + + /// This field controls which type of Service the Operator creates for this HbaseCluster: + /// + /// * cluster-internal: Use a ClusterIP service + /// + /// * external-unstable: Use a NodePort service + /// + /// This is a temporary solution with the goal to keep yaml manifests forward compatible. + /// In the future, this setting will control which [ListenerClass](DOCS_BASE_URL_PLACEHOLDER/listener-operator/listenerclass.html) + /// will be used to expose the service, and ListenerClass names will stay the same, allowing for a non-breaking change. + #[serde(default)] + pub listener_class: CurrentlySupportedListenerClasses, + + /// Settings related to user [authentication](DOCS_BASE_URL_PLACEHOLDER/usage-guide/security). + pub authentication: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub authorization: Option, + } } -impl CurrentlySupportedListenerClasses { - pub fn k8s_service_type(&self) -> String { - match self { - CurrentlySupportedListenerClasses::ClusterInternal => "ClusterIP".to_string(), - CurrentlySupportedListenerClasses::ExternalUnstable => "NodePort".to_string(), +impl HasStatusCondition for v1alpha1::HbaseCluster { + fn conditions(&self) -> Vec { + match &self.status { + Some(status) => status.conditions.clone(), + None => vec![], } } } -#[derive(Clone, Debug, Deserialize, Eq, Hash, JsonSchema, PartialEq, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct KerberosConfig { - /// Name of the SecretClass providing the keytab for the HDFS services. - #[serde(default = "default_kerberos_kerberos_secret_class")] - kerberos_secret_class: String, - /// Name of the SecretClass providing the tls certificates for the WebUIs. - #[serde(default = "default_kerberos_tls_secret_class")] - tls_secret_class: String, - /// Wether a principal including the Kubernetes node name should be requested. - /// The principal could e.g. be `HTTP/my-k8s-worker-0.mycorp.lan`. - /// This feature is disabled by default, as the resulting principals can already by existent - /// e.g. in Active Directory which can cause problems. - #[serde(default)] - request_node_principals: bool, -} +impl v1alpha1::HbaseCluster { + /// Retrieve and merge resource configs for role and role groups + pub fn merged_config( + &self, + role: &HbaseRole, + role_group: &str, + hdfs_discovery_cm_name: &str, + ) -> Result { + // Initialize the result with all default values as baseline + let defaults = + AnyConfigFragment::default_for(role, &self.name_any(), hdfs_discovery_cm_name); -fn default_kerberos_tls_secret_class() -> String { - "tls".to_string() -} + let (mut role_config, mut role_group_config) = match role { + HbaseRole::RegionServer => { + let role = self + .spec + .region_servers + .clone() + .context(MissingHbaseRoleSnafu { + role: role.to_string(), + })?; -fn default_kerberos_kerberos_secret_class() -> String { - "kerberos".to_string() -} + let role_config = role.config.config.to_owned(); + let role_group_config = role + .role_groups + .get(role_group) + .map(|rg| rg.config.config.clone()) + .unwrap_or_default(); -#[derive( - Clone, - Debug, - Deserialize, - Display, - EnumIter, - Eq, - Hash, - JsonSchema, - PartialEq, - Serialize, - EnumString, -)] -pub enum HbaseRole { - #[serde(rename = "master")] - #[strum(serialize = "master")] - Master, + ( + AnyConfigFragment::RegionServer(role_config), + AnyConfigFragment::RegionServer(role_group_config), + ) + } + HbaseRole::RestServer => { + let role = self + .spec + .rest_servers + .clone() + .context(MissingHbaseRoleSnafu { + role: role.to_string(), + })?; - #[serde(rename = "regionserver")] - #[strum(serialize = "regionserver")] - RegionServer, + let role_config = role.config.config.to_owned(); - #[serde(rename = "restserver")] - #[strum(serialize = "restserver")] - RestServer, -} + let role_group_config = role + .role_groups + .get(role_group) + .map(|rg| rg.config.config.clone()) + .unwrap_or_default(); -impl HbaseRole { - const DEFAULT_MASTER_GRACEFUL_SHUTDOWN_TIMEOUT: Duration = Duration::from_minutes_unchecked(20); - const DEFAULT_REGION_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT: Duration = - Duration::from_minutes_unchecked(60); - const DEFAULT_REST_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT: Duration = - Duration::from_minutes_unchecked(5); + // Retrieve role resource config + ( + AnyConfigFragment::RestServer(role_config), + AnyConfigFragment::RestServer(role_group_config), + ) + } + HbaseRole::Master => { + let role = self.spec.masters.clone().context(MissingHbaseRoleSnafu { + role: role.to_string(), + })?; - // Auto TLS certificate lifetime - const DEFAULT_MASTER_SECRET_LIFETIME: Duration = Duration::from_days_unchecked(1); - const DEFAULT_REGION_SECRET_LIFETIME: Duration = Duration::from_days_unchecked(1); - const DEFAULT_REST_SECRET_LIFETIME: Duration = Duration::from_days_unchecked(1); + let role_config = role.config.config.to_owned(); - pub fn default_config( - &self, - cluster_name: &str, - hdfs_discovery_cm_name: &str, - ) -> HbaseConfigFragment { - let resources = match &self { - HbaseRole::Master => ResourcesFragment { - cpu: CpuLimitsFragment { - min: Some(Quantity("250m".to_owned())), - max: Some(Quantity("1".to_owned())), - }, - memory: MemoryLimitsFragment { - limit: Some(Quantity("1Gi".to_owned())), - runtime_limits: NoRuntimeLimitsFragment {}, - }, - storage: HbaseStorageConfigFragment {}, - }, - HbaseRole::RegionServer => ResourcesFragment { - cpu: CpuLimitsFragment { - min: Some(Quantity("250m".to_owned())), - max: Some(Quantity("1".to_owned())), - }, - memory: MemoryLimitsFragment { - limit: Some(Quantity("1Gi".to_owned())), - runtime_limits: NoRuntimeLimitsFragment {}, - }, - storage: HbaseStorageConfigFragment {}, - }, - HbaseRole::RestServer => ResourcesFragment { - cpu: CpuLimitsFragment { - min: Some(Quantity("100m".to_owned())), - max: Some(Quantity("400m".to_owned())), - }, - memory: MemoryLimitsFragment { - limit: Some(Quantity("512Mi".to_owned())), - runtime_limits: NoRuntimeLimitsFragment {}, - }, - storage: HbaseStorageConfigFragment {}, - }, - }; + // Retrieve rolegroup specific resource config + let role_group_config = role + .role_groups + .get(role_group) + .map(|rg| rg.config.config.clone()) + .unwrap_or_default(); - let graceful_shutdown_timeout = match &self { - HbaseRole::Master => Self::DEFAULT_MASTER_GRACEFUL_SHUTDOWN_TIMEOUT, - HbaseRole::RegionServer => Self::DEFAULT_REGION_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT, - HbaseRole::RestServer => Self::DEFAULT_REST_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT, + // Retrieve role resource config + ( + AnyConfigFragment::Master(role_config), + AnyConfigFragment::Master(role_group_config), + ) + } }; - let requested_secret_lifetime = match &self { - HbaseRole::Master => Self::DEFAULT_MASTER_SECRET_LIFETIME, - HbaseRole::RegionServer => Self::DEFAULT_REGION_SECRET_LIFETIME, - HbaseRole::RestServer => Self::DEFAULT_REST_SECRET_LIFETIME, - }; + // Merge more specific configs into default config + // Hierarchy is: + // 1. RoleGroup + // 2. Role + // 3. Default + role_config = role_config.merge(&defaults)?; + role_group_config = role_group_config.merge(&role_config)?; - HbaseConfigFragment { - hbase_rootdir: None, - resources, - logging: product_logging::spec::default_logging(), - affinity: get_affinity(cluster_name, self, hdfs_discovery_cm_name), - graceful_shutdown_timeout: Some(graceful_shutdown_timeout), - requested_secret_lifetime: Some(requested_secret_lifetime), - } - } + tracing::debug!("Merged config: {:?}", role_group_config); - /// Returns the name of the role as it is needed by the `bin/hbase {cli_role_name} start` command. - pub fn cli_role_name(&self) -> String { - match self { - HbaseRole::Master | HbaseRole::RegionServer => self.to_string(), - // Of course it is not called "restserver", so we need to have this match - // instead of just letting the Display impl do it's thing ;P - HbaseRole::RestServer => "rest".to_string(), - } + Ok(match role_group_config { + AnyConfigFragment::RegionServer(conf) => AnyServiceConfig::RegionServer( + fragment::validate(conf).context(FragmentValidationFailureSnafu)?, + ), + AnyConfigFragment::RestServer(conf) => AnyServiceConfig::RestServer( + fragment::validate(conf).context(FragmentValidationFailureSnafu)?, + ), + AnyConfigFragment::Master(conf) => AnyServiceConfig::Master( + fragment::validate(conf).context(FragmentValidationFailureSnafu)?, + ), + }) } -} -fn default_resources(role: &HbaseRole) -> ResourcesFragment { - match role { - HbaseRole::RegionServer => ResourcesFragment { - cpu: CpuLimitsFragment { - min: Some(Quantity("250m".to_owned())), - max: Some(Quantity("1".to_owned())), - }, - memory: MemoryLimitsFragment { - limit: Some(Quantity("1Gi".to_owned())), - runtime_limits: NoRuntimeLimitsFragment {}, - }, - storage: HbaseStorageConfigFragment {}, - }, - HbaseRole::RestServer => ResourcesFragment { - cpu: CpuLimitsFragment { - min: Some(Quantity("100m".to_owned())), - max: Some(Quantity("400m".to_owned())), - }, - memory: MemoryLimitsFragment { - limit: Some(Quantity("512Mi".to_owned())), - runtime_limits: NoRuntimeLimitsFragment {}, - }, - storage: HbaseStorageConfigFragment {}, - }, - HbaseRole::Master => ResourcesFragment { - cpu: CpuLimitsFragment { - min: Some(Quantity("250m".to_owned())), - max: Some(Quantity("1".to_owned())), - }, - memory: MemoryLimitsFragment { - limit: Some(Quantity("1Gi".to_owned())), - runtime_limits: NoRuntimeLimitsFragment {}, - }, - storage: HbaseStorageConfigFragment {}, - }, - } -} + // The result type is only defined once, there is no value in extracting it into a type definition. + #[allow(clippy::type_complexity)] + pub fn build_role_properties( + &self, + ) -> Result< + HashMap< + String, + ( + Vec, + Role, GenericRoleConfig, JavaCommonConfig>, + ), + >, + Error, + > { + let config_types = vec![ + PropertyNameKind::Env, + PropertyNameKind::File(HBASE_ENV_SH.to_string()), + PropertyNameKind::File(HBASE_SITE_XML.to_string()), + PropertyNameKind::File(SSL_SERVER_XML.to_string()), + PropertyNameKind::File(SSL_CLIENT_XML.to_string()), + PropertyNameKind::File(JVM_SECURITY_PROPERTIES_FILE.to_string()), + ]; -#[derive(Debug, Clone)] -enum AnyConfigFragment { - RegionServer(RegionServerConfigFragment), - RestServer(HbaseConfigFragment), - Master(HbaseConfigFragment), -} + let mut roles = HashMap::from([( + HbaseRole::Master.to_string(), + ( + config_types.to_owned(), + self.spec + .masters + .clone() + .context(NoMasterRoleSnafu)? + .erase(), + ), + )]); + roles.insert( + HbaseRole::RegionServer.to_string(), + ( + config_types.to_owned(), + self.spec + .region_servers + .clone() + .context(NoRegionServerRoleSnafu)? + .erase(), + ), + ); -impl AnyConfigFragment { - fn merge(self, other: &AnyConfigFragment) -> Result { - match (self, other) { - (AnyConfigFragment::RegionServer(mut me), AnyConfigFragment::RegionServer(you)) => { - me.merge(you); - Ok(AnyConfigFragment::RegionServer(me.clone())) - } - (AnyConfigFragment::RestServer(mut me), AnyConfigFragment::RestServer(you)) => { - me.merge(you); - Ok(AnyConfigFragment::RestServer(me.clone())) - } - (AnyConfigFragment::Master(mut me), AnyConfigFragment::Master(you)) => { - me.merge(you); - Ok(AnyConfigFragment::Master(me.clone())) - } - (_, _) => Err(Error::IncompatibleMergeTypes), + if let Some(rest_servers) = self.spec.rest_servers.as_ref() { + roles.insert( + HbaseRole::RestServer.to_string(), + (config_types, rest_servers.to_owned().erase()), + ); } + + Ok(roles) } - fn default_for( + pub fn merge_pod_overrides( + &self, + pod_template: &mut PodTemplateSpec, role: &HbaseRole, - cluster_name: &str, - hdfs_discovery_cm_name: &str, - ) -> AnyConfigFragment { - match role { - HbaseRole::RegionServer => { - AnyConfigFragment::RegionServer(RegionServerConfigFragment { - hbase_rootdir: None, - resources: default_resources(role), - logging: product_logging::spec::default_logging(), - affinity: get_affinity(cluster_name, role, hdfs_discovery_cm_name), - graceful_shutdown_timeout: Some( - HbaseRole::DEFAULT_REGION_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT, - ), - region_mover: RegionMoverFragment { - run_before_shutdown: Some(false), - max_threads: Some(1), - ack: Some(true), - cli_opts: None, - }, - requested_secret_lifetime: Some(HbaseRole::DEFAULT_REGION_SECRET_LIFETIME), - }) - } - HbaseRole::RestServer => AnyConfigFragment::RestServer(HbaseConfigFragment { - hbase_rootdir: None, - resources: default_resources(role), - logging: product_logging::spec::default_logging(), - affinity: get_affinity(cluster_name, role, hdfs_discovery_cm_name), - graceful_shutdown_timeout: Some( - HbaseRole::DEFAULT_REST_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT, - ), - requested_secret_lifetime: Some(HbaseRole::DEFAULT_REST_SECRET_LIFETIME), - }), - HbaseRole::Master => AnyConfigFragment::Master(HbaseConfigFragment { - hbase_rootdir: None, - resources: default_resources(role), - logging: product_logging::spec::default_logging(), - affinity: get_affinity(cluster_name, role, hdfs_discovery_cm_name), - graceful_shutdown_timeout: Some( - HbaseRole::DEFAULT_MASTER_GRACEFUL_SHUTDOWN_TIMEOUT, - ), - requested_secret_lifetime: Some(HbaseRole::DEFAULT_MASTER_SECRET_LIFETIME), - }), + role_group_ref: &RoleGroupRef, + ) { + let (role_pod_overrides, role_group_pod_overrides) = match role { + HbaseRole::Master => ( + self.spec + .masters + .as_ref() + .map(|r| r.config.pod_overrides.clone()), + self.spec + .masters + .as_ref() + .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) + .map(|r| r.config.pod_overrides.clone()), + ), + HbaseRole::RegionServer => ( + self.spec + .region_servers + .as_ref() + .map(|r| r.config.pod_overrides.clone()), + self.spec + .region_servers + .as_ref() + .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) + .map(|r| r.config.pod_overrides.clone()), + ), + HbaseRole::RestServer => ( + self.spec + .rest_servers + .as_ref() + .map(|r| r.config.pod_overrides.clone()), + self.spec + .rest_servers + .as_ref() + .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) + .map(|r| r.config.pod_overrides.clone()), + ), + }; + + if let Some(rpo) = role_pod_overrides { + pod_template.merge_from(rpo); + } + if let Some(rgpo) = role_group_pod_overrides { + pod_template.merge_from(rgpo); } } -} - -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, Debug, Default, JsonSchema, PartialEq, Fragment)] -#[fragment_attrs( - allow(clippy::derive_partial_eq_without_eq), - derive( - Clone, - Debug, - Default, - Deserialize, - Merge, - JsonSchema, - PartialEq, - Serialize - ), - serde(rename_all = "camelCase") -)] -pub struct HbaseStorageConfig {} - -#[derive( - Clone, - Debug, - Deserialize, - Display, - Eq, - EnumIter, - JsonSchema, - Ord, - PartialEq, - PartialOrd, - Serialize, -)] -#[serde(rename_all = "camelCase")] -pub enum Container { - Hbase, - Vector, -} -#[derive(Clone, Debug, Default, Fragment, JsonSchema, PartialEq)] -#[fragment_attrs( - derive( - Clone, - Debug, - Default, - Deserialize, - Merge, - JsonSchema, - PartialEq, - Serialize - ), - serde(rename_all = "camelCase") -)] -pub struct HbaseConfig { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub hbase_rootdir: Option, + pub fn replicas( + &self, + hbase_role: &HbaseRole, + role_group_ref: &RoleGroupRef, + ) -> Option { + match hbase_role { + HbaseRole::Master => self + .spec + .masters + .as_ref() + .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) + .and_then(|rg| rg.replicas) + .map(i32::from), + HbaseRole::RegionServer => self + .spec + .region_servers + .as_ref() + .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) + .and_then(|rg| rg.replicas) + .map(i32::from), + HbaseRole::RestServer => self + .spec + .rest_servers + .as_ref() + .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) + .and_then(|rg| rg.replicas) + .map(i32::from), + } + } - #[fragment_attrs(serde(default))] - pub resources: Resources, + /// The name of the role-level load-balanced Kubernetes `Service` + pub fn server_role_service_name(&self) -> Option { + self.metadata.name.clone() + } - #[fragment_attrs(serde(default))] - pub logging: Logging, + /// Metadata about a server rolegroup + pub fn server_rolegroup_ref( + &self, + role_name: impl Into, + group_name: impl Into, + ) -> RoleGroupRef { + RoleGroupRef { + cluster: ObjectRef::from_obj(self), + role: role_name.into(), + role_group: group_name.into(), + } + } - #[fragment_attrs(serde(default))] - pub affinity: StackableAffinity, + pub fn role_config(&self, role: &HbaseRole) -> Option<&GenericRoleConfig> { + match role { + HbaseRole::Master => self.spec.masters.as_ref().map(|m| &m.role_config), + HbaseRole::RegionServer => self.spec.region_servers.as_ref().map(|rs| &rs.role_config), + HbaseRole::RestServer => self.spec.rest_servers.as_ref().map(|rs| &rs.role_config), + } + } - /// Time period Pods have to gracefully shut down, e.g. `30m`, `1h` or `2d`. Consult the operator documentation for details. - #[fragment_attrs(serde(default))] - pub graceful_shutdown_timeout: Option, + pub fn has_kerberos_enabled(&self) -> bool { + self.kerberos_secret_class().is_some() + } - /// Request secret (currently only autoTls certificates) lifetime from the secret operator, e.g. `7d`, or `30d`. - /// Please note that this can be shortened by the `maxCertificateLifetime` setting on the SecretClass issuing the TLS certificate. - #[fragment_attrs(serde(default))] - pub requested_secret_lifetime: Option, -} + pub fn kerberos_secret_class(&self) -> Option { + self.spec + .cluster_config + .authentication + .as_ref() + .map(|a| &a.kerberos) + .map(|k| k.secret_class.clone()) + } -impl Configuration for HbaseConfigFragment { - type Configurable = HbaseCluster; + pub fn has_https_enabled(&self) -> bool { + self.https_secret_class().is_some() + } - fn compute_env( - &self, - _resource: &Self::Configurable, - _role_name: &str, - ) -> Result>, stackable_operator::product_config_utils::Error> - { - // Maps env var name to env var object. This allows env_overrides to work - // as expected (i.e. users can override the env var value). - let mut vars: BTreeMap> = BTreeMap::new(); + pub fn https_secret_class(&self) -> Option { + self.spec + .cluster_config + .authentication + .as_ref() + .map(|a| a.tls_secret_class.clone()) + } - vars.insert( - "HBASE_CONF_DIR".to_string(), - Some(CONFIG_DIR_NAME.to_string()), - ); - // required by phoenix (for cases where Kerberos is enabled): see https://issues.apache.org/jira/browse/PHOENIX-2369 - vars.insert( - "HADOOP_CONF_DIR".to_string(), - Some(CONFIG_DIR_NAME.to_string()), - ); - Ok(vars) + /// Returns required port name and port number tuples depending on the role. + /// Hbase versions 2.4.* will have three ports for each role + /// Hbase versions 2.6.* will have two ports for each role. The metrics are available over the + /// UI port. + pub fn ports(&self, role: &HbaseRole, hbase_version: &str) -> Vec<(String, u16)> { + let result_without_metric_port: Vec<(String, u16)> = match role { + HbaseRole::Master => vec![ + ("master".to_string(), HBASE_MASTER_PORT), + (self.ui_port_name(), HBASE_MASTER_UI_PORT), + ], + HbaseRole::RegionServer => vec![ + ("regionserver".to_string(), HBASE_REGIONSERVER_PORT), + (self.ui_port_name(), HBASE_REGIONSERVER_UI_PORT), + ], + HbaseRole::RestServer => vec![ + ( + if self.has_https_enabled() { + HBASE_REST_PORT_NAME_HTTPS + } else { + HBASE_REST_PORT_NAME_HTTP + } + .to_string(), + HBASE_REST_PORT, + ), + (self.ui_port_name(), HBASE_REST_UI_PORT), + ], + }; + if hbase_version.starts_with(r"2.4") { + result_without_metric_port + .into_iter() + .chain(vec![(METRICS_PORT_NAME.to_string(), METRICS_PORT)]) + .collect() + } else { + result_without_metric_port + } } - fn compute_cli( - &self, - _resource: &Self::Configurable, - _role_name: &str, - ) -> Result>, stackable_operator::product_config_utils::Error> - { - Ok(BTreeMap::new()) + pub fn service_port(&self, role: &HbaseRole) -> u16 { + match role { + HbaseRole::Master => HBASE_MASTER_PORT, + HbaseRole::RegionServer => HBASE_REGIONSERVER_PORT, + HbaseRole::RestServer => HBASE_REST_PORT, + } } - fn compute_files( - &self, - _resource: &Self::Configurable, - _role_name: &str, - file: &str, - ) -> Result>, stackable_operator::product_config_utils::Error> - { - let mut result = BTreeMap::new(); - - match file { - HBASE_ENV_SH => { - // The contents of this file cannot be built entirely here because we don't have - // access to the clusterConfig or product version. - // These are needed to set up Kerberos and JMX exporter settings. - // To avoid fragmentation of the code needed to build this file, we moved the - // implementation to the hbase_controller::build_hbase_env_sh() function. - } - HBASE_SITE_XML => { - result.insert( - HBASE_CLUSTER_DISTRIBUTED.to_string(), - Some("true".to_string()), - ); - result.insert( - HBASE_UNSAFE_REGIONSERVER_HOSTNAME_DISABLE_MASTER_REVERSEDNS.to_string(), - Some("true".to_string()), - ); - result.insert(HBASE_ROOTDIR.to_string(), self.hbase_rootdir.clone()); - } - _ => {} + /// Name of the port used by the Web UI, which depends on HTTPS usage + fn ui_port_name(&self) -> String { + if self.has_https_enabled() { + HBASE_UI_PORT_NAME_HTTPS + } else { + HBASE_UI_PORT_NAME_HTTP } - - result.retain(|_, maybe_value| maybe_value.is_some()); - - Ok(result) + .to_string() } } -#[derive(Fragment, Clone, Debug, JsonSchema, PartialEq, Serialize, Deserialize)] -#[fragment_attrs( - derive( - Clone, - Debug, - Default, - Deserialize, - Merge, - JsonSchema, - PartialEq, - Serialize - ), - serde(rename_all = "camelCase") -)] -pub struct RegionMover { - /// Move local regions to other servers before terminating a region server's pod. - run_before_shutdown: bool, +pub fn merged_env(rolegroup_config: Option<&BTreeMap>) -> Vec { + let merged_env: Vec = if let Some(rolegroup_config) = rolegroup_config { + rolegroup_config + .iter() + .map(|(env_name, env_value)| EnvVar { + name: env_name.clone(), + value: Some(env_value.to_owned()), + value_from: None, + }) + .collect() + } else { + vec![] + }; + merged_env +} - /// Maximum number of threads to use for moving regions. - max_threads: u16, +// TODO: Temporary solution until listener-operator is finished +#[derive(Clone, Debug, Default, Display, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] +#[serde(rename_all = "PascalCase")] +pub enum CurrentlySupportedListenerClasses { + #[default] + #[serde(rename = "cluster-internal")] + ClusterInternal, - /// If enabled (default), the region mover will confirm that regions are available on the - /// source as well as the target pods before and after the move. - ack: bool, + #[serde(rename = "external-unstable")] + ExternalUnstable, +} - #[fragment_attrs(serde(flatten))] - cli_opts: Option, +impl CurrentlySupportedListenerClasses { + pub fn k8s_service_type(&self) -> String { + match self { + CurrentlySupportedListenerClasses::ClusterInternal => "ClusterIP".to_string(), + CurrentlySupportedListenerClasses::ExternalUnstable => "NodePort".to_string(), + } + } } -#[derive(Clone, Debug, Eq, Deserialize, JsonSchema, PartialEq, Serialize)] +#[derive(Clone, Debug, Deserialize, Eq, Hash, JsonSchema, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] -#[schemars(deny_unknown_fields)] -pub struct RegionMoverExtraCliOpts { - /// Additional options to pass to the region mover. +pub struct KerberosConfig { + /// Name of the SecretClass providing the keytab for the HDFS services. + #[serde(default = "default_kerberos_kerberos_secret_class")] + kerberos_secret_class: String, + /// Name of the SecretClass providing the tls certificates for the WebUIs. + #[serde(default = "default_kerberos_tls_secret_class")] + tls_secret_class: String, + /// Wether a principal including the Kubernetes node name should be requested. + /// The principal could e.g. be `HTTP/my-k8s-worker-0.mycorp.lan`. + /// This feature is disabled by default, as the resulting principals can already by existent + /// e.g. in Active Directory which can cause problems. #[serde(default)] - pub additional_mover_options: Vec, + request_node_principals: bool, } -impl Atomic for RegionMoverExtraCliOpts {} +fn default_kerberos_tls_secret_class() -> String { + "tls".to_string() +} -#[derive(Clone, Debug, Fragment, JsonSchema, PartialEq)] -#[fragment_attrs( - derive( - Clone, - Debug, - Default, - Deserialize, - Merge, - JsonSchema, - PartialEq, - Serialize - ), - serde(rename_all = "camelCase") -)] -pub struct RegionServerConfig { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub hbase_rootdir: Option, - #[fragment_attrs(serde(default))] - pub resources: Resources, - #[fragment_attrs(serde(default))] - pub logging: Logging, - #[fragment_attrs(serde(default))] - pub affinity: StackableAffinity, +fn default_kerberos_kerberos_secret_class() -> String { + "kerberos".to_string() +} - /// Time period Pods have to gracefully shut down, e.g. `30m`, `1h` or `2d`. Consult the operator documentation for details. - #[fragment_attrs(serde(default))] - pub graceful_shutdown_timeout: Option, +#[derive( + Clone, + Debug, + Deserialize, + Display, + EnumIter, + Eq, + Hash, + JsonSchema, + PartialEq, + Serialize, + EnumString, +)] +pub enum HbaseRole { + #[serde(rename = "master")] + #[strum(serialize = "master")] + Master, - /// Request secret (currently only autoTls certificates) lifetime from the secret operator, e.g. `7d`, or `30d`. - /// Please note that this can be shortened by the `maxCertificateLifetime` setting on the SecretClass issuing the TLS certificate. - #[fragment_attrs(serde(default))] - pub requested_secret_lifetime: Option, + #[serde(rename = "regionserver")] + #[strum(serialize = "regionserver")] + RegionServer, - /// Before terminating a region server pod, the RegionMover tool can be invoked to transfer - /// local regions to other servers. - /// This may cause a lot of network traffic in the Kubernetes cluster if the entire HBase stacklet is being - /// restarted. - /// The operator will compute a timeout period for the region move that will not exceed the graceful shutdown timeout. - #[fragment_attrs(serde(default))] - pub region_mover: RegionMover, + #[serde(rename = "restserver")] + #[strum(serialize = "restserver")] + RestServer, } -impl Configuration for RegionServerConfigFragment { - type Configurable = HbaseCluster; +impl HbaseRole { + const DEFAULT_MASTER_GRACEFUL_SHUTDOWN_TIMEOUT: Duration = Duration::from_minutes_unchecked(20); + const DEFAULT_REGION_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT: Duration = + Duration::from_minutes_unchecked(60); + const DEFAULT_REST_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT: Duration = + Duration::from_minutes_unchecked(5); - fn compute_env( - &self, - _resource: &Self::Configurable, - _role_name: &str, - ) -> Result>, stackable_operator::product_config_utils::Error> - { - let mut vars: BTreeMap> = BTreeMap::new(); + // Auto TLS certificate lifetime + const DEFAULT_MASTER_SECRET_LIFETIME: Duration = Duration::from_days_unchecked(1); + const DEFAULT_REGION_SECRET_LIFETIME: Duration = Duration::from_days_unchecked(1); + const DEFAULT_REST_SECRET_LIFETIME: Duration = Duration::from_days_unchecked(1); - vars.insert( - "HBASE_CONF_DIR".to_string(), - Some(CONFIG_DIR_NAME.to_string()), - ); - // required by phoenix (for cases where Kerberos is enabled): see https://issues.apache.org/jira/browse/PHOENIX-2369 - vars.insert( - "HADOOP_CONF_DIR".to_string(), - Some(CONFIG_DIR_NAME.to_string()), - ); - Ok(vars) - } + pub fn default_config( + &self, + cluster_name: &str, + hdfs_discovery_cm_name: &str, + ) -> HbaseConfigFragment { + let resources = match &self { + HbaseRole::Master => ResourcesFragment { + cpu: CpuLimitsFragment { + min: Some(Quantity("250m".to_owned())), + max: Some(Quantity("1".to_owned())), + }, + memory: MemoryLimitsFragment { + limit: Some(Quantity("1Gi".to_owned())), + runtime_limits: NoRuntimeLimitsFragment {}, + }, + storage: HbaseStorageConfigFragment {}, + }, + HbaseRole::RegionServer => ResourcesFragment { + cpu: CpuLimitsFragment { + min: Some(Quantity("250m".to_owned())), + max: Some(Quantity("1".to_owned())), + }, + memory: MemoryLimitsFragment { + limit: Some(Quantity("1Gi".to_owned())), + runtime_limits: NoRuntimeLimitsFragment {}, + }, + storage: HbaseStorageConfigFragment {}, + }, + HbaseRole::RestServer => ResourcesFragment { + cpu: CpuLimitsFragment { + min: Some(Quantity("100m".to_owned())), + max: Some(Quantity("400m".to_owned())), + }, + memory: MemoryLimitsFragment { + limit: Some(Quantity("512Mi".to_owned())), + runtime_limits: NoRuntimeLimitsFragment {}, + }, + storage: HbaseStorageConfigFragment {}, + }, + }; - fn compute_cli( - &self, - _resource: &Self::Configurable, - _role_name: &str, - ) -> Result>, stackable_operator::product_config_utils::Error> - { - Ok(BTreeMap::new()) - } + let graceful_shutdown_timeout = match &self { + HbaseRole::Master => Self::DEFAULT_MASTER_GRACEFUL_SHUTDOWN_TIMEOUT, + HbaseRole::RegionServer => Self::DEFAULT_REGION_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT, + HbaseRole::RestServer => Self::DEFAULT_REST_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT, + }; - fn compute_files( - &self, - _resource: &Self::Configurable, - _role_name: &str, - file: &str, - ) -> Result>, stackable_operator::product_config_utils::Error> - { - let mut result = BTreeMap::new(); + let requested_secret_lifetime = match &self { + HbaseRole::Master => Self::DEFAULT_MASTER_SECRET_LIFETIME, + HbaseRole::RegionServer => Self::DEFAULT_REGION_SECRET_LIFETIME, + HbaseRole::RestServer => Self::DEFAULT_REST_SECRET_LIFETIME, + }; - match file { - HBASE_ENV_SH => { - // The contents of this file cannot be built entirely here because we don't have - // access to the clusterConfig or product version. - // These are needed to set up Kerberos and JMX exporter settings. - // To avoid fragmentation of the code needed to build this file, we moved the - // implementation to the hbase_controller::build_hbase_env_sh() function. - } - HBASE_SITE_XML => { - result.insert( - HBASE_CLUSTER_DISTRIBUTED.to_string(), - Some("true".to_string()), - ); - result.insert( - HBASE_UNSAFE_REGIONSERVER_HOSTNAME_DISABLE_MASTER_REVERSEDNS.to_string(), - Some("true".to_string()), - ); - result.insert(HBASE_ROOTDIR.to_string(), self.hbase_rootdir.clone()); - } - _ => {} + HbaseConfigFragment { + hbase_rootdir: None, + resources, + logging: product_logging::spec::default_logging(), + affinity: get_affinity(cluster_name, self, hdfs_discovery_cm_name), + graceful_shutdown_timeout: Some(graceful_shutdown_timeout), + requested_secret_lifetime: Some(requested_secret_lifetime), } + } - result.retain(|_, maybe_value| maybe_value.is_some()); + /// Returns the name of the role as it is needed by the `bin/hbase {cli_role_name} start` command. + pub fn cli_role_name(&self) -> String { + match self { + HbaseRole::Master | HbaseRole::RegionServer => self.to_string(), + // Of course it is not called "restserver", so we need to have this match + // instead of just letting the Display impl do it's thing ;P + HbaseRole::RestServer => "rest".to_string(), + } + } +} - Ok(result) +fn default_resources(role: &HbaseRole) -> ResourcesFragment { + match role { + HbaseRole::RegionServer => ResourcesFragment { + cpu: CpuLimitsFragment { + min: Some(Quantity("250m".to_owned())), + max: Some(Quantity("1".to_owned())), + }, + memory: MemoryLimitsFragment { + limit: Some(Quantity("1Gi".to_owned())), + runtime_limits: NoRuntimeLimitsFragment {}, + }, + storage: HbaseStorageConfigFragment {}, + }, + HbaseRole::RestServer => ResourcesFragment { + cpu: CpuLimitsFragment { + min: Some(Quantity("100m".to_owned())), + max: Some(Quantity("400m".to_owned())), + }, + memory: MemoryLimitsFragment { + limit: Some(Quantity("512Mi".to_owned())), + runtime_limits: NoRuntimeLimitsFragment {}, + }, + storage: HbaseStorageConfigFragment {}, + }, + HbaseRole::Master => ResourcesFragment { + cpu: CpuLimitsFragment { + min: Some(Quantity("250m".to_owned())), + max: Some(Quantity("1".to_owned())), + }, + memory: MemoryLimitsFragment { + limit: Some(Quantity("1Gi".to_owned())), + runtime_limits: NoRuntimeLimitsFragment {}, + }, + storage: HbaseStorageConfigFragment {}, + }, } } -#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct HbaseClusterStatus { - #[serde(default)] - pub conditions: Vec, +#[derive(Debug, Clone)] +enum AnyConfigFragment { + RegionServer(RegionServerConfigFragment), + RestServer(HbaseConfigFragment), + Master(HbaseConfigFragment), } -impl HasStatusCondition for HbaseCluster { - fn conditions(&self) -> Vec { - match &self.status { - Some(status) => status.conditions.clone(), - None => vec![], +impl AnyConfigFragment { + fn merge(self, other: &AnyConfigFragment) -> Result { + match (self, other) { + (AnyConfigFragment::RegionServer(mut me), AnyConfigFragment::RegionServer(you)) => { + me.merge(you); + Ok(AnyConfigFragment::RegionServer(me.clone())) + } + (AnyConfigFragment::RestServer(mut me), AnyConfigFragment::RestServer(you)) => { + me.merge(you); + Ok(AnyConfigFragment::RestServer(me.clone())) + } + (AnyConfigFragment::Master(mut me), AnyConfigFragment::Master(you)) => { + me.merge(you); + Ok(AnyConfigFragment::Master(me.clone())) + } + (_, _) => Err(Error::IncompatibleMergeTypes), } } -} -impl HbaseCluster { - /// Retrieve and merge resource configs for role and role groups - pub fn merged_config( - &self, + fn default_for( role: &HbaseRole, - role_group: &str, + cluster_name: &str, hdfs_discovery_cm_name: &str, - ) -> Result { - // Initialize the result with all default values as baseline - let defaults = - AnyConfigFragment::default_for(role, &self.name_any(), hdfs_discovery_cm_name); - - let (mut role_config, mut role_group_config) = match role { + ) -> AnyConfigFragment { + match role { HbaseRole::RegionServer => { - let role = self - .spec - .region_servers - .clone() - .context(MissingHbaseRoleSnafu { - role: role.to_string(), - })?; - - let role_config = role.config.config.to_owned(); - let role_group_config = role - .role_groups - .get(role_group) - .map(|rg| rg.config.config.clone()) - .unwrap_or_default(); - - ( - AnyConfigFragment::RegionServer(role_config), - AnyConfigFragment::RegionServer(role_group_config), - ) + AnyConfigFragment::RegionServer(RegionServerConfigFragment { + hbase_rootdir: None, + resources: default_resources(role), + logging: product_logging::spec::default_logging(), + affinity: get_affinity(cluster_name, role, hdfs_discovery_cm_name), + graceful_shutdown_timeout: Some( + HbaseRole::DEFAULT_REGION_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT, + ), + region_mover: RegionMoverFragment { + run_before_shutdown: Some(false), + max_threads: Some(1), + ack: Some(true), + cli_opts: None, + }, + requested_secret_lifetime: Some(HbaseRole::DEFAULT_REGION_SECRET_LIFETIME), + }) } - HbaseRole::RestServer => { - let role = self - .spec - .rest_servers - .clone() - .context(MissingHbaseRoleSnafu { - role: role.to_string(), - })?; + HbaseRole::RestServer => AnyConfigFragment::RestServer(HbaseConfigFragment { + hbase_rootdir: None, + resources: default_resources(role), + logging: product_logging::spec::default_logging(), + affinity: get_affinity(cluster_name, role, hdfs_discovery_cm_name), + graceful_shutdown_timeout: Some( + HbaseRole::DEFAULT_REST_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT, + ), + requested_secret_lifetime: Some(HbaseRole::DEFAULT_REST_SECRET_LIFETIME), + }), + HbaseRole::Master => AnyConfigFragment::Master(HbaseConfigFragment { + hbase_rootdir: None, + resources: default_resources(role), + logging: product_logging::spec::default_logging(), + affinity: get_affinity(cluster_name, role, hdfs_discovery_cm_name), + graceful_shutdown_timeout: Some( + HbaseRole::DEFAULT_MASTER_GRACEFUL_SHUTDOWN_TIMEOUT, + ), + requested_secret_lifetime: Some(HbaseRole::DEFAULT_MASTER_SECRET_LIFETIME), + }), + } + } +} - let role_config = role.config.config.to_owned(); +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, Debug, Default, JsonSchema, PartialEq, Fragment)] +#[fragment_attrs( + allow(clippy::derive_partial_eq_without_eq), + derive( + Clone, + Debug, + Default, + Deserialize, + Merge, + JsonSchema, + PartialEq, + Serialize + ), + serde(rename_all = "camelCase") +)] +pub struct HbaseStorageConfig {} - let role_group_config = role - .role_groups - .get(role_group) - .map(|rg| rg.config.config.clone()) - .unwrap_or_default(); +#[derive( + Clone, + Debug, + Deserialize, + Display, + Eq, + EnumIter, + JsonSchema, + Ord, + PartialEq, + PartialOrd, + Serialize, +)] +#[serde(rename_all = "camelCase")] +pub enum Container { + Hbase, + Vector, +} - // Retrieve role resource config - ( - AnyConfigFragment::RestServer(role_config), - AnyConfigFragment::RestServer(role_group_config), - ) - } - HbaseRole::Master => { - let role = self.spec.masters.clone().context(MissingHbaseRoleSnafu { - role: role.to_string(), - })?; +#[derive(Clone, Debug, Default, Fragment, JsonSchema, PartialEq)] +#[fragment_attrs( + derive( + Clone, + Debug, + Default, + Deserialize, + Merge, + JsonSchema, + PartialEq, + Serialize + ), + serde(rename_all = "camelCase") +)] +pub struct HbaseConfig { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub hbase_rootdir: Option, - let role_config = role.config.config.to_owned(); + #[fragment_attrs(serde(default))] + pub resources: Resources, - // Retrieve rolegroup specific resource config - let role_group_config = role - .role_groups - .get(role_group) - .map(|rg| rg.config.config.clone()) - .unwrap_or_default(); + #[fragment_attrs(serde(default))] + pub logging: Logging, - // Retrieve role resource config - ( - AnyConfigFragment::Master(role_config), - AnyConfigFragment::Master(role_group_config), - ) - } - }; + #[fragment_attrs(serde(default))] + pub affinity: StackableAffinity, - // Merge more specific configs into default config - // Hierarchy is: - // 1. RoleGroup - // 2. Role - // 3. Default - role_config = role_config.merge(&defaults)?; - role_group_config = role_group_config.merge(&role_config)?; + /// Time period Pods have to gracefully shut down, e.g. `30m`, `1h` or `2d`. Consult the operator documentation for details. + #[fragment_attrs(serde(default))] + pub graceful_shutdown_timeout: Option, - tracing::debug!("Merged config: {:?}", role_group_config); + /// Request secret (currently only autoTls certificates) lifetime from the secret operator, e.g. `7d`, or `30d`. + /// Please note that this can be shortened by the `maxCertificateLifetime` setting on the SecretClass issuing the TLS certificate. + #[fragment_attrs(serde(default))] + pub requested_secret_lifetime: Option, +} - Ok(match role_group_config { - AnyConfigFragment::RegionServer(conf) => AnyServiceConfig::RegionServer( - fragment::validate(conf).context(FragmentValidationFailureSnafu)?, - ), - AnyConfigFragment::RestServer(conf) => AnyServiceConfig::RestServer( - fragment::validate(conf).context(FragmentValidationFailureSnafu)?, - ), - AnyConfigFragment::Master(conf) => AnyServiceConfig::Master( - fragment::validate(conf).context(FragmentValidationFailureSnafu)?, - ), - }) - } +impl Configuration for HbaseConfigFragment { + type Configurable = v1alpha1::HbaseCluster; - // The result type is only defined once, there is no value in extracting it into a type definition. - #[allow(clippy::type_complexity)] - pub fn build_role_properties( + fn compute_env( &self, - ) -> Result< - HashMap< - String, - ( - Vec, - Role< - impl Configuration, - GenericRoleConfig, - JavaCommonConfig, - >, - ), - >, - Error, - > { - let config_types = vec![ - PropertyNameKind::Env, - PropertyNameKind::File(HBASE_ENV_SH.to_string()), - PropertyNameKind::File(HBASE_SITE_XML.to_string()), - PropertyNameKind::File(SSL_SERVER_XML.to_string()), - PropertyNameKind::File(SSL_CLIENT_XML.to_string()), - PropertyNameKind::File(JVM_SECURITY_PROPERTIES_FILE.to_string()), - ]; + _resource: &Self::Configurable, + _role_name: &str, + ) -> Result>, stackable_operator::product_config_utils::Error> + { + // Maps env var name to env var object. This allows env_overrides to work + // as expected (i.e. users can override the env var value). + let mut vars: BTreeMap> = BTreeMap::new(); - let mut roles = HashMap::from([( - HbaseRole::Master.to_string(), - ( - config_types.to_owned(), - self.spec - .masters - .clone() - .context(NoMasterRoleSnafu)? - .erase(), - ), - )]); - roles.insert( - HbaseRole::RegionServer.to_string(), - ( - config_types.to_owned(), - self.spec - .region_servers - .clone() - .context(NoRegionServerRoleSnafu)? - .erase(), - ), + vars.insert( + "HBASE_CONF_DIR".to_string(), + Some(CONFIG_DIR_NAME.to_string()), ); - - if let Some(rest_servers) = self.spec.rest_servers.as_ref() { - roles.insert( - HbaseRole::RestServer.to_string(), - (config_types, rest_servers.to_owned().erase()), - ); - } - - Ok(roles) + // required by phoenix (for cases where Kerberos is enabled): see https://issues.apache.org/jira/browse/PHOENIX-2369 + vars.insert( + "HADOOP_CONF_DIR".to_string(), + Some(CONFIG_DIR_NAME.to_string()), + ); + Ok(vars) } - pub fn merge_pod_overrides( + fn compute_cli( &self, - pod_template: &mut PodTemplateSpec, - role: &HbaseRole, - role_group_ref: &RoleGroupRef, - ) { - let (role_pod_overrides, role_group_pod_overrides) = match role { - HbaseRole::Master => ( - self.spec - .masters - .as_ref() - .map(|r| r.config.pod_overrides.clone()), - self.spec - .masters - .as_ref() - .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) - .map(|r| r.config.pod_overrides.clone()), - ), - HbaseRole::RegionServer => ( - self.spec - .region_servers - .as_ref() - .map(|r| r.config.pod_overrides.clone()), - self.spec - .region_servers - .as_ref() - .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) - .map(|r| r.config.pod_overrides.clone()), - ), - HbaseRole::RestServer => ( - self.spec - .rest_servers - .as_ref() - .map(|r| r.config.pod_overrides.clone()), - self.spec - .rest_servers - .as_ref() - .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) - .map(|r| r.config.pod_overrides.clone()), - ), - }; - - if let Some(rpo) = role_pod_overrides { - pod_template.merge_from(rpo); - } - if let Some(rgpo) = role_group_pod_overrides { - pod_template.merge_from(rgpo); - } + _resource: &Self::Configurable, + _role_name: &str, + ) -> Result>, stackable_operator::product_config_utils::Error> + { + Ok(BTreeMap::new()) } - pub fn replicas( + fn compute_files( &self, - hbase_role: &HbaseRole, - role_group_ref: &RoleGroupRef, - ) -> Option { - match hbase_role { - HbaseRole::Master => self - .spec - .masters - .as_ref() - .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) - .and_then(|rg| rg.replicas) - .map(i32::from), - HbaseRole::RegionServer => self - .spec - .region_servers - .as_ref() - .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) - .and_then(|rg| rg.replicas) - .map(i32::from), - HbaseRole::RestServer => self - .spec - .rest_servers - .as_ref() - .and_then(|r| r.role_groups.get(&role_group_ref.role_group)) - .and_then(|rg| rg.replicas) - .map(i32::from), + _resource: &Self::Configurable, + _role_name: &str, + file: &str, + ) -> Result>, stackable_operator::product_config_utils::Error> + { + let mut result = BTreeMap::new(); + + match file { + HBASE_ENV_SH => { + // The contents of this file cannot be built entirely here because we don't have + // access to the clusterConfig or product version. + // These are needed to set up Kerberos and JMX exporter settings. + // To avoid fragmentation of the code needed to build this file, we moved the + // implementation to the hbase_controller::build_hbase_env_sh() function. + } + HBASE_SITE_XML => { + result.insert( + HBASE_CLUSTER_DISTRIBUTED.to_string(), + Some("true".to_string()), + ); + result.insert( + HBASE_UNSAFE_REGIONSERVER_HOSTNAME_DISABLE_MASTER_REVERSEDNS.to_string(), + Some("true".to_string()), + ); + result.insert(HBASE_ROOTDIR.to_string(), self.hbase_rootdir.clone()); + } + _ => {} } - } - /// The name of the role-level load-balanced Kubernetes `Service` - pub fn server_role_service_name(&self) -> Option { - self.metadata.name.clone() - } + result.retain(|_, maybe_value| maybe_value.is_some()); - /// Metadata about a server rolegroup - pub fn server_rolegroup_ref( - &self, - role_name: impl Into, - group_name: impl Into, - ) -> RoleGroupRef { - RoleGroupRef { - cluster: ObjectRef::from_obj(self), - role: role_name.into(), - role_group: group_name.into(), - } + Ok(result) } +} - pub fn role_config(&self, role: &HbaseRole) -> Option<&GenericRoleConfig> { - match role { - HbaseRole::Master => self.spec.masters.as_ref().map(|m| &m.role_config), - HbaseRole::RegionServer => self.spec.region_servers.as_ref().map(|rs| &rs.role_config), - HbaseRole::RestServer => self.spec.rest_servers.as_ref().map(|rs| &rs.role_config), - } - } +#[derive(Fragment, Clone, Debug, JsonSchema, PartialEq, Serialize, Deserialize)] +#[fragment_attrs( + derive( + Clone, + Debug, + Default, + Deserialize, + Merge, + JsonSchema, + PartialEq, + Serialize + ), + serde(rename_all = "camelCase") +)] +pub struct RegionMover { + /// Move local regions to other servers before terminating a region server's pod. + run_before_shutdown: bool, - pub fn has_kerberos_enabled(&self) -> bool { - self.kerberos_secret_class().is_some() - } + /// Maximum number of threads to use for moving regions. + max_threads: u16, - pub fn kerberos_secret_class(&self) -> Option { - self.spec - .cluster_config - .authentication - .as_ref() - .map(|a| &a.kerberos) - .map(|k| k.secret_class.clone()) - } + /// If enabled (default), the region mover will confirm that regions are available on the + /// source as well as the target pods before and after the move. + ack: bool, - pub fn has_https_enabled(&self) -> bool { - self.https_secret_class().is_some() - } + #[fragment_attrs(serde(flatten))] + cli_opts: Option, +} - pub fn https_secret_class(&self) -> Option { - self.spec - .cluster_config - .authentication - .as_ref() - .map(|a| a.tls_secret_class.clone()) - } +#[derive(Clone, Debug, Eq, Deserialize, JsonSchema, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +#[schemars(deny_unknown_fields)] +pub struct RegionMoverExtraCliOpts { + /// Additional options to pass to the region mover. + #[serde(default)] + pub additional_mover_options: Vec, +} - /// Returns required port name and port number tuples depending on the role. - /// Hbase versions 2.4.* will have three ports for each role - /// Hbase versions 2.6.* will have two ports for each role. The metrics are available over the - /// UI port. - pub fn ports(&self, role: &HbaseRole, hbase_version: &str) -> Vec<(String, u16)> { - let result_without_metric_port: Vec<(String, u16)> = match role { - HbaseRole::Master => vec![ - ("master".to_string(), HBASE_MASTER_PORT), - (self.ui_port_name(), HBASE_MASTER_UI_PORT), - ], - HbaseRole::RegionServer => vec![ - ("regionserver".to_string(), HBASE_REGIONSERVER_PORT), - (self.ui_port_name(), HBASE_REGIONSERVER_UI_PORT), - ], - HbaseRole::RestServer => vec![ - ( - if self.has_https_enabled() { - HBASE_REST_PORT_NAME_HTTPS - } else { - HBASE_REST_PORT_NAME_HTTP - } - .to_string(), - HBASE_REST_PORT, - ), - (self.ui_port_name(), HBASE_REST_UI_PORT), - ], - }; - if hbase_version.starts_with(r"2.4") { - result_without_metric_port - .into_iter() - .chain(vec![(METRICS_PORT_NAME.to_string(), METRICS_PORT)]) - .collect() - } else { - result_without_metric_port - } +impl Atomic for RegionMoverExtraCliOpts {} + +#[derive(Clone, Debug, Fragment, JsonSchema, PartialEq)] +#[fragment_attrs( + derive( + Clone, + Debug, + Default, + Deserialize, + Merge, + JsonSchema, + PartialEq, + Serialize + ), + serde(rename_all = "camelCase") +)] +pub struct RegionServerConfig { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub hbase_rootdir: Option, + #[fragment_attrs(serde(default))] + pub resources: Resources, + #[fragment_attrs(serde(default))] + pub logging: Logging, + #[fragment_attrs(serde(default))] + pub affinity: StackableAffinity, + + /// Time period Pods have to gracefully shut down, e.g. `30m`, `1h` or `2d`. Consult the operator documentation for details. + #[fragment_attrs(serde(default))] + pub graceful_shutdown_timeout: Option, + + /// Request secret (currently only autoTls certificates) lifetime from the secret operator, e.g. `7d`, or `30d`. + /// Please note that this can be shortened by the `maxCertificateLifetime` setting on the SecretClass issuing the TLS certificate. + #[fragment_attrs(serde(default))] + pub requested_secret_lifetime: Option, + + /// Before terminating a region server pod, the RegionMover tool can be invoked to transfer + /// local regions to other servers. + /// This may cause a lot of network traffic in the Kubernetes cluster if the entire HBase stacklet is being + /// restarted. + /// The operator will compute a timeout period for the region move that will not exceed the graceful shutdown timeout. + #[fragment_attrs(serde(default))] + pub region_mover: RegionMover, +} + +impl Configuration for RegionServerConfigFragment { + type Configurable = v1alpha1::HbaseCluster; + + fn compute_env( + &self, + _resource: &Self::Configurable, + _role_name: &str, + ) -> Result>, stackable_operator::product_config_utils::Error> + { + let mut vars: BTreeMap> = BTreeMap::new(); + + vars.insert( + "HBASE_CONF_DIR".to_string(), + Some(CONFIG_DIR_NAME.to_string()), + ); + // required by phoenix (for cases where Kerberos is enabled): see https://issues.apache.org/jira/browse/PHOENIX-2369 + vars.insert( + "HADOOP_CONF_DIR".to_string(), + Some(CONFIG_DIR_NAME.to_string()), + ); + Ok(vars) } - pub fn service_port(&self, role: &HbaseRole) -> u16 { - match role { - HbaseRole::Master => HBASE_MASTER_PORT, - HbaseRole::RegionServer => HBASE_REGIONSERVER_PORT, - HbaseRole::RestServer => HBASE_REST_PORT, - } + fn compute_cli( + &self, + _resource: &Self::Configurable, + _role_name: &str, + ) -> Result>, stackable_operator::product_config_utils::Error> + { + Ok(BTreeMap::new()) } - /// Name of the port used by the Web UI, which depends on HTTPS usage - fn ui_port_name(&self) -> String { - if self.has_https_enabled() { - HBASE_UI_PORT_NAME_HTTPS - } else { - HBASE_UI_PORT_NAME_HTTP + fn compute_files( + &self, + _resource: &Self::Configurable, + _role_name: &str, + file: &str, + ) -> Result>, stackable_operator::product_config_utils::Error> + { + let mut result = BTreeMap::new(); + + match file { + HBASE_ENV_SH => { + // The contents of this file cannot be built entirely here because we don't have + // access to the clusterConfig or product version. + // These are needed to set up Kerberos and JMX exporter settings. + // To avoid fragmentation of the code needed to build this file, we moved the + // implementation to the hbase_controller::build_hbase_env_sh() function. + } + HBASE_SITE_XML => { + result.insert( + HBASE_CLUSTER_DISTRIBUTED.to_string(), + Some("true".to_string()), + ); + result.insert( + HBASE_UNSAFE_REGIONSERVER_HOSTNAME_DISABLE_MASTER_REVERSEDNS.to_string(), + Some("true".to_string()), + ); + result.insert(HBASE_ROOTDIR.to_string(), self.hbase_rootdir.clone()); + } + _ => {} } - .to_string() + + result.retain(|_, maybe_value| maybe_value.is_some()); + + Ok(result) } } -pub fn merged_env(rolegroup_config: Option<&BTreeMap>) -> Vec { - let merged_env: Vec = if let Some(rolegroup_config) = rolegroup_config { - rolegroup_config - .iter() - .map(|(env_name, env_value)| EnvVar { - name: env_name.clone(), - value: Some(env_value.to_owned()), - value_from: None, - }) - .collect() - } else { - vec![] - }; - merged_env +#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HbaseClusterStatus { + #[serde(default)] + pub conditions: Vec, } pub enum AnyServiceConfig { @@ -1250,7 +1249,7 @@ mod tests { transform_all_roles_to_config, validate_all_roles_and_groups_config, }; - use crate::{merged_env, AnyServiceConfig, HbaseCluster, HbaseRole, RegionMoverExtraCliOpts}; + use super::*; #[test] pub fn test_env_overrides() { @@ -1298,7 +1297,7 @@ spec: "#}; let deserializer = serde_yaml::Deserializer::from_str(input); - let hbase: HbaseCluster = + let hbase: v1alpha1::HbaseCluster = serde_yaml::with::singleton_map_recursive::deserialize(deserializer).unwrap(); let roles = HashMap::from([( @@ -1392,7 +1391,7 @@ spec: "#}; let deserializer = serde_yaml::Deserializer::from_str(input); - let hbase: HbaseCluster = + let hbase: v1alpha1::HbaseCluster = serde_yaml::with::singleton_map_recursive::deserialize(deserializer).unwrap(); let hbase_role = HbaseRole::RegionServer; diff --git a/rust/crd/src/security.rs b/rust/operator-binary/src/crd/security.rs similarity index 100% rename from rust/crd/src/security.rs rename to rust/operator-binary/src/crd/security.rs diff --git a/rust/operator-binary/src/discovery.rs b/rust/operator-binary/src/discovery.rs index f5c9e8a4..3b55ac8f 100644 --- a/rust/operator-binary/src/discovery.rs +++ b/rust/operator-binary/src/discovery.rs @@ -2,7 +2,6 @@ use std::collections::BTreeMap; use product_config::writer::to_hadoop_xml; use snafu::{ResultExt, Snafu}; -use stackable_hbase_crd::{HbaseCluster, HbaseRole, HBASE_SITE_XML}; use stackable_operator::{ builder::{configmap::ConfigMapBuilder, meta::ObjectMetaBuilder}, commons::product_image_selection::ResolvedProductImage, @@ -12,6 +11,7 @@ use stackable_operator::{ }; use crate::{ + crd::{v1alpha1, HbaseRole, HBASE_SITE_XML}, hbase_controller::build_recommended_labels, kerberos::{self, kerberos_discovery_config_properties}, zookeeper::ZookeeperConnectionInformation, @@ -24,7 +24,7 @@ pub enum Error { #[snafu(display("object {hbase} is missing metadata to build owner reference"))] ObjectMissingMetadataForOwnerRef { source: stackable_operator::builder::meta::Error, - hbase: ObjectRef, + hbase: ObjectRef, }, #[snafu(display("failed to build ConfigMap"))] @@ -43,7 +43,7 @@ pub enum Error { /// Creates a discovery config map containing the `hbase-site.xml` for clients. pub fn build_discovery_configmap( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, cluster_info: &KubernetesClusterInfo, zookeeper_connection_information: &ZookeeperConnectionInformation, resolved_product_image: &ResolvedProductImage, diff --git a/rust/operator-binary/src/hbase_controller.rs b/rust/operator-binary/src/hbase_controller.rs index 892afd53..6bfdfab6 100644 --- a/rust/operator-binary/src/hbase_controller.rs +++ b/rust/operator-binary/src/hbase_controller.rs @@ -1,4 +1,5 @@ -//! Ensures that `Pod`s are configured and running for each [`HbaseCluster`] +//! Ensures that `Pod`s are configured and running for each [`v1alpha1::HbaseCluster`] + use std::{ collections::{BTreeMap, HashMap}, fmt::Write, @@ -13,11 +14,6 @@ use product_config::{ ProductConfigManager, }; use snafu::{OptionExt, ResultExt, Snafu}; -use stackable_hbase_crd::{ - merged_env, AnyServiceConfig, Container, HbaseCluster, HbaseClusterStatus, HbaseRole, APP_NAME, - HBASE_ENV_SH, HBASE_REST_PORT_NAME_HTTP, HBASE_REST_PORT_NAME_HTTPS, HBASE_SITE_XML, - JVM_SECURITY_PROPERTIES_FILE, SSL_CLIENT_XML, SSL_SERVER_XML, -}; use stackable_operator::{ builder::{ self, @@ -72,6 +68,11 @@ use crate::{ construct_global_jvm_args, construct_hbase_heapsize_env, construct_role_specific_non_heap_jvm_args, }, + crd::{ + merged_env, v1alpha1, AnyServiceConfig, Container, HbaseClusterStatus, HbaseRole, APP_NAME, + HBASE_ENV_SH, HBASE_REST_PORT_NAME_HTTP, HBASE_REST_PORT_NAME_HTTPS, HBASE_SITE_XML, + JVM_SECURITY_PROPERTIES_FILE, SSL_CLIENT_XML, SSL_SERVER_XML, + }, discovery::build_discovery_configmap, kerberos::{ self, add_kerberos_pod_config, kerberos_config_properties, kerberos_ssl_client_settings, @@ -82,8 +83,7 @@ use crate::{ extend_role_group_config_map, resolve_vector_aggregator_address, CONTAINERDEBUG_LOG_DIRECTORY, STACKABLE_LOG_DIR, }, - security, - security::opa::HbaseOpaConfig, + security::{self, opa::HbaseOpaConfig}, zookeeper::{self, ZookeeperConnectionInformation}, OPERATOR_NAME, }; @@ -111,10 +111,9 @@ pub struct Ctx { #[derive(Snafu, Debug, EnumDiscriminants)] #[strum_discriminants(derive(IntoStaticStr))] -#[allow(clippy::enum_variant_names)] pub enum Error { #[snafu(display("invalid role properties"))] - RoleProperties { source: stackable_hbase_crd::Error }, + RoleProperties { source: crate::crd::Error }, #[snafu(display("missing secret lifetime"))] MissingSecretLifetime, @@ -155,7 +154,7 @@ pub enum Error { #[snafu(display("failed to apply Service for {}", rolegroup))] ApplyRoleGroupService { source: stackable_operator::cluster_resources::Error, - rolegroup: RoleGroupRef, + rolegroup: RoleGroupRef, }, #[snafu(display("failed to apply discovery configmap"))] @@ -169,19 +168,19 @@ pub enum Error { #[snafu(display("failed to build ConfigMap for {}", rolegroup))] BuildRoleGroupConfig { source: stackable_operator::builder::configmap::Error, - rolegroup: RoleGroupRef, + rolegroup: RoleGroupRef, }, #[snafu(display("failed to apply ConfigMap for {}", rolegroup))] ApplyRoleGroupConfig { source: stackable_operator::cluster_resources::Error, - rolegroup: RoleGroupRef, + rolegroup: RoleGroupRef, }, #[snafu(display("failed to apply StatefulSet for {}", rolegroup))] ApplyRoleGroupStatefulSet { source: stackable_operator::cluster_resources::Error, - rolegroup: RoleGroupRef, + rolegroup: RoleGroupRef, }, #[snafu(display("failed to generate product config"))] @@ -231,10 +230,10 @@ pub enum Error { }, #[snafu(display("failed to retrieve Hbase role group: {source}"))] - UnidentifiedHbaseRoleGroup { source: stackable_hbase_crd::Error }, + UnidentifiedHbaseRoleGroup { source: crate::crd::Error }, #[snafu(display("failed to resolve and merge config for role and role group"))] - FailedToResolveConfig { source: stackable_hbase_crd::Error }, + FailedToResolveConfig { source: crate::crd::Error }, #[snafu(display("failed to resolve the Vector aggregator address"))] ResolveVectorAggregatorAddress { @@ -266,7 +265,7 @@ pub enum Error { ))] SerializeJvmSecurity { source: PropertiesWriterError, - rolegroup: RoleGroupRef, + rolegroup: RoleGroupRef, }, #[snafu(display("failed to create PodDisruptionBudget"))] @@ -328,7 +327,7 @@ impl ReconcilerError for Error { } pub async fn reconcile_hbase( - hbase: Arc>, + hbase: Arc>, ctx: Arc, ) -> Result { tracing::info!("Starting reconcile"); @@ -516,7 +515,7 @@ pub async fn reconcile_hbase( /// The server-role service is the primary endpoint that should be used by clients that do not perform internal load balancing, /// including targets outside of the cluster. pub fn build_region_server_role_service( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, resolved_product_image: &ResolvedProductImage, ) -> Result { let role = HbaseRole::RegionServer; @@ -569,9 +568,9 @@ pub fn build_region_server_role_service( /// The rolegroup [`ConfigMap`] configures the rolegroup based on the configuration given by the administrator #[allow(clippy::too_many_arguments)] fn build_rolegroup_config_map( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, cluster_info: &KubernetesClusterInfo, - rolegroup: &RoleGroupRef, + rolegroup: &RoleGroupRef, rolegroup_config: &HashMap>, zookeeper_connection_information: &ZookeeperConnectionInformation, merged_config: &AnyServiceConfig, @@ -723,9 +722,9 @@ fn build_rolegroup_config_map( /// /// This is mostly useful for internal communication between peers, or for clients that perform client-side load balancing. fn build_rolegroup_service( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, hbase_role: &HbaseRole, - rolegroup: &RoleGroupRef, + rolegroup: &RoleGroupRef, resolved_product_image: &ResolvedProductImage, ) -> Result { let ports = hbase @@ -783,10 +782,10 @@ fn build_rolegroup_service( /// The [`Pod`](`stackable_operator::k8s_openapi::api::core::v1::Pod`)s are accessible through the corresponding [`Service`] (from [`build_rolegroup_service`]). #[allow(clippy::too_many_arguments)] fn build_rolegroup_statefulset( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, cluster_info: &KubernetesClusterInfo, hbase_role: &HbaseRole, - rolegroup_ref: &RoleGroupRef, + rolegroup_ref: &RoleGroupRef, rolegroup_config: &HashMap>, merged_config: &AnyServiceConfig, resolved_product_image: &ResolvedProductImage, @@ -1076,7 +1075,7 @@ where } pub fn error_policy( - _obj: Arc>, + _obj: Arc>, error: &Error, _ctx: Arc, ) -> Action { @@ -1088,11 +1087,11 @@ pub fn error_policy( } pub fn build_recommended_labels<'a>( - owner: &'a HbaseCluster, + owner: &'a v1alpha1::HbaseCluster, app_version: &'a str, role: &'a str, role_group: &'a str, -) -> ObjectLabels<'a, HbaseCluster> { +) -> ObjectLabels<'a, v1alpha1::HbaseCluster> { ObjectLabels { owner, app_name: APP_NAME, @@ -1106,7 +1105,7 @@ pub fn build_recommended_labels<'a>( /// The content of the HBase `hbase-env.sh` file. fn build_hbase_env_sh( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, merged_config: &AnyServiceConfig, hbase_role: &HbaseRole, role_group: &str, @@ -1155,7 +1154,7 @@ fn build_hbase_env_sh( /// In the future, such validations should be moved to the CRD CEL rules which are much more flexible /// and have to added benefit that invalid CRs are rejected by the API server. /// A requirement for this is that the minimum supported Kubernetes version is 1.29. -fn validate_cr(hbase: &HbaseCluster) -> Result<()> { +fn validate_cr(hbase: &v1alpha1::HbaseCluster) -> Result<()> { tracing::info!("Begin CR validation"); let hbase_version = hbase.spec.image.product_version(); @@ -1174,8 +1173,8 @@ fn validate_cr(hbase: &HbaseCluster) -> Result<()> { /// by appending it to the `HOSTNAME` environment variable. /// This name is required by the RegionMover to function properly. fn hbase_service_domain_name( - hbase: &HbaseCluster, - rolegroup_ref: &RoleGroupRef, + hbase: &v1alpha1::HbaseCluster, + rolegroup_ref: &RoleGroupRef, cluster_info: &KubernetesClusterInfo, ) -> Result { let hbase_cluster_name = rolegroup_ref.object_name(); @@ -1237,7 +1236,8 @@ mod test { replicas: 1 " ); - let hbase: HbaseCluster = serde_yaml::from_str(&input).expect("illegal test input"); + let hbase: v1alpha1::HbaseCluster = + serde_yaml::from_str(&input).expect("illegal test input"); let resolved_image = ResolvedProductImage { image: format!("oci.stackable.tech/sdp/hbase:{hbase_version}-stackable0.0.0-dev"), @@ -1248,7 +1248,7 @@ mod test { }; let role_group_ref = RoleGroupRef { - cluster: ObjectRef::::from_obj(&hbase), + cluster: ObjectRef::::from_obj(&hbase), role: role.to_string(), role_group: "default".to_string(), }; diff --git a/rust/operator-binary/src/kerberos.rs b/rust/operator-binary/src/kerberos.rs index 0ea1f0a1..64205814 100644 --- a/rust/operator-binary/src/kerberos.rs +++ b/rust/operator-binary/src/kerberos.rs @@ -1,7 +1,6 @@ use std::collections::BTreeMap; use snafu::{OptionExt, ResultExt, Snafu}; -use stackable_hbase_crd::{HbaseCluster, TLS_STORE_DIR, TLS_STORE_PASSWORD, TLS_STORE_VOLUME_NAME}; use stackable_operator::{ builder::{ self, @@ -16,10 +15,14 @@ use stackable_operator::{ utils::cluster_info::KubernetesClusterInfo, }; +use crate::crd::{v1alpha1, TLS_STORE_DIR, TLS_STORE_PASSWORD, TLS_STORE_VOLUME_NAME}; + #[derive(Snafu, Debug)] pub enum Error { #[snafu(display("object {hbase} is missing namespace"))] - ObjectMissingNamespace { hbase: ObjectRef }, + ObjectMissingNamespace { + hbase: ObjectRef, + }, #[snafu(display("failed to add Kerberos secret volume"))] AddKerberosSecretVolume { @@ -41,7 +44,7 @@ pub enum Error { } pub fn kerberos_config_properties( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, cluster_info: &KubernetesClusterInfo, ) -> Result, Error> { if !hbase.has_kerberos_enabled() { @@ -134,7 +137,7 @@ pub fn kerberos_config_properties( } pub fn kerberos_discovery_config_properties( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, cluster_info: &KubernetesClusterInfo, ) -> Result, Error> { if !hbase.has_kerberos_enabled() { @@ -174,7 +177,7 @@ pub fn kerberos_discovery_config_properties( ])) } -pub fn kerberos_ssl_server_settings(hbase: &HbaseCluster) -> BTreeMap { +pub fn kerberos_ssl_server_settings(hbase: &v1alpha1::HbaseCluster) -> BTreeMap { if !hbase.has_https_enabled() { return BTreeMap::new(); } @@ -204,7 +207,7 @@ pub fn kerberos_ssl_server_settings(hbase: &HbaseCluster) -> BTreeMap BTreeMap { +pub fn kerberos_ssl_client_settings(hbase: &v1alpha1::HbaseCluster) -> BTreeMap { if !hbase.has_https_enabled() { return BTreeMap::new(); } @@ -226,7 +229,7 @@ pub fn kerberos_ssl_client_settings(hbase: &HbaseCluster) -> BTreeMap Result { let hbase_name = hbase.name_any(); diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index d5446e88..dc13d535 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use clap::Parser; use futures::StreamExt; use hbase_controller::FULL_HBASE_CONTROLLER_NAME; -use stackable_hbase_crd::{HbaseCluster, APP_NAME}; use stackable_operator::{ cli::{Command, ProductOperatorRun}, k8s_openapi::api::{apps::v1::StatefulSet, core::v1::Service}, @@ -15,10 +14,14 @@ use stackable_operator::{ }, }, logging::controller::report_controller_reconciled, - CustomResourceExt, + shared::yaml::SerializeOptions, + YamlSchema, }; +use crate::crd::{v1alpha1, HbaseCluster, APP_NAME}; + mod config; +mod crd; mod discovery; mod hbase_controller; mod kerberos; @@ -45,7 +48,8 @@ async fn main() -> anyhow::Result<()> { let opts = Opts::parse(); match opts.cmd { Command::Crd => { - HbaseCluster::print_yaml_schema(built_info::PKG_VERSION)?; + HbaseCluster::merged_crd(HbaseCluster::V1Alpha1)? + .print_yaml_schema(built_info::PKG_VERSION, SerializeOptions::default())?; } Command::Run(ProductOperatorRun { product_config, @@ -85,7 +89,7 @@ async fn main() -> anyhow::Result<()> { )); Controller::new( - watch_namespace.get_api::>(&client), + watch_namespace.get_api::>(&client), watcher::Config::default(), ) .owns( diff --git a/rust/operator-binary/src/operations/graceful_shutdown.rs b/rust/operator-binary/src/operations/graceful_shutdown.rs index 48e06463..62cdadcf 100644 --- a/rust/operator-binary/src/operations/graceful_shutdown.rs +++ b/rust/operator-binary/src/operations/graceful_shutdown.rs @@ -1,7 +1,8 @@ use snafu::{ResultExt, Snafu}; -use stackable_hbase_crd::AnyServiceConfig; use stackable_operator::builder::pod::PodBuilder; +use crate::crd::AnyServiceConfig; + #[derive(Debug, Snafu)] pub enum Error { #[snafu(display("Failed to set terminationGracePeriod"))] diff --git a/rust/operator-binary/src/operations/pdb.rs b/rust/operator-binary/src/operations/pdb.rs index 5ff0c49d..8350e4aa 100644 --- a/rust/operator-binary/src/operations/pdb.rs +++ b/rust/operator-binary/src/operations/pdb.rs @@ -1,11 +1,14 @@ use snafu::{ResultExt, Snafu}; -use stackable_hbase_crd::{HbaseCluster, HbaseRole, APP_NAME}; use stackable_operator::{ builder::pdb::PodDisruptionBudgetBuilder, client::Client, cluster_resources::ClusterResources, commons::pdb::PdbConfig, kube::ResourceExt, }; -use crate::{hbase_controller::HBASE_CONTROLLER_NAME, OPERATOR_NAME}; +use crate::{ + crd::{v1alpha1, HbaseRole, APP_NAME}, + hbase_controller::HBASE_CONTROLLER_NAME, + OPERATOR_NAME, +}; #[derive(Snafu, Debug)] pub enum Error { @@ -24,7 +27,7 @@ pub enum Error { pub async fn add_pdbs( pdb: &PdbConfig, - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, role: &HbaseRole, client: &Client, cluster_resources: &mut ClusterResources, diff --git a/rust/operator-binary/src/product_logging.rs b/rust/operator-binary/src/product_logging.rs index d86f2bab..29d896ff 100644 --- a/rust/operator-binary/src/product_logging.rs +++ b/rust/operator-binary/src/product_logging.rs @@ -1,5 +1,4 @@ use snafu::{OptionExt, ResultExt, Snafu}; -use stackable_hbase_crd::{Container, HbaseCluster}; use stackable_operator::{ builder::configmap::ConfigMapBuilder, client::Client, @@ -15,7 +14,10 @@ use stackable_operator::{ role_utils::RoleGroupRef, }; -use crate::hbase_controller::MAX_HBASE_LOG_FILES_SIZE; +use crate::{ + crd::{v1alpha1, Container}, + hbase_controller::MAX_HBASE_LOG_FILES_SIZE, +}; #[derive(Snafu, Debug)] pub enum Error { @@ -35,7 +37,7 @@ pub enum Error { }, #[snafu(display("crd validation failure"))] - CrdValidationFailure { source: stackable_hbase_crd::Error }, + CrdValidationFailure { source: crate::crd::Error }, #[snafu(display("vectorAggregatorConfigMapName must be set"))] MissingVectorAggregatorAddress, @@ -56,7 +58,7 @@ pub static CONTAINERDEBUG_LOG_DIRECTORY: std::sync::LazyLock = /// Return the address of the Vector aggregator if the corresponding ConfigMap name is given in the /// cluster spec pub async fn resolve_vector_aggregator_address( - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, client: &Client, ) -> Result> { let vector_aggregator_address = if let Some(vector_aggregator_config_map_name) = @@ -90,7 +92,7 @@ pub async fn resolve_vector_aggregator_address( /// Extend the role group ConfigMap with logging and Vector configurations pub fn extend_role_group_config_map( - rolegroup: &RoleGroupRef, + rolegroup: &RoleGroupRef, vector_aggregator_address: Option<&str>, logging: &Logging, cm_builder: &mut ConfigMapBuilder, diff --git a/rust/operator-binary/src/security/opa.rs b/rust/operator-binary/src/security/opa.rs index 07c56113..ec6c4c9b 100644 --- a/rust/operator-binary/src/security/opa.rs +++ b/rust/operator-binary/src/security/opa.rs @@ -1,7 +1,8 @@ use snafu::{ResultExt, Snafu}; -use stackable_hbase_crd::{security::AuthorizationConfig, HbaseCluster}; use stackable_operator::{client::Client, commons::opa::OpaApiVersion}; +use crate::crd::{security::AuthorizationConfig, v1alpha1}; + const DEFAULT_DRY_RUN: bool = false; const DEFAULT_CACHE_ACTIVE: bool = true; const DEFAULT_CACHE_SECONDS: i32 = 5 * 60; // 5 minutes @@ -47,7 +48,7 @@ impl HbaseOpaConfig { } pub async fn from_opa_config( client: &Client, - hbase: &HbaseCluster, + hbase: &v1alpha1::HbaseCluster, authorization_config: &AuthorizationConfig, ) -> Result { let authorization_connection_string = authorization_config diff --git a/rust/operator-binary/src/zookeeper.rs b/rust/operator-binary/src/zookeeper.rs index e420c2ab..ba5e0949 100644 --- a/rust/operator-binary/src/zookeeper.rs +++ b/rust/operator-binary/src/zookeeper.rs @@ -1,13 +1,14 @@ use std::{collections::BTreeMap, num::ParseIntError}; use snafu::{OptionExt, ResultExt, Snafu}; -use stackable_hbase_crd::HbaseCluster; use stackable_operator::{ client::Client, k8s_openapi::api::core::v1::ConfigMap, kube::ResourceExt, }; use strum::{EnumDiscriminants, IntoStaticStr}; use tracing::warn; +use crate::crd::v1alpha1; + const ZOOKEEPER_DISCOVERY_CM_HOSTS_ENTRY: &str = "ZOOKEEPER_HOSTS"; const ZOOKEEPER_DISCOVERY_CM_CHROOT_ENTRY: &str = "ZOOKEEPER_CHROOT"; const ZOOKEEPER_DISCOVERY_CM_CLIENT_PORT_ENTRY: &str = "ZOOKEEPER_CLIENT_PORT"; @@ -18,7 +19,6 @@ const ZOOKEEPER_ZNODE_PARENT: &str = "zookeeper.znode.parent"; #[derive(Snafu, Debug, EnumDiscriminants)] #[strum_discriminants(derive(IntoStaticStr))] -#[allow(clippy::enum_variant_names)] pub enum Error { #[snafu(display("object defines no namespace"))] ObjectHasNoNamespace, @@ -53,7 +53,7 @@ pub struct ZookeeperConnectionInformation { } impl ZookeeperConnectionInformation { - pub async fn retrieve(hbase: &HbaseCluster, client: &Client) -> Result { + pub async fn retrieve(hbase: &v1alpha1::HbaseCluster, client: &Client) -> Result { let zk_discovery_cm_name = &hbase.spec.cluster_config.zookeeper_config_map_name; let mut zk_discovery_cm = client .get::(