Skip to content

Commit e712409

Browse files
committed
test: cover the build() aggregator's resource output
1 parent 6c06c70 commit e712409

1 file changed

Lines changed: 146 additions & 0 deletions

File tree

  • rust/operator-binary/src/controller/build

rust/operator-binary/src/controller/build/mod.rs

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,3 +158,149 @@ pub fn build(
158158
pod_disruption_budgets,
159159
})
160160
}
161+
162+
#[cfg(test)]
163+
mod tests {
164+
use stackable_operator::kube::Resource;
165+
166+
use super::build;
167+
use crate::controller::{
168+
ValidatedCluster,
169+
test_support::{minimal_kafka, validated_cluster},
170+
};
171+
172+
/// Sorted `metadata.name`s of the given resources, for order-independent assertions.
173+
fn sorted_names(resources: &[impl Resource]) -> Vec<&str> {
174+
let mut names: Vec<&str> = resources
175+
.iter()
176+
.filter_map(|resource| resource.meta().name.as_deref())
177+
.collect();
178+
names.sort();
179+
names
180+
}
181+
182+
/// A KRaft cluster with one `broker` and one `controller` role group, resolved through the real
183+
/// validate step (mirroring the other build fixtures), since [`ValidatedCluster`] carries
184+
/// several resolved types that are impractical to construct by hand.
185+
fn kraft_cluster() -> ValidatedCluster {
186+
let kafka = minimal_kafka(
187+
r#"
188+
apiVersion: kafka.stackable.tech/v1alpha1
189+
kind: KafkaCluster
190+
metadata:
191+
name: simple-kafka
192+
namespace: default
193+
uid: 12345678-1234-1234-1234-123456789012
194+
spec:
195+
image:
196+
productVersion: 3.9.2
197+
clusterConfig:
198+
metadataManager: kraft
199+
controllers:
200+
roleGroups:
201+
default:
202+
replicas: 3
203+
brokers:
204+
roleGroups:
205+
default:
206+
replicas: 3
207+
"#,
208+
);
209+
validated_cluster(&kafka)
210+
}
211+
212+
/// A ZooKeeper-mode cluster with a single `broker` role group (no controllers).
213+
fn zookeeper_cluster() -> ValidatedCluster {
214+
let kafka = minimal_kafka(
215+
r#"
216+
apiVersion: kafka.stackable.tech/v1alpha1
217+
kind: KafkaCluster
218+
metadata:
219+
name: simple-kafka
220+
namespace: default
221+
uid: 12345678-1234-1234-1234-123456789012
222+
spec:
223+
image:
224+
productVersion: 3.9.2
225+
clusterConfig:
226+
zookeeperConfigMapName: xyz
227+
brokers:
228+
roleGroups:
229+
default:
230+
replicas: 1
231+
"#,
232+
);
233+
validated_cluster(&kafka)
234+
}
235+
236+
#[test]
237+
fn build_produces_expected_resource_names() {
238+
let cluster = kraft_cluster();
239+
let resources = build(&cluster, "simple-kafka-serviceaccount").expect("build succeeds");
240+
241+
// One StatefulSet per role group.
242+
assert_eq!(
243+
sorted_names(&resources.stateful_sets),
244+
[
245+
"simple-kafka-broker-default",
246+
"simple-kafka-controller-default"
247+
]
248+
);
249+
// One rolegroup ConfigMap per role group.
250+
assert_eq!(
251+
sorted_names(&resources.config_maps),
252+
[
253+
"simple-kafka-broker-default",
254+
"simple-kafka-controller-default"
255+
]
256+
);
257+
// One headless and one metrics Service per role group.
258+
assert_eq!(
259+
sorted_names(&resources.services),
260+
[
261+
"simple-kafka-broker-default-headless",
262+
"simple-kafka-broker-default-metrics",
263+
"simple-kafka-controller-default-headless",
264+
"simple-kafka-controller-default-metrics",
265+
]
266+
);
267+
// Only broker role groups get a bootstrap Listener.
268+
assert_eq!(
269+
sorted_names(&resources.listeners),
270+
["simple-kafka-broker-default-bootstrap"]
271+
);
272+
// A default PodDisruptionBudget per role.
273+
assert_eq!(
274+
sorted_names(&resources.pod_disruption_budgets),
275+
["simple-kafka-broker", "simple-kafka-controller"]
276+
);
277+
}
278+
279+
/// ZooKeeper mode has no `controller` role, so `build()` emits no controller resources while
280+
/// still producing the broker's bootstrap Listener.
281+
#[test]
282+
fn build_zookeeper_mode_has_no_controller_resources() {
283+
let cluster = zookeeper_cluster();
284+
let resources = build(&cluster, "simple-kafka-serviceaccount").expect("build succeeds");
285+
286+
assert_eq!(
287+
sorted_names(&resources.stateful_sets),
288+
["simple-kafka-broker-default"]
289+
);
290+
assert_eq!(
291+
sorted_names(&resources.services),
292+
[
293+
"simple-kafka-broker-default-headless",
294+
"simple-kafka-broker-default-metrics",
295+
]
296+
);
297+
assert_eq!(
298+
sorted_names(&resources.listeners),
299+
["simple-kafka-broker-default-bootstrap"]
300+
);
301+
assert_eq!(
302+
sorted_names(&resources.pod_disruption_budgets),
303+
["simple-kafka-broker"]
304+
);
305+
}
306+
}

0 commit comments

Comments
 (0)