From 506657020a5cc1b00fa3d25e1196bc586f3fa422 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 3 Feb 2026 11:47:48 +0100 Subject: [PATCH 1/4] fix: automatic metadata manager detection --- rust/operator-binary/src/crd/mod.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index fcfc50b1..f272b9f3 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -263,7 +263,7 @@ impl v1alpha1::KafkaCluster { _ => Ok(MetadataManager::KRaft), }, None => { - if self.spec.image.product_version().starts_with("4\\.") { + if self.spec.image.product_version().starts_with("4.") { Ok(MetadataManager::KRaft) } else { Ok(MetadataManager::ZooKeeper) @@ -686,4 +686,31 @@ mod tests { tls::internal_tls_default() ); } + + #[test] + fn test_effective_metadata_manager() { + let input = r#" + apiVersion: kafka.stackable.tech/v1alpha1 + kind: KafkaCluster + metadata: + name: kafka + spec: + image: + productVersion: 4.1.1 + controllers: + roleGroups: + default: + replicas: 1 + brokers: + roleGroups: + default: + replicas: 1 + "#; + let kafka: v1alpha1::KafkaCluster = + serde_yaml::from_str(input).expect("illegal test input"); + assert_eq!( + kafka.effective_metadata_manager().unwrap(), + MetadataManager::KRaft + ); + } } From f6685a85819b678555e0d05188d60ad6daf91094 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 3 Feb 2026 12:29:35 +0100 Subject: [PATCH 2/4] change test predicate and update tests --- rust/operator-binary/src/crd/mod.rs | 65 ++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index f272b9f3..a73b02e4 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -254,7 +254,7 @@ impl v1alpha1::KafkaCluster { match &self.spec.cluster_config.metadata_manager { Some(manager) => match manager.clone() { MetadataManager::ZooKeeper => { - if self.spec.image.product_version().starts_with("4\\.") { + if !self.spec.image.product_version().starts_with("3.") { Err(Error::Kafka4RequiresKraftMetadataManager) } else { Ok(MetadataManager::ZooKeeper) @@ -263,10 +263,10 @@ impl v1alpha1::KafkaCluster { _ => Ok(MetadataManager::KRaft), }, None => { - if self.spec.image.product_version().starts_with("4.") { - Ok(MetadataManager::KRaft) - } else { + if self.spec.image.product_version().starts_with("3.") { Ok(MetadataManager::ZooKeeper) + } else { + Ok(MetadataManager::KRaft) } } } @@ -508,6 +508,8 @@ pub enum MetadataManager { #[cfg(test)] mod tests { + use rstest::rstest; + use super::*; fn get_server_secret_class(kafka: &v1alpha1::KafkaCluster) -> Option { @@ -687,16 +689,35 @@ mod tests { ); } - #[test] - fn test_effective_metadata_manager() { - let input = r#" + #[rstest] + #[case("3.9.1", None, Ok(MetadataManager::ZooKeeper))] + #[case( + "3.9.1", + Some(MetadataManager::ZooKeeper), + Ok(MetadataManager::ZooKeeper) + )] + #[case("3.9.1", Some(MetadataManager::KRaft), Ok(MetadataManager::KRaft))] + #[case("4,1,1", None, Ok(MetadataManager::KRaft))] + #[case( + "4,1,1", + Some(MetadataManager::ZooKeeper), + Err(Error::Kafka4RequiresKraftMetadataManager) + )] + #[case("4.1.1", Some(MetadataManager::KRaft), Ok(MetadataManager::KRaft))] + fn test_effective_metadata_manager_kraft( + #[case] product_version: &str, + #[case] metadata_manager: Option, + #[case] expected: Result, + ) { + let input = format!( + r#" apiVersion: kafka.stackable.tech/v1alpha1 kind: KafkaCluster metadata: name: kafka spec: image: - productVersion: 4.1.1 + productVersion: {product_version} controllers: roleGroups: default: @@ -705,12 +726,28 @@ mod tests { roleGroups: default: replicas: 1 - "#; - let kafka: v1alpha1::KafkaCluster = - serde_yaml::from_str(input).expect("illegal test input"); - assert_eq!( - kafka.effective_metadata_manager().unwrap(), - MetadataManager::KRaft + "# ); + let mut kafka: v1alpha1::KafkaCluster = + serde_yaml::from_str(&input).expect("illegal test input"); + + if metadata_manager.is_some() { + kafka.spec.cluster_config.metadata_manager = metadata_manager; + } + + match kafka.effective_metadata_manager() { + Ok(manager) => match expected { + Ok(expected_manager) => assert_eq!(manager, expected_manager), + Err(_) => { + panic!("expected error but got metadata manager : {}", manager) + } + }, + Err(err) => match expected { + Ok(_) => panic!("expected Ok but got error: {}", err), + Err(expected_err) => { + assert_eq!(format!("{}", err), format!("{}", expected_err)) + } + }, + }; } } From caebdc498d34817444e64c17b7017aa4d80d4a64 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 3 Feb 2026 12:51:23 +0100 Subject: [PATCH 3/4] argh --- rust/operator-binary/src/crd/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index a73b02e4..b1754b57 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -697,14 +697,14 @@ mod tests { Ok(MetadataManager::ZooKeeper) )] #[case("3.9.1", Some(MetadataManager::KRaft), Ok(MetadataManager::KRaft))] - #[case("4,1,1", None, Ok(MetadataManager::KRaft))] + #[case("4.1.1", None, Ok(MetadataManager::KRaft))] #[case( - "4,1,1", + "4.1.1", Some(MetadataManager::ZooKeeper), Err(Error::Kafka4RequiresKraftMetadataManager) )] #[case("4.1.1", Some(MetadataManager::KRaft), Ok(MetadataManager::KRaft))] - fn test_effective_metadata_manager_kraft( + fn test_effective_metadata_manager( #[case] product_version: &str, #[case] metadata_manager: Option, #[case] expected: Result, From 2fe499a4461ca4d14ea74c673bffeea0b6c24524 Mon Sep 17 00:00:00 2001 From: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> Date: Tue, 3 Feb 2026 12:54:00 +0100 Subject: [PATCH 4/4] update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b6d5799..3bb0c05f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ All notable changes to this project will be documented in this file. ### Changed - Refactor: move server configuration properties from the command line to configuration files. ([#911]). -- Add support for ZooKeeper to KRaft migration ([#923]). +- Add support for ZooKeeper to KRaft migration ([#923]), ([#933]). - Bump testing-tools to `0.3.0-stackable0.0.0-dev` ([#925]). ### Removed @@ -34,6 +34,7 @@ All notable changes to this project will be documented in this file. [#929]: https://github.com/stackabletech/kafka-operator/pull/929 [#930]: https://github.com/stackabletech/kafka-operator/pull/930 [#932]: https://github.com/stackabletech/kafka-operator/pull/932 +[#933]: https://github.com/stackabletech/kafka-operator/pull/933 ## [25.11.0] - 2025-11-07