Repository: testcontainers/testcontainers-go
Pull request #3094: feat(aerospike): add Aerospike module
Author: login: MitulShah1
Labels: name: enhancement
description: New feature or request
Created: 2025-04-10T15:38:23Z | Merged: 2025-04-11T12:13:17Z

This PR adds [AeroSpike](https://aerospike.com/) as a module for 

## What does this PR do?

<!-- Mandatory
Explain here the changes you made on the PR. Please explain the WHAT: patterns used, algorithms implemented, design architecture, etc.
-->

## Why is it important?

<!-- Mandatory
Explain here the WHY, or the rationale/motivation for the changes.
-->

## Related issues

<!-- Recommended
Link related issues below. Insert the issue link or reference after the word "Closes" if merging this should automatically close it.

- Closes #123
- Relates #123
- Requires #123
- Supersedes #123
-->
- 

<!-- Recommended
## How to test this PR

Explain here how this PR will be tested by the reviewer: commands, dependencies, steps, etc.
-->


<!-- Optional
## Follow-ups

Add here any thought that you consider could be identified as an actionable step once this PR is merged.
-->

@stevenh  @eddumelendez  would appreciate review PR



Diff:
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 2efaedd40a..22ef0f554e 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -16,6 +16,7 @@ updates:
         - /examples/nginx
         - /examples/toxiproxy
         - /modulegen
+        - /modules/aerospike
         - /modules/arangodb
         - /modules/artemis
         - /modules/azure
diff --git a/docs/modules/aerospike.md b/docs/modules/aerospike.md
new file mode 100644
index 0000000000..e88f6efb29
--- /dev/null
+++ b/docs/modules/aerospike.md
@@ -0,0 +1,56 @@
+# Aerospike
+
+Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+## Introduction
+
+The Testcontainers module for Aerospike.
+
+## Adding this module to your project dependencies
+
+Please run the following command to add the Aerospike module to your Go dependencies:
+
+```
+go get github.com/testcontainers/testcontainers-go/modules/aerospike
+```
+
+## Usage example
+
+<!--codeinclude-->
+[Creating a Aerospike container](../../modules/aerospike/examples_test.go) inside_block:runAerospikeContainer
+<!--/codeinclude-->
+
+## Module Reference
+
+### Run function
+
+- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+The Aerospike module exposes one entrypoint function to create the Aerospike container, and this function receives three parameters:
+
+```golang
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error)
+```
+
+- `context.Context`, the Go context.
+- `string`, the Docker image to use.
+- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
+
+### Container Options
+
+When starting the Aerospike container, you can pass options in a variadic way to configure it.
+
+#### Image
+
+Use the second argument in the `Run` function to set a valid Docker image.
+In example: `Run(context.Background(), "aerospike/aerospike-server:latest")`.
+
+{% include "../features/common_functional_options.md" %}
+
+## Examples
+
+### Aerospike Client
+
+<!--codeinclude-->
+[Aerospike Client](../../modules/aerospike/examples_test.go) inside_block:usingClient
+<!--/codeinclude-->
diff --git a/mkdocs.yml b/mkdocs.yml
index e4a3ad5efc..44bf2f2672 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -68,6 +68,7 @@ nav:
             - Walk: features/wait/walk.md
     - Modules:
         - modules/index.md
+        - modules/aerospike.md
         - modules/arangodb.md
         - modules/artemis.md
         - modules/azure.md
diff --git a/modules/aerospike/Makefile b/modules/aerospike/Makefile
new file mode 100644
index 0000000000..d125eb29df
--- /dev/null
+++ b/modules/aerospike/Makefile
@@ -0,0 +1,5 @@
+include ../../commons-test.mk
+
+.PHONY: test
+test:
+	$(MAKE) test-aerospike
diff --git a/modules/aerospike/aerospike.go b/modules/aerospike/aerospike.go
new file mode 100644
index 0000000000..ad15b4b601
--- /dev/null
+++ b/modules/aerospike/aerospike.go
@@ -0,0 +1,68 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	// port is the port used for client connections
+	port = "3000/tcp"
+	// fabricPort is the port used for Intra-cluster communication port.
+	// Replica writes, migrations, and other node-to-node communications use the Fabric port.
+	fabricPort = "3001/tcp"
+	// heartbeatPort is the port used for heartbeat communication
+	// between nodes in the Aerospike cluster
+	heartbeatPort = "3002/tcp"
+	// infoPort is the port used for info commands
+	infoPort = "3003/tcp"
+)
+
+// Container is the Aerospike container type used in the module
+type Container struct {
+	testcontainers.Container
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{port, fabricPort, heartbeatPort, infoPort},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
+			wait.ForListeningPort(port).WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort(fabricPort).WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort(heartbeatPort).WithStartupTimeout(10*time.Second),
+		),
+	}
+
+	genericContainerReq := testcontainers.GenericContainerRequest{
+		ContainerRequest: req,
+		Started:          true,
+	}
+
+	for _, opt := range opts {
+		if err := opt.Customize(&genericContainerReq); err != nil {
+			return nil, fmt.Errorf("customize: %w", err)
+		}
+	}
+
+	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
+	var c *Container
+	if container != nil {
+		c = &Container{Container: container}
+	}
+
+	if err != nil {
+		return c, fmt.Errorf("generic container: %w", err)
+	}
+
+	return c, nil
+}
diff --git a/modules/aerospike/aerospike_test.go b/modules/aerospike/aerospike_test.go
new file mode 100644
index 0000000000..685e0d0724
--- /dev/null
+++ b/modules/aerospike/aerospike_test.go
@@ -0,0 +1,49 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("valid-image-succeeds", func(t *testing.T) {
+		ctx := context.Background()
+		container, err := aerospike.Run(ctx, aerospikeImage)
+		testcontainers.CleanupContainer(t, container)
+		require.NoError(t, err)
+		require.NotNil(t, container)
+	})
+
+	t.Run("applies-container-customizations", func(t *testing.T) {
+		ctx := context.Background()
+		customEnv := "TEST_ENV=value"
+		container, err := aerospike.Run(ctx, aerospikeImage,
+			testcontainers.WithEnv(map[string]string{"CUSTOM_ENV": customEnv}))
+		testcontainers.CleanupContainer(t, container)
+		require.NoError(t, err)
+		require.NotNil(t, container)
+	})
+
+	t.Run("respects-context-cancellation", func(t *testing.T) {
+		ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
+		defer cancel()
+		container, err := aerospike.Run(ctx, aerospikeImage)
+		testcontainers.CleanupContainer(t, container)
+		require.Error(t, err)
+	})
+}
diff --git a/modules/aerospike/examples_test.go b/modules/aerospike/examples_test.go
new file mode 100644
index 0000000000..338511f025
--- /dev/null
+++ b/modules/aerospike/examples_test.go
@@ -0,0 +1,134 @@
+package aerospike_test
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"time"
+
+	aero "github.com/aerospike/aerospike-client-go/v8"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+func ExampleRun() {
+	// runAerospikeContainer {
+	ctx := context.Background()
+
+	aerospikeContainer, err := aerospike.Run(ctx, "aerospike/aerospike-server:latest")
+	defer func() {
+		if err := testcontainers.TerminateContainer(aerospikeContainer); err != nil {
+			log.Printf("failed to terminate container: %s", err)
+		}
+	}()
+	if err != nil {
+		log.Printf("failed to start container: %s", err)
+		return
+	}
+	// }
+	state, err := aerospikeContainer.State(ctx)
+	if err != nil {
+		log.Printf("failed to get container state: %s", err)
+		return
+	}
+
+	fmt.Println(state.Running)
+
+	// Output:
+	// true
+}
+
+func ExampleRun_usingClient() {
+	ctx := context.Background()
+
+	aerospikeContainer, err := aerospike.Run(
+		ctx, "aerospike/aerospike-server:latest",
+	)
+	defer func() {
+		if err := testcontainers.TerminateContainer(aerospikeContainer); err != nil {
+			log.Printf("failed to terminate container: %s", err)
+		}
+	}()
+	if err != nil {
+		log.Printf("failed to start container: %s", err)
+		return
+	}
+
+	// Get the host and port
+	host, err := aerospikeContainer.Host(ctx)
+	if err != nil {
+		log.Printf("failed to get container host: %s", err)
+		return
+	}
+
+	// Get the mapped port
+	port, err := aerospikeContainer.MappedPort(ctx, "3000/tcp")
+	if err != nil {
+		log.Printf("failed to get container port: %s", err)
+		return
+	}
+
+	aeroHost := []*aero.Host{aero.NewHost(host, port.Int())}
+
+	// connect to the host
+	cp := aero.NewClientPolicy()
+	cp.Timeout = 10 * time.Second
+
+	// Create a client
+	client, err := aero.NewClientWithPolicyAndHost(cp, aeroHost...)
+	if err != nil {
+		log.Printf("Failed to create aerospike client: %v", err)
+		return
+	}
+
+	// Close the client
+	defer client.Close()
+
+	// Create a key
+	schemaKey, err := aero.NewKey("test", "test", "_schema_info")
+	if err != nil {
+		log.Printf("Failed to create key: %v", err)
+		return
+	}
+
+	version := 1
+	description := "test aerospike schema info"
+	nowStr := time.Now().Format(time.RFC3339)
+
+	// Create schema record
+	bins := aero.BinMap{
+		"version":     version,
+		"created_at":  nowStr,
+		"updated_at":  nowStr,
+		"description": description,
+	}
+
+	// Never expire the schema info
+	writePolicy := aero.NewWritePolicy(0, 0)
+
+	// Store in Aerospike
+	err = client.Put(writePolicy, schemaKey, bins)
+	if err != nil {
+		log.Printf("Failed to put schema info: %v", err)
+		return
+	}
+
+	// Get schema record
+	record, err := client.Get(nil, schemaKey, "version", "created_at", "updated_at", "description")
+	if err != nil {
+		log.Printf("Failed to get schema info: %v", err)
+		return
+	}
+
+	// Schema exists, check version
+	existingVersion, _ := record.Bins["version"].(int)
+	existingDescription, _ := record.Bins["description"].(string)
+
+	fmt.Println(existingVersion)
+	fmt.Println(existingDescription)
+
+	// Output:
+	// 1
+	// test aerospike schema info
+}
diff --git a/modules/aerospike/go.mod b/modules/aerospike/go.mod
new file mode 100644
index 0000000000..d5ca38aa45
--- /dev/null
+++ b/modules/aerospike/go.mod
@@ -0,0 +1,68 @@
+module github.com/testcontainers/testcontainers-go/modules/aerospike
+
+go 1.23.0
+
+require (
+	github.com/aerospike/aerospike-client-go/v8 v8.2.0
+	github.com/stretchr/testify v1.10.0
+	github.com/testcontainers/testcontainers-go v0.36.0
+)
+
+require (
+	dario.cat/mergo v1.0.1 // indirect
+	github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
+	github.com/Microsoft/go-winio v0.6.2 // indirect
+	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
+	github.com/containerd/log v0.1.0 // indirect
+	github.com/containerd/platforms v0.2.1 // indirect
+	github.com/cpuguy83/dockercfg v0.3.2 // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/distribution/reference v0.6.0 // indirect
+	github.com/docker/docker v28.0.1+incompatible // indirect
+	github.com/docker/go-connections v0.5.0 // indirect
+	github.com/docker/go-units v0.5.0 // indirect
+	github.com/ebitengine/purego v0.8.2 // indirect
+	github.com/felixge/httpsnoop v1.0.4 // indirect
+	github.com/go-logr/logr v1.4.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-ole/go-ole v1.2.6 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/klauspost/compress v1.17.4 // indirect
+	github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
+	github.com/magiconair/properties v1.8.9 // indirect
+	github.com/moby/docker-image-spec v1.3.1 // indirect
+	github.com/moby/patternmatcher v0.6.0 // indirect
+	github.com/moby/sys/sequential v0.5.0 // indirect
+	github.com/moby/sys/user v0.1.0 // indirect
+	github.com/moby/sys/userns v0.1.0 // indirect
+	github.com/moby/term v0.5.0 // indirect
+	github.com/morikuni/aec v1.0.0 // indirect
+	github.com/opencontainers/go-digest v1.0.0 // indirect
+	github.com/opencontainers/image-spec v1.1.1 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/pmezard/go-difflib v1.0.0 // indirect
+	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
+	github.com/shirou/gopsutil/v4 v4.25.1 // indirect
+	github.com/sirupsen/logrus v1.9.3 // indirect
+	github.com/tklauser/go-sysconf v0.3.12 // indirect
+	github.com/tklauser/numcpus v0.6.1 // indirect
+	github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad // indirect
+	github.com/yuin/gopher-lua v1.1.1 // indirect
+	github.com/yusufpapurcu/wmi v1.2.4 // indirect
+	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
+	go.opentelemetry.io/otel v1.35.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect
+	go.opentelemetry.io/otel/metric v1.35.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.35.0 // indirect
+	go.opentelemetry.io/otel/trace v1.35.0 // indirect
+	go.opentelemetry.io/proto/otlp v1.5.0 // indirect
+	golang.org/x/crypto v0.31.0 // indirect
+	golang.org/x/sync v0.10.0 // indirect
+	golang.org/x/sys v0.31.0 // indirect
+	golang.org/x/tools v0.28.0 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a // indirect
+	google.golang.org/protobuf v1.36.6 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/modules/aerospike/go.sum b/modules/aerospike/go.sum
new file mode 100644
index 0000000000..e6a9cea1b7
--- /dev/null
+++ b/modules/aerospike/go.sum
@@ -0,0 +1,202 @@
+dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
+dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
+github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
+github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
+github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
+github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
+github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
+github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
+github.com/aerospike/aerospike-client-go/v8 v8.2.0 h1:6w3X+w5LnmBvQ1X1m4zJH40IWgxZxfMfGhEZxuQlCYo=
+github.com/aerospike/aerospike-client-go/v8 v8.2.0/go.mod h1:JmVOIqacquBd0ZjlZ5Dz6bRMSC3LrZCCNojZ/9NS4R0=
+github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
+github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
+github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
+github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
+github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
+github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA=
+github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc=
+github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
+github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
+github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
+github.com/docker/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0=
+github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
+github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
+github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
+github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
+github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
+github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
+github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
+github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
+github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
+github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
+github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
+github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
+github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk=
+github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc=
+github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc=
+github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo=
+github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg=
+github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU=
+github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
+github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
+github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
+github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
+github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
+github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
+github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
+github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
+github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
+github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
+github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
+github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
+github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
+github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
+github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/testcontainers/testcontainers-go v0.36.0 h1:YpffyLuHtdp5EUsI5mT4sRw8GZhO/5ozyDT1xWGXt00=
+github.com/testcontainers/testcontainers-go v0.36.0/go.mod h1:yk73GVJ0KUZIHUtFna6MO7QS144qYpoY8lEEtU9Hed0=
+github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
+github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
+github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
+github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
+github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad h1:W0LEBv82YCGEtcmPA3uNZBI33/qF//HAAs3MawDjRa0=
+github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad/go.mod h1:Hy8o65+MXnS6EwGElrSRjUzQDLXreJlzYLlWiHtt8hM=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
+github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
+github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
+github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
+go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
+go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU=
+go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
+go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
+go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
+go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
+go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
+go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
+go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
+go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
+golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
+golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
+golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
+golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d h1:H8tOf8XM88HvKqLTxe755haY6r1fqqzLbEnfrmLXlSA=
+google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d/go.mod h1:2v7Z7gP2ZUOGsaFyxATQSRoBnKygqVq2Cwnvom7QiqY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a h1:GIqLhp/cYUkuGuiT+vJk8vhOP86L4+SP5j8yXgeVpvI=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU=
+google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
+google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
+google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
+gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=


Reviews:
user: login: mdelapenya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T05:48:58Z
user: login: mdelapenya
body: Found some more issues, although I think we are very ready to be in good shape. Thanks for working on this!
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-11T09:08:43Z
user: login: MitulShah1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T09:33:03Z
user: login: mdelapenya
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-11T10:07:23Z
user: login: mdelapenya
body: We broke the docs site in the last commit. I can help you out with that adding commits on top of yours if needed
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-11T10:33:44Z
user: login: mdelapenya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T10:35:27Z
user: login: MitulShah1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T10:39:45Z
user: login: mdelapenya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T10:42:24Z
user: login: MitulShah1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T10:49:59Z
user: login: mdelapenya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T10:58:00Z
user: login: MitulShah1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T11:08:45Z
user: login: stevenh
body: Late to the party but there's a few bugs which need fixing.
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T11:09:54Z
user: login: mdelapenya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T11:28:22Z
user: login: mdelapenya
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T11:29:25Z
user: login: stevenh
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T11:37:42Z
user: login: stevenh
body: Looking good, just the one bug due to renamed error I think.
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T11:41:34Z
user: login: MitulShah1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T11:45:16Z
user: login: stevenh
body: Looks good to me, thanks for quick turnaround on fixes most appreciated 👏 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T11:46:38Z
user: login: MitulShah1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T11:46:40Z
user: login: MitulShah1
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T11:47:26Z
user: login: mdelapenya
body: LGTM, thanks @MitulShah1 !

Once merged, could you please update the modules catalog here? https://github.com/testcontainers/community-module-registry/
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-11T12:12:52Z

Review comments:
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
+	testcontainers.Container
+	Host string
+	Port int
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{"3000/tcp", "3001/tcp", "3002/tcp", "3003/tcp"},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+			"NAMESPACE":             "test",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
path: modules/aerospike/aerospike.go
user: login: stevenh
body: suggestion: remove the ForLog as logs can change and hence be fragile we're trying to eliminate these unless there are no other options. You seem to be covered with the ForListeningPort?
created_at: 2025-04-10T16:40:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
+	testcontainers.Container
+	Host string
+	Port int
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{"3000/tcp", "3001/tcp", "3002/tcp", "3003/tcp"},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+			"NAMESPACE":             "test",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
+			wait.ForListeningPort("3000/tcp").WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort("3001/tcp").WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort("3002/tcp").WithStartupTimeout(10*time.Second),
+		),
+	}
+
+	genericContainerReq := testcontainers.GenericContainerRequest{
+		ContainerRequest: req,
+		Started:          true,
+	}
+
+	for _, opt := range opts {
+		if err := opt.Customize(&genericContainerReq); err != nil {
+			return nil, fmt.Errorf("customize: %w", err)
+		}
+	}
+
+	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
+	if err != nil {
+		return nil, fmt.Errorf("failed to start Aerospike container: %w", err)
path: modules/aerospike/aerospike.go
user: login: stevenh
body: suggestion: name the action not the failure so wrapped errors don't become cumbersome for example:
```suggestion
		return nil, fmt.Errorf("generic container: %w", err)
```

More below.
created_at: 2025-04-10T16:41:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
+	testcontainers.Container
+	Host string
+	Port int
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{"3000/tcp", "3001/tcp", "3002/tcp", "3003/tcp"},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+			"NAMESPACE":             "test",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
+			wait.ForListeningPort("3000/tcp").WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort("3001/tcp").WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort("3002/tcp").WithStartupTimeout(10*time.Second),
+		),
+	}
+
+	genericContainerReq := testcontainers.GenericContainerRequest{
+		ContainerRequest: req,
+		Started:          true,
+	}
+
+	for _, opt := range opts {
+		if err := opt.Customize(&genericContainerReq); err != nil {
+			return nil, fmt.Errorf("customize: %w", err)
+		}
+	}
+
+	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
+	if err != nil {
+		return nil, fmt.Errorf("failed to start Aerospike container: %w", err)
+	}
+
+	host, err := container.Host(ctx)
+	if err != nil {
+		return nil, fmt.Errorf("failed to get container host: %w", err)
path: modules/aerospike/aerospike.go
user: login: stevenh
body: bug: this orphans the container, see other modules or the template generator on how to fix by returning the container even if there is an error.
created_at: 2025-04-10T16:44:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: bug: let's remove this const, as it's not used. OTOH we discourage the usage of fixed container names, unless used for Reusing containers.
```suggestion
	containerName = "tc_dynamodb_local"
```
created_at: 2025-04-11T05:44:39Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: suggestion: let's add Go docs for each exposed type, function and method
created_at: 2025-04-11T05:45:05Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
+	testcontainers.Container
+	Host string
+	Port int
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: bug: let's make these fields private to avoid users changing the values. Let's create accessor methods to the container in case we need to retrieve them
created_at: 2025-04-11T05:45:44Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,54 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+	"github.com/testcontainers/testcontainers-go"
+	as "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+// TestAerospikeDB tests the AerospikeDB container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpikeDB(t *testing.T) {
+	t.Run("fails with invalid image", func(t *testing.T) {
path: modules/aerospike/aerospike_test.go
user: login: mdelapenya
body: suggestions: let's use subtests name without whitespaces, in order to make it easier to just copy&paste errors and run them in the terminal. More below
```suggestion
	t.Run("invalid-image", func(t *testing.T) {
```
created_at: 2025-04-11T05:47:10Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
+	testcontainers.Container
+	Host string
+	Port int
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{"3000/tcp", "3001/tcp", "3002/tcp", "3003/tcp"},
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: suggestion: we can probably extract the ports as constants so that we can reuse the values in the wait strategies. Thoughts?
created_at: 2025-04-11T05:48:44Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,89 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	// port is the port used for client connections
+	port = "3000/tcp"
+	// febricPort is the port used for fabric communication
+	febricPort = "3001/tcp"
+	// heartbeatPort is the port used for heartbeat communication
+	// between nodes in the Aerospike cluster
+	heartbeatPort = "3002/tcp"
+	// infoPort is the port used for info commands
+	infoPort = "3003/tcp"
+)
+
+// AerospikeContainer is the Aerospike container type used in the module
+type AerospikeContainer struct {
+	testcontainers.Container
+}
+
+// Deprecated: use Run instead
+// RunContainer creates an instance of the Aerospike container type
+func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	return Run(ctx, "aerospike/aerospike-server:latest", opts...)
+}
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: bug: let's remove deprecated code (it was probably added by an old version of the code generator tool 🤔 )
```suggestion
```
created_at: 2025-04-11T08:54:48Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,89 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	// port is the port used for client connections
+	port = "3000/tcp"
+	// febricPort is the port used for fabric communication
+	febricPort = "3001/tcp"
+	// heartbeatPort is the port used for heartbeat communication
+	// between nodes in the Aerospike cluster
+	heartbeatPort = "3002/tcp"
+	// infoPort is the port used for info commands
+	infoPort = "3003/tcp"
+)
+
+// AerospikeContainer is the Aerospike container type used in the module
+type AerospikeContainer struct {
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: bug: I think the generator tool did not generate this properly. We changed it a few months ago, so you're probably using an outdated version of it. Please update all the references to this type below 🙏 
```suggestion
type Container struct {
```
created_at: 2025-04-11T08:56:31Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,89 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	// port is the port used for client connections
+	port = "3000/tcp"
+	// febricPort is the port used for fabric communication
+	febricPort = "3001/tcp"
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: typo: is it `febric` or `fabric`? The comment says it with `a`.
```suggestion
	// fabricPort is the port used for fabric communication
	fabricPort = "3001/tcp"
```
created_at: 2025-04-11T08:57:31Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,89 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	// port is the port used for client connections
+	port = "3000/tcp"
+	// febricPort is the port used for fabric communication
+	febricPort = "3001/tcp"
+	// heartbeatPort is the port used for heartbeat communication
+	// between nodes in the Aerospike cluster
+	heartbeatPort = "3002/tcp"
+	// infoPort is the port used for info commands
+	infoPort = "3003/tcp"
+)
+
+// AerospikeContainer is the Aerospike container type used in the module
+type AerospikeContainer struct {
+	testcontainers.Container
+}
+
+// Deprecated: use Run instead
+// RunContainer creates an instance of the Aerospike container type
+func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	return Run(ctx, "aerospike/aerospike-server:latest", opts...)
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{port, febricPort, heartbeatPort, infoPort},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
+			wait.ForListeningPort(port).WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort(febricPort).WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort(heartbeatPort).WithStartupTimeout(10*time.Second),
+		),
+	}
+
+	genericContainerReq := testcontainers.GenericContainerRequest{
+		ContainerRequest: req,
+		Started:          true,
+	}
+
+	for _, opt := range opts {
+		if err := opt.Customize(&genericContainerReq); err != nil {
+			return nil, fmt.Errorf("customize: %w", err)
+		}
+	}
+
+	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
+	if err != nil {
+		return nil, fmt.Errorf("failed to start Aerospike container: %w", err)
+	}
+
+	return &AerospikeContainer{
+		Container: container,
+	}, nil
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: bug: same as above, the generator version seems outdated
```suggestion
	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
	var c *Container
	if container != nil {
		c = &Container{Container: container}
	}

	if err != nil {
		return c, fmt.Errorf("generic container: %w", err)
	}

	return c, nil
```
created_at: 2025-04-11T08:59:10Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,89 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	// port is the port used for client connections
+	port = "3000/tcp"
+	// febricPort is the port used for fabric communication
+	febricPort = "3001/tcp"
+	// heartbeatPort is the port used for heartbeat communication
+	// between nodes in the Aerospike cluster
+	heartbeatPort = "3002/tcp"
+	// infoPort is the port used for info commands
+	infoPort = "3003/tcp"
+)
+
+// AerospikeContainer is the Aerospike container type used in the module
+type AerospikeContainer struct {
+	testcontainers.Container
+}
+
+// Deprecated: use Run instead
+// RunContainer creates an instance of the Aerospike container type
+func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	return Run(ctx, "aerospike/aerospike-server:latest", opts...)
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{port, febricPort, heartbeatPort, infoPort},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
+			wait.ForListeningPort(port).WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort(febricPort).WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort(heartbeatPort).WithStartupTimeout(10*time.Second),
+		),
+	}
+
+	genericContainerReq := testcontainers.GenericContainerRequest{
+		ContainerRequest: req,
+		Started:          true,
+	}
+
+	for _, opt := range opts {
+		if err := opt.Customize(&genericContainerReq); err != nil {
+			return nil, fmt.Errorf("customize: %w", err)
+		}
+	}
+
+	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
+	if err != nil {
+		return nil, fmt.Errorf("failed to start Aerospike container: %w", err)
+	}
+
+	return &AerospikeContainer{
+		Container: container,
+	}, nil
+}
+
+// GetHost returns the host of the Aerospike container
+func (c *AerospikeContainer) GetHost() (string, error) {
+
+	host, err := c.Host(context.Background())
+	if err != nil {
+		return "", fmt.Errorf("failed to get container host: %w", err)
+	}
+	return host, nil
+}
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: suggestion: I think we do not need this pass-through method, because we already have the `c.Host(ctx)` one. Let's remove it
created_at: 2025-04-11T09:00:29Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,89 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	// port is the port used for client connections
+	port = "3000/tcp"
+	// febricPort is the port used for fabric communication
+	febricPort = "3001/tcp"
+	// heartbeatPort is the port used for heartbeat communication
+	// between nodes in the Aerospike cluster
+	heartbeatPort = "3002/tcp"
+	// infoPort is the port used for info commands
+	infoPort = "3003/tcp"
+)
+
+// AerospikeContainer is the Aerospike container type used in the module
+type AerospikeContainer struct {
+	testcontainers.Container
+}
+
+// Deprecated: use Run instead
+// RunContainer creates an instance of the Aerospike container type
+func RunContainer(ctx context.Context, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	return Run(ctx, "aerospike/aerospike-server:latest", opts...)
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{port, febricPort, heartbeatPort, infoPort},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
+			wait.ForListeningPort(port).WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort(febricPort).WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort(heartbeatPort).WithStartupTimeout(10*time.Second),
+		),
+	}
+
+	genericContainerReq := testcontainers.GenericContainerRequest{
+		ContainerRequest: req,
+		Started:          true,
+	}
+
+	for _, opt := range opts {
+		if err := opt.Customize(&genericContainerReq); err != nil {
+			return nil, fmt.Errorf("customize: %w", err)
+		}
+	}
+
+	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
+	if err != nil {
+		return nil, fmt.Errorf("failed to start Aerospike container: %w", err)
+	}
+
+	return &AerospikeContainer{
+		Container: container,
+	}, nil
+}
+
+// GetHost returns the host of the Aerospike container
+func (c *AerospikeContainer) GetHost() (string, error) {
+
+	host, err := c.Host(context.Background())
+	if err != nil {
+		return "", fmt.Errorf("failed to get container host: %w", err)
+	}
+	return host, nil
+}
+
+// GetPort returns the port of the Aerospike container
+func (c *AerospikeContainer) GetPort() (string, error) {
+	port, err := c.MappedPort(context.Background(), port)
+	if err != nil {
+		return "", fmt.Errorf("failed to get container port: %w", err)
+	}
+	return port.Port(), nil
+}
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: suggestion: same here, we already have the MappedPort method
created_at: 2025-04-11T09:01:07Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,64 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+	"github.com/testcontainers/testcontainers-go"
+	as "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("fails_with_invalid_image", func(t *testing.T) {
+		ctx := context.Background()
+		_, err := as.Run(ctx, "invalid-aerospike-image")
+		require.Error(t, err)
+		require.Contains(t, err.Error(), "failed to start Aerospike container")
+	})
+
+	t.Run("succeeds_with_valid_image", func(t *testing.T) {
+		ctx := context.Background()
+		container, err := as.Run(ctx, aerospikeImage)
+		require.NoError(t, err)
+		require.NotNil(t, container)
+		defer container.Container.Terminate(ctx)
+
+		host, err := container.GetHost()
+		require.NoError(t, err)
+
+		port, err := container.GetPort()
+		require.NoError(t, err)
+
+		require.NotEmpty(t, host)
+		require.NotEmpty(t, port)
path: modules/aerospike/aerospike_test.go
user: login: mdelapenya
body: suggestion: if the methods are removed, then let's remove this too, as it's testing the library code
created_at: 2025-04-11T09:02:13Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,134 @@
+package aerospike_test
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"time"
+
+	"github.com/aerospike/aerospike-client-go/v8"
+	"github.com/testcontainers/testcontainers-go"
+	as "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+func ExampleRun() {
+	// runAerospikeContainer {
+	ctx := context.Background()
+
+	aerospikedbContainer, err := as.Run(ctx, "aerospike/aerospike-server:latest")
+	defer func() {
+		if err := testcontainers.TerminateContainer(aerospikedbContainer.Container); err != nil {
+			log.Printf("failed to terminate container: %s", err)
+		}
+	}()
+	if err != nil {
+		log.Printf("failed to start container: %s", err)
+		return
+	}
+	// }
+	state, err := aerospikedbContainer.State(ctx)
+	if err != nil {
+		log.Printf("failed to get container state: %s", err)
+		return
+	}
+
+	fmt.Println(state.Running)
+
+	// Output:
+	// true
+}
+
+func ExampleRun_usingClient() {
+	ctx := context.Background()
+
+	aerospikedbContainer, err := as.Run(
+		ctx, "aerospike/aerospike-server:latest",
+	)
+	defer func() {
+		if err := testcontainers.TerminateContainer(aerospikedbContainer.Container); err != nil {
+			log.Printf("failed to terminate container: %s", err)
+		}
+	}()
+	if err != nil {
+		log.Printf("failed to start container: %s", err)
+		return
+	}
+	// }
+
+	// Get the host and port
+	host, err := aerospikedbContainer.Host(ctx)
path: modules/aerospike/examples_test.go
user: login: mdelapenya
body: A confirmation we do not need the GetHost and GetPort methods 😅 
created_at: 2025-04-11T09:02:57Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,134 @@
+package aerospike_test
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"time"
+
+	"github.com/aerospike/aerospike-client-go/v8"
+	"github.com/testcontainers/testcontainers-go"
+	as "github.com/testcontainers/testcontainers-go/modules/aerospike"
path: modules/aerospike/examples_test.go
user: login: mdelapenya
body: suggestion: for consistency with other modules, we usually prepend the `tc` prefix to the alias. Let's apply it elsewhere 🙏 
```suggestion
	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
```
created_at: 2025-04-11T09:03:55Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,48 @@
+# Aerospike
+
+Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+## Introduction
+
+The Testcontainers module for Aerospike.
+
+## Adding this module to your project dependencies
+
+Please run the following command to add the Aerospike module to your Go dependencies:
+
+```
+go get github.com/testcontainers/testcontainers-go/modules/aerospike
+```
+
+## Usage example
+
+<!--codeinclude-->
+[Creating a Aerospike container](../../modules/aerospike/examples_test.go) inside_block:runAerospikeContainer
+<!--/codeinclude-->
+
+## Module Reference
+
+### Run function
+
+- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+The Aerospike module exposes one entrypoint function to create the Aerospike container, and this function receives three parameters:
+
+```golang
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error)
+```
+
+- `context.Context`, the Go context.
+- `string`, the Docker image to use.
+- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
+
+### Container Options
+
+When starting the Aerospike container, you can pass options in a variadic way to configure it.
+
+#### Image
+
+Use the second argument in the `Run` function to set a valid Docker image.
+In example: `Run(context.Background(), "aerospike/aerospike-server:latest")`.
+
+{% include "../features/common_functional_options.md" %}
path: docs/modules/aerospike.md
user: login: mdelapenya
body: bug: the generator adds these lines too.
```suggestion
{% include "../features/common_functional_options.md" %}

### Container Methods

The {{ $title }} container exposes the following methods:

```

Let's include an extra section with examples, embedding code snippets from the testable example on how to create the client and how to use it to connect to the aerospike instance. You can find examples in the following modules: GCloud, NATS, Postgres...
created_at: 2025-04-11T09:06:57Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,89 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	// port is the port used for client connections
+	port = "3000/tcp"
+	// febricPort is the port used for fabric communication
+	febricPort = "3001/tcp"
path: modules/aerospike/aerospike.go
user: login: MitulShah1
body: Thanks correct word is fabric, i've made changes.
created_at: 2025-04-11T09:33:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,64 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+	"github.com/testcontainers/testcontainers-go"
+	as "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("fails_with_invalid_image", func(t *testing.T) {
+		ctx := context.Background()
+		_, err := as.Run(ctx, "invalid-aerospike-image")
+		require.Error(t, err)
+		require.Contains(t, err.Error(), "failed to start Aerospike container")
+	})
+
+	t.Run("succeeds_with_valid_image", func(t *testing.T) {
+		ctx := context.Background()
+		container, err := as.Run(ctx, aerospikeImage)
+		require.NoError(t, err)
+		require.NotNil(t, container)
+		defer container.Container.Terminate(ctx)
path: modules/aerospike/aerospike_test.go
user: login: mdelapenya
body: bug: lint is complaining this error is not handled. Please use `testcontainers.CleanupContainer(t, container)` test helper., which can be called right after the Run function and before checking the error. More below
created_at: 2025-04-11T10:05:34Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,64 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+	"github.com/testcontainers/testcontainers-go"
+	as "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("fails_with_invalid_image", func(t *testing.T) {
path: modules/aerospike/aerospike_test.go
user: login: mdelapenya
body: suggestion: more concise subtests names, using `-` instead of `_`
```suggestion
	t.Run("invalid-image-fails", func(t *testing.T) {
```
created_at: 2025-04-11T10:06:09Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,64 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+	"github.com/testcontainers/testcontainers-go"
+	as "github.com/testcontainers/testcontainers-go/modules/aerospike"
path: modules/aerospike/aerospike_test.go
user: login: mdelapenya
body: suggestion: let's be consistent with other modules
```suggestion
	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
```
created_at: 2025-04-11T10:06:51Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,47 @@
+# Aerospike
+
+Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+## Introduction
+
+The Testcontainers module for Aerospike.
+
+## Adding this module to your project dependencies
+
+Please run the following command to add the Aerospike module to your Go dependencies:
+
+```
+go get github.com/testcontainers/testcontainers-go/modules/aerospike
+```
+
+## Usage example
+
+<!--codeinclude-->
+[Creating a Aerospike container](../../modules/aerospike/examples_test.go) inside_block:runAerospikeContainer
+<!--/codeinclude-->
+
+## Module Reference
+
+### Run function
+
+- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+The Aerospike module exposes one entrypoint function to create the Aerospike container, and this function receives three parameters:
+
+```golang
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error)
+```
+
+- `context.Context`, the Go context.
+- `string`, the Docker image to use.
+- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
+
+### Container Options
+
+When starting the Aerospike container, you can pass options in a variadic way to configure it.
+
+#### Image
+
+Use the second argument in the `Run` function to set a valid Docker image.
+In example: `Run(context.Background(), "aerospike/aerospike-server:latest")`.
+
path: docs/modules/aerospike.md
user: login: mdelapenya
body: bug: we need the import removed in the last commit. My suggestion is about adding a `### Examples` section after it. If we remove that import, then all the functional options won't be visible in the Docs site.
created_at: 2025-04-11T10:31:11Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,73 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("invalid-image-fails", func(t *testing.T) {
+		ctx := context.Background()
+		_, err := tcaerospike.Run(ctx, "invalid-aerospike-image")
+		require.Error(t, err)
+		require.Contains(t, err.Error(), "failed to start Aerospike container")
+	})
+
+	t.Run("valid-image-succeeds", func(t *testing.T) {
+		ctx := context.Background()
+		container, err := tcaerospike.Run(ctx, aerospikeImage)
+		require.NoError(t, err)
+		require.NotNil(t, container)
+
+		defer func() {
+			err := container.Terminate(ctx)
+			require.NoError(t, err)
+		}()
path: modules/aerospike/aerospike_test.go
user: login: mdelapenya
body: suggestion: let's newest APIs for container termination in tests
```suggestion
		testcontainers.CleanupContainer(t, container)
		require.NoError(t, err)
		require.NotNil(t, container)
```
created_at: 2025-04-11T10:35:27Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,47 @@
+# Aerospike
+
+Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+## Introduction
+
+The Testcontainers module for Aerospike.
+
+## Adding this module to your project dependencies
+
+Please run the following command to add the Aerospike module to your Go dependencies:
+
+```
+go get github.com/testcontainers/testcontainers-go/modules/aerospike
+```
+
+## Usage example
+
+<!--codeinclude-->
+[Creating a Aerospike container](../../modules/aerospike/examples_test.go) inside_block:runAerospikeContainer
+<!--/codeinclude-->
+
+## Module Reference
+
+### Run function
+
+- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+The Aerospike module exposes one entrypoint function to create the Aerospike container, and this function receives three parameters:
+
+```golang
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error)
+```
+
+- `context.Context`, the Go context.
+- `string`, the Docker image to use.
+- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
+
+### Container Options
+
+When starting the Aerospike container, you can pass options in a variadic way to configure it.
+
+#### Image
+
+Use the second argument in the `Run` function to set a valid Docker image.
+In example: `Run(context.Background(), "aerospike/aerospike-server:latest")`.
+
path: docs/modules/aerospike.md
user: login: MitulShah1
body: @mdelapenya i've added , can you check if its ok now?
created_at: 2025-04-11T10:39:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,54 @@
+# Aerospike
+
+Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+## Introduction
+
+The Testcontainers module for Aerospike.
+
+## Adding this module to your project dependencies
+
+Please run the following command to add the Aerospike module to your Go dependencies:
+
+```
+go get github.com/testcontainers/testcontainers-go/modules/aerospike
+```
+
+## Usage example
+
+<!--codeinclude-->
+[Creating a Aerospike container](../../modules/aerospike/examples_test.go) inside_block:runAerospikeContainer
+<!--/codeinclude-->
+
+## Module Reference
+
+### Run function
+
+- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+The Aerospike module exposes one entrypoint function to create the Aerospike container, and this function receives three parameters:
+
+```golang
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error)
+```
+
+- `context.Context`, the Go context.
+- `string`, the Docker image to use.
+- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
+
+### Container Options
+
+When starting the Aerospike container, you can pass options in a variadic way to configure it.
+
+#### Image
+
+Use the second argument in the `Run` function to set a valid Docker image.
+In example: `Run(context.Background(), "aerospike/aerospike-server:latest")`.
+
path: docs/modules/aerospike.md
user: login: mdelapenya
body: we removed it in https://github.com/testcontainers/testcontainers-go/pull/3094/commits/aec7de8d2353e22b4bfab5840af688e602dfd834#diff-9ab41249b5ea65d6720001f592610bed73f5f7df6fc7a4080b2f2f413859dbfbL48
```suggestion

{% include "../features/common_functional_options.md" %}

```
created_at: 2025-04-11T10:42:24Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,54 @@
+# Aerospike
+
+Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+## Introduction
+
+The Testcontainers module for Aerospike.
+
+## Adding this module to your project dependencies
+
+Please run the following command to add the Aerospike module to your Go dependencies:
+
+```
+go get github.com/testcontainers/testcontainers-go/modules/aerospike
+```
+
+## Usage example
+
+<!--codeinclude-->
+[Creating a Aerospike container](../../modules/aerospike/examples_test.go) inside_block:runAerospikeContainer
+<!--/codeinclude-->
+
+## Module Reference
+
+### Run function
+
+- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+The Aerospike module exposes one entrypoint function to create the Aerospike container, and this function receives three parameters:
+
+```golang
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error)
+```
+
+- `context.Context`, the Go context.
+- `string`, the Docker image to use.
+- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
+
+### Container Options
+
+When starting the Aerospike container, you can pass options in a variadic way to configure it.
+
+#### Image
+
+Use the second argument in the `Run` function to set a valid Docker image.
+In example: `Run(context.Background(), "aerospike/aerospike-server:latest")`.
+
path: docs/modules/aerospike.md
user: login: MitulShah1
body: Added in https://github.com/testcontainers/testcontainers-go/pull/3094/commits/c3acbdc9982f2750910a17f1d81ba5498875e954
created_at: 2025-04-11T10:49:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,56 @@
+# Aerospike
+
+Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+## Introduction
+
+The Testcontainers module for Aerospike.
+
+## Adding this module to your project dependencies
+
+Please run the following command to add the Aerospike module to your Go dependencies:
+
+```
+go get github.com/testcontainers/testcontainers-go/modules/aerospike
+```
+
+## Usage example
+
+<!--codeinclude-->
+[Creating a Aerospike container](../../modules/aerospike/examples_test.go) inside_block:runAerospikeContainer
+<!--/codeinclude-->
+
+## Module Reference
+
+### Run function
+
+- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+The Aerospike module exposes one entrypoint function to create the Aerospike container, and this function receives three parameters:
+
+```golang
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error)
+```
+
+- `context.Context`, the Go context.
+- `string`, the Docker image to use.
+- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
+
+### Container Options
+
+When starting the Aerospike container, you can pass options in a variadic way to configure it.
+
+#### Image
+
+Use the second argument in the `Run` function to set a valid Docker image.
+In example: `Run(context.Background(), "aerospike/aerospike-server:latest")`.
+
+{% include "../features/common_functional_options.md" %}
+
+## Examples
+
+### Aerospike Client
+
+<!--codeinclude-->
+[Aerospike Client](../../modules/aerospike/examples_test.go) inside_block:usingClient
path: docs/modules/aerospike.md
user: login: mdelapenya
body: Ok, we are almost done. Please check out the resulting website here: https://deploy-preview-3094--testcontainers-go.netlify.app/modules/aerospike/#aerospike-client

You could see the code snippet is not properly embedded. Please follow https://golang.testcontainers.org/contributing/#adding-code-snippets, and also verify it locally with https://golang.testcontainers.org/contributing/#previewing-rendered-content 😉 
created_at: 2025-04-11T10:57:59Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,57 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
path: modules/aerospike/aerospike_test.go
user: login: stevenh
body: suggestion: unless there's a conflict I wouldn't alias
created_at: 2025-04-11T11:05:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,57 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("invalid-image-fails", func(t *testing.T) {
+		ctx := context.Background()
+		_, err := tcaerospike.Run(ctx, "invalid-aerospike-image")
path: modules/aerospike/aerospike_test.go
user: login: stevenh
body: bug: while you're expecting an error if it wasn't the container would be orphaned, add testcontainers.CleanupContainer call
created_at: 2025-04-11T11:05:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,57 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("invalid-image-fails", func(t *testing.T) {
+		ctx := context.Background()
+		_, err := tcaerospike.Run(ctx, "invalid-aerospike-image")
+		require.Error(t, err)
+		require.Contains(t, err.Error(), "failed to start Aerospike container")
+	})
+
+	t.Run("valid-image-succeeds", func(t *testing.T) {
+		ctx := context.Background()
+		container, err := tcaerospike.Run(ctx, aerospikeImage)
+		require.NoError(t, err)
+		require.NotNil(t, container)
+
+		testcontainers.CleanupContainer(t, container)
path: modules/aerospike/aerospike_test.go
user: login: stevenh
body: bug: this should be the frst line after Run, to ensure the container is cleaned up when the test completed, more below.
created_at: 2025-04-11T11:06:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,57 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("invalid-image-fails", func(t *testing.T) {
+		ctx := context.Background()
+		_, err := tcaerospike.Run(ctx, "invalid-aerospike-image")
+		require.Error(t, err)
+		require.Contains(t, err.Error(), "failed to start Aerospike container")
+	})
+
+	t.Run("valid-image-succeeds", func(t *testing.T) {
+		ctx := context.Background()
+		container, err := tcaerospike.Run(ctx, aerospikeImage)
+		require.NoError(t, err)
+		require.NotNil(t, container)
+
+		testcontainers.CleanupContainer(t, container)
+	})
+
+	t.Run("applies-container-customizations", func(t *testing.T) {
+		ctx := context.Background()
+		customEnv := "TEST_ENV=value"
+		container, err := tcaerospike.Run(ctx, aerospikeImage,
+			testcontainers.WithEnv(map[string]string{"CUSTOM_ENV": customEnv}))
+		require.NoError(t, err)
+		require.NotNil(t, container)
+		testcontainers.CleanupContainer(t, container)
+	})
+
+	t.Run("respects-context-cancellation", func(t *testing.T) {
+		ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
+		defer cancel()
+
+		_, err := tcaerospike.Run(ctx, aerospikeImage)
path: modules/aerospike/aerospike_test.go
user: login: stevenh
body: bug: as above call testcontainers.CleanupContainer
created_at: 2025-04-11T11:07:00Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,135 @@
+package aerospike_test
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"time"
+
+	aero "github.com/aerospike/aerospike-client-go/v8"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+func ExampleRun() {
+	// runAerospikeContainer {
+	ctx := context.Background()
+
+	aerospikedbContainer, err := tcaerospike.Run(ctx, "aerospike/aerospike-server:latest")
+	defer func() {
+		if err := testcontainers.TerminateContainer(aerospikedbContainer.Container); err != nil {
+			log.Printf("failed to terminate container: %s", err)
+		}
+	}()
+	if err != nil {
+		log.Printf("failed to start container: %s", err)
+		return
+	}
+	// }
+	state, err := aerospikedbContainer.State(ctx)
+	if err != nil {
+		log.Printf("failed to get container state: %s", err)
+		return
+	}
+
+	fmt.Println(state.Running)
+
+	// Output:
+	// true
+}
+
+func ExampleRun_usingClient() {
+	ctx := context.Background()
+
+	aerospikedbContainer, err := tcaerospike.Run(
+		ctx, "aerospike/aerospike-server:latest",
+	)
+	defer func() {
+		if err := testcontainers.TerminateContainer(aerospikedbContainer.Container); err != nil {
path: modules/aerospike/examples_test.go
user: login: stevenh
body: bug: just pass in aerospikedbContainer, which will prevent a potential nil pointer dereference on error.
created_at: 2025-04-11T11:08:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,56 @@
+# Aerospike
+
+Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+## Introduction
+
+The Testcontainers module for Aerospike.
+
+## Adding this module to your project dependencies
+
+Please run the following command to add the Aerospike module to your Go dependencies:
+
+```
+go get github.com/testcontainers/testcontainers-go/modules/aerospike
+```
+
+## Usage example
+
+<!--codeinclude-->
+[Creating a Aerospike container](../../modules/aerospike/examples_test.go) inside_block:runAerospikeContainer
+<!--/codeinclude-->
+
+## Module Reference
+
+### Run function
+
+- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
+
+The Aerospike module exposes one entrypoint function to create the Aerospike container, and this function receives three parameters:
+
+```golang
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error)
+```
+
+- `context.Context`, the Go context.
+- `string`, the Docker image to use.
+- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
+
+### Container Options
+
+When starting the Aerospike container, you can pass options in a variadic way to configure it.
+
+#### Image
+
+Use the second argument in the `Run` function to set a valid Docker image.
+In example: `Run(context.Background(), "aerospike/aerospike-server:latest")`.
+
+{% include "../features/common_functional_options.md" %}
+
+## Examples
+
+### Aerospike Client
+
+<!--codeinclude-->
+[Aerospike Client](../../modules/aerospike/examples_test.go) inside_block:usingClient
path: docs/modules/aerospike.md
user: login: MitulShah1
body: Checked in local now looks good

![image](https://github.com/user-attachments/assets/087c44d5-4f1d-4d53-8644-056d73b1703d)

created_at: 2025-04-11T11:08:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,135 @@
+package aerospike_test
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"time"
+
+	aero "github.com/aerospike/aerospike-client-go/v8"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+func ExampleRun() {
+	// runAerospikeContainer {
+	ctx := context.Background()
+
+	aerospikedbContainer, err := tcaerospike.Run(ctx, "aerospike/aerospike-server:latest")
+	defer func() {
+		if err := testcontainers.TerminateContainer(aerospikedbContainer.Container); err != nil {
path: modules/aerospike/examples_test.go
user: login: stevenh
body: bug: just pass in aerospikedbContainer to prevent nil dereference on error.
created_at: 2025-04-11T11:08:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,135 @@
+package aerospike_test
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"time"
+
+	aero "github.com/aerospike/aerospike-client-go/v8"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
path: modules/aerospike/examples_test.go
user: login: stevenh
body: suggestion: no need to alias.
created_at: 2025-04-11T11:09:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
+	testcontainers.Container
+	Host string
+	Port int
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{"3000/tcp", "3001/tcp", "3002/tcp", "3003/tcp"},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+			"NAMESPACE":             "test",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
+			wait.ForListeningPort("3000/tcp").WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort("3001/tcp").WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort("3002/tcp").WithStartupTimeout(10*time.Second),
+		),
+	}
+
+	genericContainerReq := testcontainers.GenericContainerRequest{
+		ContainerRequest: req,
+		Started:          true,
+	}
+
+	for _, opt := range opts {
+		if err := opt.Customize(&genericContainerReq); err != nil {
+			return nil, fmt.Errorf("customize: %w", err)
+		}
+	}
+
+	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
+	if err != nil {
+		return nil, fmt.Errorf("failed to start Aerospike container: %w", err)
path: modules/aerospike/aerospike.go
user: login: mdelapenya
body: Yeah, I think we missed this change during the review. @MitulShah1 can you confirm how was the module scaffolding created? I guess it was an old version 🤔 
created_at: 2025-04-11T11:28:22Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,57 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
path: modules/aerospike/aerospike_test.go
user: login: mdelapenya
body: The alias was needed because the aerospike client had no alias, but during the review it was added.

I'd alias our module and keep the client without alias, if possible.
created_at: 2025-04-11T11:29:25Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,57 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
path: modules/aerospike/aerospike_test.go
user: login: stevenh
body: Unless I'm missing something there is no aerospike client in use, so nothing to conflict with?
created_at: 2025-04-11T11:37:42Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,58 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/modules/aerospike"
+)
+
+const (
+	aerospikeImage = "aerospike/aerospike-server:latest"
+)
+
+// TestAerospike tests the Aerospike container functionality
+// It includes tests for starting the container with a valid image,
+// applying container customizations, and handling context cancellation.
+// It also includes a test for an invalid image to ensure proper error handling.
+// The tests use the testcontainers-go library to manage container lifecycle
+func TestAeroSpike(t *testing.T) {
+	t.Run("invalid-image-fails", func(t *testing.T) {
+		ctx := context.Background()
+		container, err := aerospike.Run(ctx, "invalid-aerospike-image")
+		testcontainers.CleanupContainer(t, container)
+		require.Error(t, err)
+		require.Contains(t, err.Error(), "failed to start Aerospike container")
path: modules/aerospike/aerospike_test.go
user: login: stevenh
body: bug: I suspect this needs updating now the wrapped error has changed.
created_at: 2025-04-11T11:39:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
+	testcontainers.Container
+	Host string
+	Port int
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{"3000/tcp", "3001/tcp", "3002/tcp", "3003/tcp"},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+			"NAMESPACE":             "test",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
path: modules/aerospike/aerospike.go
user: login: MitulShah1
body: @stevenh  yes this log needed.
created_at: 2025-04-11T11:45:16Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,71 @@
+package aerospike
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"github.com/testcontainers/testcontainers-go"
+	"github.com/testcontainers/testcontainers-go/wait"
+)
+
+const (
+	port          = "3000/tcp"
+	containerName = "tc_dynamodb_local"
+)
+
+type AerospikeContainer struct {
+	testcontainers.Container
+	Host string
+	Port int
+}
+
+// Run creates an instance of the Aerospike container type
+func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*AerospikeContainer, error) {
+	req := testcontainers.ContainerRequest{
+		Image:        img,
+		ExposedPorts: []string{"3000/tcp", "3001/tcp", "3002/tcp", "3003/tcp"},
+		Env: map[string]string{
+			"AEROSPIKE_CONFIG_FILE": "/etc/aerospike/aerospike.conf",
+			"NAMESPACE":             "test",
+		},
+		WaitingFor: wait.ForAll(
+			wait.ForLog("migrations: complete"),
+			wait.ForListeningPort("3000/tcp").WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort("3001/tcp").WithStartupTimeout(10*time.Second),
+			wait.ForListeningPort("3002/tcp").WithStartupTimeout(10*time.Second),
+		),
+	}
+
+	genericContainerReq := testcontainers.GenericContainerRequest{
+		ContainerRequest: req,
+		Started:          true,
+	}
+
+	for _, opt := range opts {
+		if err := opt.Customize(&genericContainerReq); err != nil {
+			return nil, fmt.Errorf("customize: %w", err)
+		}
+	}
+
+	container, err := testcontainers.GenericContainer(ctx, genericContainerReq)
+	if err != nil {
+		return nil, fmt.Errorf("failed to start Aerospike container: %w", err)
path: modules/aerospike/aerospike.go
user: login: MitulShah1
body: @mdelapenya fixed it
created_at: 2025-04-11T11:46:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,57 @@
+package aerospike_test
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/require"
+
+	"github.com/testcontainers/testcontainers-go"
+	tcaerospike "github.com/testcontainers/testcontainers-go/modules/aerospike"
path: modules/aerospike/aerospike_test.go
user: login: MitulShah1
body: I've made changes removed alias
created_at: 2025-04-11T11:47:26Z
author_association: CONTRIBUTOR

PR comments:
user: login: netlify[bot]
created_at: 2025-04-10T15:38:56Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *testcontainers-go* ready!


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 15154883c5270dad38587cfd77f03a8f116b2c24 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/testcontainers-go/deploys/67f90081bdb87d00088e3aba |
|<span aria-hidden="true">😎</span> Deploy Preview | [https://deploy-preview-3094--testcontainers-go.netlify.app](https://deploy-preview-3094--testcontainers-go.netlify.app) |
|<span aria-hidden="true">📱</span> Preview on mobile | <details><summary> Toggle QR Code... </summary><br /><br />![QR Code](https://app.netlify.com/qr-code/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RlcGxveS1wcmV2aWV3LTMwOTQtLXRlc3Rjb250YWluZXJzLWdvLm5ldGxpZnkuYXBwIn0.YwEyMVtwMGTZCNagDclbB5dU1HLrdwasjNwPU0wQ9Bk)<br /><br />_Use your smartphone camera to open QR code link._</details> |
---
<!-- [testcontainers-go Preview](https://deploy-preview-3094--testcontainers-go.netlify.app) -->
_To edit notification comments on pull requests, go to your [Netlify site configuration](https://app.netlify.com/sites/testcontainers-go/configuration/notifications#deploy-webhooks)._
author_association: NONE
user: login: mdelapenya
created_at: 2025-04-10T15:45:10Z
body: @MitulShah1 before moving on with the review, did you know that this module already exists as a community module? https://github.com/ajeetdsouza/testcontainers-aerospike-go

What would be the interest of moving it under here?
author_association: MEMBER
user: login: MitulShah1
created_at: 2025-04-10T15:53:50Z
body: > @MitulShah1 before moving on with the review, did you know that this module already exists as a community module? https://github.com/ajeetdsouza/testcontainers-aerospike-go
> 
> What would be the interest of moving it under here?

I thing this version belongs to official testcontainers-go, what you mention is individual developed.
author_association: CONTRIBUTOR
user: login: mdelapenya
created_at: 2025-04-10T15:59:55Z
body: I know. That module is listed in the modules catalog https://testcontainers.com/modules/aerospike/?language=go

Is there anything blocking you from using it?
author_association: MEMBER
user: login: MitulShah1
created_at: 2025-04-10T16:15:36Z
body: I can use that module, no problem.
People try to find in existing code base if exist or not then go for different option. I did same i tried but didn't find on GitHub for aerospike, there is no major implementation in my code, if you merge ok or Thanks for pointing out i will use that in my test case 😀 
author_association: CONTRIBUTOR
user: login: mdelapenya
created_at: 2025-04-10T16:30:45Z
body: Not opposed to merge this into the main repo, just wanted to know the details
author_association: MEMBER
user: login: MitulShah1
created_at: 2025-04-10T16:38:02Z
body: No worries, Thanks i just checked github codebase, next time i'll take care to check official doc as well, if it's listed or not. Meanwhile Closing PR 
author_association: CONTRIBUTOR
user: login: MitulShah1
created_at: 2025-04-11T04:50:57Z
body: @mdelapenya  I just close PR but when i start work, i saw your comment on https://github.com/ajeetdsouza/testcontainers-aerospike-go/pulls isnt it easy to manage here? 

At the time I started working on this module, the feature wasn't available in the main repository. I identified the need based on project requirements and decided to proceed with development to avoid delays and to keep my work unblocked.

My implementation is aligned with current architecture and standards, and it has already been tested. I believe it offers value by addressing the issue early, and we can either merge it directly or integrate parts of it with the main repo’s version if there are complementary benefits.

I’m open to discussing how we can consolidate both efforts efficiently, but the intention was to be proactive and keep momentum going.
author_association: CONTRIBUTOR
user: login: mdelapenya
created_at: 2025-04-11T05:42:41Z
body: Let's reopen an start the discussion and review here. Thanks for pointing out
author_association: MEMBER
user: login: MitulShah1
created_at: 2025-04-11T07:28:04Z
body: @mdelapenya thanks for review, suggestion changes are done.
author_association: CONTRIBUTOR