From ba9ada05083fe04e20a1581a16cae9988a5ed56f Mon Sep 17 00:00:00 2001 From: khartld <144441108+khartld@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:52:18 +0100 Subject: [PATCH 1/4] Fix advertised broker ip port 9092 is not exposed to the host, so we can not connect to it via host ip, but need to use the broker container ip --- modules/kafka/kafka.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/kafka/kafka.go b/modules/kafka/kafka.go index 399f17fb70..dff865bed6 100644 --- a/modules/kafka/kafka.go +++ b/modules/kafka/kafka.go @@ -72,12 +72,17 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize return err } + ip, err := c.ContainerIP(ctx) + if err != nil { + return err + } + port, err := c.MappedPort(ctx, publicPort) if err != nil { return err } - scriptContent := fmt.Sprintf(starterScriptContent, host, port.Int(), host) + scriptContent := fmt.Sprintf(starterScriptContent, host, port.Int(), ip) return c.CopyToContainer(ctx, []byte(scriptContent), starterScript, 0o755) }, From 459e58d0af45b83b370b3393b4d473314d6de25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 5 Apr 2024 17:11:34 -0600 Subject: [PATCH 2/4] Add fn to fetch the hostname --- container.go | 1 + docker.go | 9 +++++++++ modules/kafka/kafka.go | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/container.go b/container.go index 249aff32cf..761cd4fea1 100644 --- a/container.go +++ b/container.go @@ -62,6 +62,7 @@ type Container interface { CopyFileToContainer(ctx context.Context, hostFilePath string, containerFilePath string, fileMode int64) error CopyFileFromContainer(ctx context.Context, filePath string) (io.ReadCloser, error) GetLogProductionErrorChannel() <-chan error + Hostname(ctx context.Context) (string, error) } // ImageBuildInfo defines what is needed to build an image diff --git a/docker.go b/docker.go index ec703ac913..e4e37ddb69 100644 --- a/docker.go +++ b/docker.go @@ -392,6 +392,15 @@ func (c *DockerContainer) Name(ctx context.Context) (string, error) { return inspect.Name, nil } +// Hostname gets the name of the container. +func (c *DockerContainer) Hostname(ctx context.Context) (string, error) { + inspect, err := c.inspectContainer(ctx) + if err != nil { + return "", err + } + return inspect.Config.Hostname, nil +} + // State returns container's running state func (c *DockerContainer) State(ctx context.Context) (*types.ContainerState, error) { inspect, err := c.inspectRawContainer(ctx) diff --git a/modules/kafka/kafka.go b/modules/kafka/kafka.go index dff865bed6..df200cbf09 100644 --- a/modules/kafka/kafka.go +++ b/modules/kafka/kafka.go @@ -72,7 +72,7 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize return err } - ip, err := c.ContainerIP(ctx) + hostname, err := c.Hostname(ctx) if err != nil { return err } @@ -82,7 +82,7 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize return err } - scriptContent := fmt.Sprintf(starterScriptContent, host, port.Int(), ip) + scriptContent := fmt.Sprintf(starterScriptContent, host, port.Int(), hostname) return c.CopyToContainer(ctx, []byte(scriptContent), starterScript, 0o755) }, From c38bbc1df92335ffd5dea017d79adcbe9978305a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Tue, 7 May 2024 17:47:29 +0200 Subject: [PATCH 3/4] chore: use the new Inspect method instead --- container.go | 1 - docker.go | 9 --------- modules/kafka/kafka.go | 4 +++- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/container.go b/container.go index dcf3fbeb73..99af536cd6 100644 --- a/container.go +++ b/container.go @@ -63,7 +63,6 @@ type Container interface { CopyFileToContainer(ctx context.Context, hostFilePath string, containerFilePath string, fileMode int64) error CopyFileFromContainer(ctx context.Context, filePath string) (io.ReadCloser, error) GetLogProductionErrorChannel() <-chan error - Hostname(ctx context.Context) (string, error) } // ImageBuildInfo defines what is needed to build an image diff --git a/docker.go b/docker.go index 58c1d4553c..e188c25df2 100644 --- a/docker.go +++ b/docker.go @@ -405,15 +405,6 @@ func (c *DockerContainer) Name(ctx context.Context) (string, error) { return inspect.Name, nil } -// Hostname gets the name of the container. -func (c *DockerContainer) Hostname(ctx context.Context) (string, error) { - inspect, err := c.Inspect(ctx) - if err != nil { - return "", err - } - return inspect.Config.Hostname, nil -} - // State returns container's running state. This method does not use the cache // and always fetches the latest state from the Docker daemon. func (c *DockerContainer) State(ctx context.Context) (*types.ContainerState, error) { diff --git a/modules/kafka/kafka.go b/modules/kafka/kafka.go index b2ddea9b08..34758e8824 100644 --- a/modules/kafka/kafka.go +++ b/modules/kafka/kafka.go @@ -72,11 +72,13 @@ func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomize return err } - hostname, err := c.Hostname(ctx) + inspect, err := c.Inspect(ctx) if err != nil { return err } + hostname := inspect.Config.Hostname + port, err := c.MappedPort(ctx, publicPort) if err != nil { return err From f4991bab4bbabc79f4d99be25ed155ac14c93a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Wed, 8 May 2024 08:05:08 +0200 Subject: [PATCH 4/4] chore: add test --- modules/kafka/kafka_test.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/modules/kafka/kafka_test.go b/modules/kafka/kafka_test.go index 662bb5d0a8..16b8b76355 100644 --- a/modules/kafka/kafka_test.go +++ b/modules/kafka/kafka_test.go @@ -2,6 +2,7 @@ package kafka_test import ( "context" + "io" "strings" "testing" @@ -28,6 +29,8 @@ func TestKafka(t *testing.T) { } }) + assertAdvertisedListeners(t, kafkaContainer) + if !strings.EqualFold(kafkaContainer.ClusterID, "kraftCluster") { t.Fatalf("expected clusterID to be %s, got %s", "kraftCluster", kafkaContainer.ClusterID) } @@ -93,3 +96,32 @@ func TestKafka_invalidVersion(t *testing.T) { t.Fatal(err) } } + +// assertAdvertisedListeners checks that the advertised listeners are set correctly: +// - The BROKER:// protocol is using the hostname of the Kafka container +func assertAdvertisedListeners(t *testing.T, container testcontainers.Container) { + inspect, err := container.Inspect(context.Background()) + if err != nil { + t.Fatal(err) + } + + hostname := inspect.Config.Hostname + + code, r, err := container.Exec(context.Background(), []string{"cat", "/usr/sbin/testcontainers_start.sh"}) + if err != nil { + t.Fatal(err) + } + + if code != 0 { + t.Fatalf("expected exit code to be 0, got %d", code) + } + + bs, err := io.ReadAll(r) + if err != nil { + t.Fatal(err) + } + + if !strings.Contains(string(bs), "BROKER://"+hostname+":9092") { + t.Fatalf("expected advertised listeners to contain %s, got %s", "BROKER://"+hostname+":9092", string(bs)) + } +}