mz_testdrive/action/kafka/
wait_topic.rs1use std::time::Duration;
11
12use mz_ore::retry::Retry;
13
14use crate::action::{ControlFlow, State};
15use crate::parser::BuiltinCommand;
16
17pub async fn run_wait_topic(
18 mut cmd: BuiltinCommand,
19 state: &State,
20) -> Result<ControlFlow, anyhow::Error> {
21 let topic = cmd.args.string("topic")?;
22 cmd.args.done()?;
23
24 println!("Waiting for Kafka topic {} to exist", topic);
25 Retry::default()
26 .initial_backoff(Duration::from_millis(50))
27 .factor(1.5)
28 .max_duration(state.timeout)
29 .retry_async_canceling(|_| async { check_topic_exists(&topic, &*state).await })
30 .await?;
31
32 Ok(ControlFlow::Continue)
33}
34
35pub(crate) async fn check_topic_exists(topic: &str, state: &State) -> Result<(), anyhow::Error> {
36 let metadata = state
37 .kafka_admin
38 .inner()
39 .fetch_metadata(None, Some(Duration::from_secs(10)))?;
45
46 let topic_exists = metadata.topics().iter().any(|t| t.name() == topic);
47 if !topic_exists {
48 Err(anyhow::anyhow!("topic {} doesn't exist", topic))
49 } else {
50 Ok(())
51 }
52}