From 5d3bb879364377a062d3007a8f54da538e11fc90 Mon Sep 17 00:00:00 2001 From: Techassi Date: Mon, 14 Sep 2026 13:19:06 +0200 Subject: [PATCH 1/5] feat: Support floating tag in product image selection --- Cargo.lock | 29 ++++++----- Cargo.nix | 51 ++++++++++++++----- Cargo.toml | 3 +- crate-hashes.json | 18 +++---- extra/crds.yaml | 42 +++++++++++++-- rust/operator-binary/Cargo.toml | 1 + .../src/controller/validate.rs | 2 +- rust/operator-binary/src/main.rs | 7 +++ 8 files changed, 113 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 159f1af..64f19ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -334,9 +334,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chacha20" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ "cfg-if", "cpufeatures 0.3.0", @@ -1720,7 +1720,7 @@ dependencies = [ [[package]] name = "k8s-version" version = "0.1.3" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "darling 0.24.0", "regex", @@ -2883,6 +2883,10 @@ name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -3173,7 +3177,7 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stackable-certs" version = "0.4.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "const-oid", "ecdsa", @@ -3204,6 +3208,7 @@ dependencies = [ "pretty_assertions", "regex", "rstest", + "semver", "serde", "serde_json", "serde_yaml", @@ -3217,8 +3222,8 @@ dependencies = [ [[package]] name = "stackable-operator" -version = "0.116.0" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +version = "0.118.0" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "base64 0.23.1", "clap", @@ -3262,7 +3267,7 @@ dependencies = [ [[package]] name = "stackable-operator-derive" version = "0.3.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "darling 0.24.0", "proc-macro2", @@ -3273,7 +3278,7 @@ dependencies = [ [[package]] name = "stackable-shared" version = "0.1.2" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "jiff", "k8s-openapi", @@ -3290,7 +3295,7 @@ dependencies = [ [[package]] name = "stackable-telemetry" version = "0.6.5" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "axum", "clap", @@ -3314,7 +3319,7 @@ dependencies = [ [[package]] name = "stackable-versioned" version = "0.11.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "kube", "schemars", @@ -3328,7 +3333,7 @@ dependencies = [ [[package]] name = "stackable-versioned-macros" version = "0.11.1" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "convert_case", "convert_case_extras", @@ -3346,7 +3351,7 @@ dependencies = [ [[package]] name = "stackable-webhook" version = "0.9.2" -source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#7b9f9ac9a76fa425ab27f2821377ef86571ca121" +source = "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1" dependencies = [ "arc-swap", "async-trait", diff --git a/Cargo.nix b/Cargo.nix index 1b5074b..be6afb3 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -1036,9 +1036,9 @@ rec { }; "chacha20" = rec { crateName = "chacha20"; - version = "0.10.1"; + version = "0.10.2"; edition = "2024"; - sha256 = "108aajbvs3rwl4d0pdvq3p8ydy4pwh0rxy2z265ynwkflrmla96m"; + sha256 = "01hvvbgdmqkcgs2s4f12s9wa5h2gbq05rqvypv61azlwd55mxhv5"; authors = [ "RustCrypto Developers" ]; @@ -5440,7 +5440,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; libName = "k8s_version"; @@ -9507,11 +9507,27 @@ rec { authors = [ "David Tolnay " ]; + dependencies = [ + { + name = "serde"; + packageId = "serde"; + optional = true; + usesDefaultFeatures = false; + target = { target, features }: false; + } + { + name = "serde_core"; + packageId = "serde_core"; + rename = "serde"; + optional = true; + usesDefaultFeatures = false; + } + ]; features = { "default" = [ "std" ]; "serde" = [ "dep:serde" ]; }; - resolvedDefaultFeatures = [ "default" "std" ]; + resolvedDefaultFeatures = [ "default" "serde" "std" ]; }; "serde" = rec { crateName = "serde"; @@ -10375,7 +10391,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; libName = "stackable_certs"; @@ -10500,6 +10516,10 @@ rec { name = "regex"; packageId = "regex"; } + { + name = "semver"; + packageId = "semver"; + } { name = "serde"; packageId = "serde"; @@ -10570,12 +10590,12 @@ rec { }; "stackable-operator" = rec { crateName = "stackable-operator"; - version = "0.116.0"; + version = "0.118.0"; edition = "2024"; workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; libName = "stackable_operator"; @@ -10667,6 +10687,7 @@ rec { { name = "semver"; packageId = "semver"; + features = [ "serde" ]; } { name = "serde"; @@ -10756,8 +10777,10 @@ rec { "client-feature-gates" = [ "dep:winnow" ]; "crds" = [ "dep:stackable-versioned" ]; "default" = [ "crds" ]; - "full" = [ "client-feature-gates" "crds" "certs" "test-support" "time" "webhook" "kube-ws" "kube-cel" ]; + "full" = [ "client-feature-gates" "crds" "certs" "test-support" "time" "webhook" "kube-ws" "kube-cel" "kube-http-proxy" "kube-socks5" ]; "kube-cel" = [ "kube/cel" ]; + "kube-http-proxy" = [ "kube/http-proxy" ]; + "kube-socks5" = [ "kube/socks5" ]; "kube-ws" = [ "kube/ws" ]; "time" = [ "stackable-shared/time" ]; "webhook" = [ "dep:stackable-webhook" ]; @@ -10771,7 +10794,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; procMacro = true; @@ -10806,7 +10829,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; libName = "stackable_shared"; @@ -10887,7 +10910,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; libName = "stackable_telemetry"; @@ -10997,7 +11020,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; libName = "stackable_versioned"; @@ -11047,7 +11070,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; procMacro = true; @@ -11115,7 +11138,7 @@ rec { workspace_member = null; src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; - rev = "7b9f9ac9a76fa425ab27f2821377ef86571ca121"; + rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; }; libName = "stackable_webhook"; diff --git a/Cargo.toml b/Cargo.toml index 7996f6f..a8a366b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ edition = "2024" repository = "https://github.com/stackabletech/opensearch-operator" [workspace.dependencies] -stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.116.0", features = ["webhook"] } +stackable-operator = { git = "https://github.com/stackabletech/operator-rs.git", tag = "stackable-operator-0.118.0", features = ["webhook"] } built = { version = "0.8", features = ["chrono", "git2"] } clap = "4.6" @@ -18,6 +18,7 @@ futures = { version = "0.3", features = ["compat"] } pretty_assertions = "1.4" regex = "1.12" rstest = "0.26" +semver = "1.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_yaml = "0.9" diff --git a/crate-hashes.json b/crate-hashes.json index 3fae0f9..fecf0ab 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -1,11 +1,11 @@ { - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#k8s-version@0.1.3": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#stackable-certs@0.4.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#stackable-operator-derive@0.3.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#stackable-operator@0.116.0": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#stackable-shared@0.1.2": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#stackable-telemetry@0.6.5": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#stackable-versioned-macros@0.11.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#stackable-versioned@0.11.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.116.0#stackable-webhook@0.9.2": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9" + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#k8s-version@0.1.3": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-certs@0.4.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-operator-derive@0.3.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-operator@0.118.0": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-shared@0.1.2": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-telemetry@0.6.5": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-versioned-macros@0.11.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-versioned@0.11.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-webhook@0.9.2": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9" } \ No newline at end of file diff --git a/extra/crds.yaml b/extra/crds.yaml index 294f3d6..ff92247 100644 --- a/extra/crds.yaml +++ b/extra/crds.yaml @@ -1213,12 +1213,13 @@ spec: description: Version of the product, e.g. `1.4.1`. type: string pullPolicy: - default: Always description: '[Pull policy](https://kubernetes.io/docs/concepts/containers/images/#image-pull-policy) used when pulling the image.' enum: - IfNotPresent - Always - Never + - null + nullable: true type: string pullSecrets: description: '[Image pull secrets](https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod) to pull images from a private registry.' @@ -1244,12 +1245,47 @@ spec: type: string stackableVersion: description: |- - Stackable version of the product, e.g. `23.4`, `23.4.1` or `0.0.0-dev`. + Stackable version of the product, e.g. `26.7.0` or `0.0.0-dev`. - If not specified, the operator will use its own version, e.g. `23.4.1`. When using a nightly + If not specified, the operator will use its own version, e.g. `26.7.1`. When using a nightly operator or a PR version, it will use the nightly `0.0.0-dev` image. + + If this is used in combination with `stackableVersionPolicy: LatestPatch`, the correct + floating tag is computed automatically, e.g. `26.7.0` becomes `26.7` for the product image. nullable: true type: string + stackableVersionPolicy: + default: Exact + description: |- + Configure the Stackable version policy. Defaults to `Exact`. + + Currently, two variants are supported: + + - `Exact`, which uses the exact, fully-qualified, canonical version of a product image. + - `LatestPatch`, referencing a floating tag which always points to the latest patch version + in the current release line. The current release line is either automatically derived by + the operator based on its own version, or can be overridden with `stackableVersion`. + + A potential newer image is only pulled when Pods are rotated or their containers are + restarted. Pods are NOT rotated and containers are NOT restarted automatically when a new + image is available. This behaviour makes this a passive update mechanism, rather than an + active one. + + It should be noted that when this field is set to `LatestPatch`, the operator automatically + uses `Always` as the pull policy for product images. If set to `Exact`, `IfNotPresent` is + used. Explicitly setting `pullPolicy` takes precedence. + + ### Examples + + - The `stackableVersion` field is not set, the operator falls back to its own version, eg. + 26.7.0. If this field is set to `LatestPatch`, the `26.7` floating tag will be used for + product images, else, `26.7.0` will be used. + - The `stackableVersion` field is set to `26.3.0`. If this field is set to `LatestPatch`, + the `26.3` floating tag will be used for product images, else, `26.3.0` will be used. + enum: + - Exact + - LatestPatch + type: string type: object nodes: description: |- diff --git a/rust/operator-binary/Cargo.toml b/rust/operator-binary/Cargo.toml index d2ca567..da432fb 100644 --- a/rust/operator-binary/Cargo.toml +++ b/rust/operator-binary/Cargo.toml @@ -21,6 +21,7 @@ stackable-operator.workspace = true clap.workspace = true futures.workspace = true regex.workspace = true +semver.workspace = true serde.workspace = true serde_json.workspace = true serde_yaml.workspace = true diff --git a/rust/operator-binary/src/controller/validate.rs b/rust/operator-binary/src/controller/validate.rs index e001c90..8e77abf 100644 --- a/rust/operator-binary/src/controller/validate.rs +++ b/rust/operator-binary/src/controller/validate.rs @@ -148,7 +148,7 @@ pub fn validate( .resolve( CONTAINER_IMAGE_BASE_NAME, &operator_environment.image_repository, - crate::built_info::PKG_VERSION, + &crate::built_info::PKG_VERSION_SEMVER, ) .context(ResolveProductImageSnafu)?; diff --git a/rust/operator-binary/src/main.rs b/rust/operator-binary/src/main.rs index 55c2d45..e1e30b0 100644 --- a/rust/operator-binary/src/main.rs +++ b/rust/operator-binary/src/main.rs @@ -40,7 +40,14 @@ mod crd; mod webhooks; mod built_info { + use std::{str::FromStr, sync::LazyLock}; + include!(concat!(env!("OUT_DIR"), "/built.rs")); + + pub static PKG_VERSION_SEMVER: LazyLock = LazyLock::new(|| { + semver::Version::from_str(PKG_VERSION) + .expect("PKG_VERSION must be able to be parsed as semver") + }); } type Result = std::result::Result; From e8cd7ff2147ecbbe33772401b21110059860e586 Mon Sep 17 00:00:00 2001 From: Techassi Date: Mon, 14 Sep 2026 13:21:04 +0200 Subject: [PATCH 2/5] chore: Add changelog entry --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8670694..2759bdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,13 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Support floating tag in product image selection ([#186]). + ### Changed -- Bump stackable-operator to 0.116.0 ([#166], [#171]). +- Bump stackable-operator to 0.118.0 ([#166], [#171], [#186]). - BREAKING: Remove the `app.kubernetes.io/version` label from the listener PVC templates of the StatefulSets (previously set to the product version). StatefulSets created by older operator versions cannot be updated in place: after the operator upgrade, delete each nodes StatefulSet @@ -26,6 +30,7 @@ All notable changes to this project will be documented in this file. [#171]: https://github.com/stackabletech/opensearch-operator/pull/171 [#172]: https://github.com/stackabletech/opensearch-operator/pull/172 [#179]: https://github.com/stackabletech/opensearch-operator/pull/179 +[#186]: https://github.com/stackabletech/opensearch-operator/pull/186 ## [26.7.0] - 2026-07-21 From c5292b62b7cf86f5d2a919a7655534077a8986da Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 15 Sep 2026 15:19:33 +0200 Subject: [PATCH 3/5] chore: Fix Nix files --- Cargo.nix | 18 +++++++++--------- crate-hashes.json | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.nix b/Cargo.nix index be6afb3..b16cfcf 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -5441,7 +5441,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; libName = "k8s_version"; authors = [ @@ -10392,7 +10392,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; libName = "stackable_certs"; authors = [ @@ -10596,7 +10596,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; libName = "stackable_operator"; authors = [ @@ -10795,7 +10795,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; procMacro = true; libName = "stackable_operator_derive"; @@ -10830,7 +10830,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; libName = "stackable_shared"; authors = [ @@ -10911,7 +10911,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; libName = "stackable_telemetry"; authors = [ @@ -11021,7 +11021,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; libName = "stackable_versioned"; authors = [ @@ -11071,7 +11071,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; procMacro = true; libName = "stackable_versioned_macros"; @@ -11139,7 +11139,7 @@ rec { src = pkgs.fetchgit { url = "https://github.com/stackabletech/operator-rs.git"; rev = "bc6c84025c2dcc834b94bfb57ec72810ae5f5eb1"; - sha256 = "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9"; + sha256 = "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci"; }; libName = "stackable_webhook"; authors = [ diff --git a/crate-hashes.json b/crate-hashes.json index fecf0ab..8357dcf 100644 --- a/crate-hashes.json +++ b/crate-hashes.json @@ -1,11 +1,11 @@ { - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#k8s-version@0.1.3": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-certs@0.4.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-operator-derive@0.3.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-operator@0.118.0": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-shared@0.1.2": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-telemetry@0.6.5": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-versioned-macros@0.11.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-versioned@0.11.1": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9", - "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-webhook@0.9.2": "1p3744fxgvs12sqwvi8hhainwrgvhdfwmbyqf0sp0aq3awq3q1v9" + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#k8s-version@0.1.3": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-certs@0.4.1": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-operator-derive@0.3.1": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-operator@0.118.0": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-shared@0.1.2": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-telemetry@0.6.5": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-versioned-macros@0.11.1": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-versioned@0.11.1": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci", + "git+https://github.com/stackabletech/operator-rs.git?tag=stackable-operator-0.118.0#stackable-webhook@0.9.2": "0cgziqra8097hp05ynib1qpw4c95n972f4w2rk9l3llyp8r1vmci" } \ No newline at end of file From c3ca4c46b04b00ed971483fcc5e21ecf6203dc09 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 15 Sep 2026 15:20:33 +0200 Subject: [PATCH 4/5] chore: Improve and add changelog entries --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2759bdb..1222524 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,16 @@ All notable changes to this project will be documented in this file. ### Added -- Support floating tag in product image selection ([#186]). +- Support floating tags for product images via the new `spec.image.stackableVersionPolicy` field + ([#186]). ### Changed - Bump stackable-operator to 0.118.0 ([#166], [#171], [#186]). +- BREAKING: `spec.image.stackableVersion` must now be a full, valid semver version, e.g. `26.7.1`. + Abbreviated values such as `26.7` are no longer accepted ([#186]). +- BREAKING: `spec.image.pullPolicy` now defaults to `IfNotPresent` for non-floating tags instead of + always defaulting to `Always` ([#186]). - BREAKING: Remove the `app.kubernetes.io/version` label from the listener PVC templates of the StatefulSets (previously set to the product version). StatefulSets created by older operator versions cannot be updated in place: after the operator upgrade, delete each nodes StatefulSet From 938d24ae39cb6b178899db68f08558574fc14663 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 15 Sep 2026 15:56:56 +0200 Subject: [PATCH 5/5] chore: Bump rustls to 0.23.45 to negate RUSTSEC-2026-0285 --- Cargo.lock | 20 ++++++++++---------- Cargo.nix | 25 +++++++++++++------------ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 64f19ca..068d56d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -316,9 +316,9 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" -version = "1.4.1" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9066c49992464636f92905fa096ec58baaa4d57ec19a5c096c68d3e25ef3d136" +checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" dependencies = [ "find-msvc-tools", "jobserver", @@ -916,9 +916,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" [[package]] name = "flagset" @@ -1913,9 +1913,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "matchers" @@ -2698,9 +2698,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.43" +version = "0.23.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" dependencies = [ "log", "once_cell", @@ -2761,9 +2761,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" dependencies = [ "ring", "rustls-pki-types", diff --git a/Cargo.nix b/Cargo.nix index b16cfcf..5a438e4 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -989,9 +989,9 @@ rec { }; "cc" = rec { crateName = "cc"; - version = "1.4.1"; + version = "1.4.6"; edition = "2021"; - sha256 = "0dniydgf5lv8dh4mr6n1gvas9albqmp0kyh557wkcij6jacw8rlh"; + sha256 = "1x7za83rw7kd1vmpcc3bsfzp4zzazpr6n7w2i8zxqq63sr10zsx3"; dependencies = [ { name = "find-msvc-tools"; @@ -2804,9 +2804,9 @@ rec { }; "find-msvc-tools" = rec { crateName = "find-msvc-tools"; - version = "0.1.10"; + version = "0.1.12"; edition = "2021"; - sha256 = "1pp1612g5k6im9732g16j6a87czhb35xcyzlrpq2mkgdwrrkbdr6"; + sha256 = "0bcxgbc8g33fkpzx71ws9307ad2jyxsm35my1bc6zikj79y1q3ry"; libName = "find_msvc_tools"; }; @@ -6254,9 +6254,9 @@ rec { }; "log" = rec { crateName = "log"; - version = "0.4.33"; + version = "0.4.34"; edition = "2021"; - sha256 = "1bd9dmk22pxgnf0h0slba6rz99zb0a0b2mdhpk8p92bp26ycbvhc"; + sha256 = "1ihkzn0m33ab79fcl4mkb04n5iwqzbxzyw7l7hazqkffaqzbvy7r"; authors = [ "The Rust Project Developers" ]; @@ -6270,11 +6270,12 @@ rec { "kv_unstable_sval" = [ "kv_sval" "kv_unstable" ]; "serde" = [ "serde_core" ]; "serde_core" = [ "dep:serde_core" ]; + "std" = [ "alloc" ]; "sval" = [ "dep:sval" ]; "sval_ref" = [ "dep:sval_ref" ]; "value-bag" = [ "dep:value-bag" ]; }; - resolvedDefaultFeatures = [ "std" ]; + resolvedDefaultFeatures = [ "alloc" "std" ]; }; "matchers" = rec { crateName = "matchers"; @@ -8870,9 +8871,9 @@ rec { }; "rustls" = rec { crateName = "rustls"; - version = "0.23.43"; + version = "0.23.45"; edition = "2021"; - sha256 = "01nsagj78r88pifaz55ln1rw31py5n00h7bnw58h3g1aw1n3i0q2"; + sha256 = "0d6n90q52x5cjyxb6bwcnf9hwg6yb31cwr63rk8n5yfjqwqxfh8d"; dependencies = [ { name = "log"; @@ -9125,9 +9126,9 @@ rec { }; "rustls-webpki" = rec { crateName = "rustls-webpki"; - version = "0.103.13"; + version = "0.103.15"; edition = "2021"; - sha256 = "0vkm7z9pnxz5qz66p2kmyy2pwx0g4jnsbqk5xzfhs4czcjl2ki31"; + sha256 = "1hhanq3lz384v4nccacnjfwsyy99n3yc6m6iw8kljz8yicfwzhzk"; libName = "webpki"; dependencies = [ { @@ -9151,7 +9152,7 @@ rec { "alloc" = [ "ring?/alloc" "pki-types/alloc" ]; "aws-lc-rs" = [ "dep:aws-lc-rs" "aws-lc-rs/aws-lc-sys" "aws-lc-rs/prebuilt-nasm" ]; "aws-lc-rs-fips" = [ "dep:aws-lc-rs" "aws-lc-rs/fips" ]; - "aws-lc-rs-unstable" = [ "aws-lc-rs" "aws-lc-rs/unstable" ]; + "aws-lc-rs-unstable" = [ "aws-lc-rs" ]; "default" = [ "std" ]; "ring" = [ "dep:ring" ]; "std" = [ "alloc" "pki-types/std" ];