diff --git a/src/Testcontainers.Kafka/ApacheConfiguration.cs b/src/Testcontainers.Kafka/ApacheConfiguration.cs index 3e8d68868..de4629c20 100644 --- a/src/Testcontainers.Kafka/ApacheConfiguration.cs +++ b/src/Testcontainers.Kafka/ApacheConfiguration.cs @@ -50,12 +50,15 @@ public void Validate(KafkaConfiguration resourceConfiguration) /// public string CreateStartupScript(KafkaConfiguration resourceConfiguration, KafkaContainer container) { - var additionalAdvertisedListeners = string.Join(",", container.AdvertisedListeners ?? Array.Empty()); + var advertisedListeners = new List(); + advertisedListeners.Add("PLAINTEXT://" + container.Hostname + ":" + container.GetMappedPublicPort(KafkaBuilder.KafkaPort)); + advertisedListeners.Add("BROKER://" + container.IpAddress + ":" + KafkaBuilder.BrokerPort); + advertisedListeners.AddRange(container.AdvertisedListeners ?? Array.Empty()); var startupScript = new StringWriter(); startupScript.NewLine = "\n"; startupScript.WriteLine("#!/bin/bash"); - startupScript.WriteLine("export KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://" + container.Hostname + ":" + container.GetMappedPublicPort(KafkaBuilder.KafkaPort) + ",BROKER://" + container.IpAddress + ":" + KafkaBuilder.BrokerPort + "," + additionalAdvertisedListeners); + startupScript.WriteLine("export KAFKA_ADVERTISED_LISTENERS=" + string.Join(",", advertisedListeners)); startupScript.WriteLine("exec /etc/kafka/docker/run"); return startupScript.ToString(); } diff --git a/src/Testcontainers.Kafka/ConfluentConfiguration.cs b/src/Testcontainers.Kafka/ConfluentConfiguration.cs index f2e584710..27c63f98c 100644 --- a/src/Testcontainers.Kafka/ConfluentConfiguration.cs +++ b/src/Testcontainers.Kafka/ConfluentConfiguration.cs @@ -49,7 +49,10 @@ public void Validate(KafkaConfiguration resourceConfiguration) /// public string CreateStartupScript(KafkaConfiguration resourceConfiguration, KafkaContainer container) { - var additionalAdvertisedListeners = string.Join(",", container.AdvertisedListeners ?? Array.Empty()); + var advertisedListeners = new List(); + advertisedListeners.Add("PLAINTEXT://" + container.Hostname + ":" + container.GetMappedPublicPort(KafkaBuilder.KafkaPort)); + advertisedListeners.Add("BROKER://" + container.IpAddress + ":" + KafkaBuilder.BrokerPort); + advertisedListeners.AddRange(container.AdvertisedListeners ?? Array.Empty()); var isZooKeeperConsensus = resourceConfiguration.ConsensusProtocol == ConsensusProtocol.ZooKeeper; @@ -68,7 +71,7 @@ public string CreateStartupScript(KafkaConfiguration resourceConfiguration, Kafk startupScript.WriteLine("zookeeper-server-start zookeeper.properties &"); } - startupScript.WriteLine("export KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://" + container.Hostname + ":" + container.GetMappedPublicPort(KafkaBuilder.KafkaPort) + ",BROKER://" + container.IpAddress + ":" + KafkaBuilder.BrokerPort + "," + additionalAdvertisedListeners); + startupScript.WriteLine("export KAFKA_ADVERTISED_LISTENERS=" + string.Join(",", advertisedListeners)); startupScript.WriteLine("exec /etc/confluent/docker/run"); return startupScript.ToString(); } diff --git a/tests/Testcontainers.Kafka.Tests/Dockerfile b/tests/Testcontainers.Kafka.Tests/Dockerfile index 78378f63b..a62f8f15c 100644 --- a/tests/Testcontainers.Kafka.Tests/Dockerfile +++ b/tests/Testcontainers.Kafka.Tests/Dockerfile @@ -1,3 +1,4 @@ FROM confluentinc/cp-kafka:7.5.12@sha256:997883c60e6f1207fb5f779c7a8fdae57312a17f446fd5ea3eb8b73f52d4a1cf +FROM confluentinc/cp-kafka:8.2.4@sha256:58e544adba6a825389ab56dad5f8a1c72d9bbcdcf077e275473f1aff22e2cd76 AS confluent-v8_2_4 FROM apache/kafka:4.1.1@sha256:0bc1bb2478f45b6cea78864df86acdc11e8df2c5172477819a4d12942cbe5d40 AS apache-v4_1_1 FROM apache/kafka-native:4.1.1@sha256:b8faca36f5385f90e46861ea0b2f532ebed86e9b2868b717c75a67f6fda0c7ce AS apache-native-v4_1_1 \ No newline at end of file diff --git a/tests/Testcontainers.Kafka.Tests/KafkaContainerTest.cs b/tests/Testcontainers.Kafka.Tests/KafkaContainerTest.cs index a46d07da6..b1ce060f3 100644 --- a/tests/Testcontainers.Kafka.Tests/KafkaContainerTest.cs +++ b/tests/Testcontainers.Kafka.Tests/KafkaContainerTest.cs @@ -96,6 +96,20 @@ public KafkaZooKeeperConfiguration() } } + // Confluent Platform 8.x runs on Kafka 4.x, which rejects empty elements in + // `advertised.listeners`. A trailing comma made the container exit on startup: + // https://github.com/testcontainers/testcontainers-dotnet/issues/1771. + [UsedImplicitly] + public sealed class ConfluentKafkaV8Configuration : KafkaContainerTest + { + public ConfluentKafkaV8Configuration() + : base(new KafkaBuilder(TestSession.GetImageFromDockerfile(stage: "confluent-v8_2_4")) + .WithKRaft() + .Build()) + { + } + } + [UsedImplicitly] public sealed class ApacheKafkaConfiguration : KafkaContainerTest {