forked from testcontainers/testcontainers-go
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into windows-fixes
* main: chore: use a much smaller image for testing (testcontainers#2795) fix: parallel containers clean race (testcontainers#2790) fix(registry): wait for (testcontainers#2793) fix: container timeout test (testcontainers#2792) docs: document redpanda options (testcontainers#2789) feat: support databend module (testcontainers#2779) chore: golangci-lint 1.61.0 (testcontainers#2787) fix(mssql): bump Docker image version (testcontainers#2786) fix: handle 127 error code for podman compatibility (testcontainers#2778) fix: do not override ImageBuildOptions.Labels when building from a Dockerfile (testcontainers#2775) feat(mongodb): Wait for mongodb module with a replicaset to finish (testcontainers#2777) fix(postgres): Apply default snapshot name if no name specified (testcontainers#2783) fix: resource clean up for tests and examples (testcontainers#2738)
- Loading branch information
Showing
260 changed files
with
4,968 additions
and
4,346 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,4 +14,7 @@ TEST-*.xml | |
|
||
tcvenv | ||
|
||
**/go.work | ||
**/go.work | ||
|
||
# VS Code settings | ||
.vscode |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,6 +8,7 @@ linters: | |
- nonamedreturns | ||
- testifylint | ||
- errcheck | ||
- nolintlint | ||
|
||
linters-settings: | ||
errorlint: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
package testcontainers | ||
|
||
import ( | ||
"context" | ||
"errors" | ||
"fmt" | ||
"reflect" | ||
"time" | ||
) | ||
|
||
// terminateOptions is a type that holds the options for terminating a container. | ||
type terminateOptions struct { | ||
ctx context.Context | ||
timeout *time.Duration | ||
volumes []string | ||
} | ||
|
||
// TerminateOption is a type that represents an option for terminating a container. | ||
type TerminateOption func(*terminateOptions) | ||
|
||
// StopContext returns a TerminateOption that sets the context. | ||
// Default: context.Background(). | ||
func StopContext(ctx context.Context) TerminateOption { | ||
return func(c *terminateOptions) { | ||
c.ctx = ctx | ||
} | ||
} | ||
|
||
// StopTimeout returns a TerminateOption that sets the timeout. | ||
// Default: See [Container.Stop]. | ||
func StopTimeout(timeout time.Duration) TerminateOption { | ||
return func(c *terminateOptions) { | ||
c.timeout = &timeout | ||
} | ||
} | ||
|
||
// RemoveVolumes returns a TerminateOption that sets additional volumes to remove. | ||
// This is useful when the container creates named volumes that should be removed | ||
// which are not removed by default. | ||
// Default: nil. | ||
func RemoveVolumes(volumes ...string) TerminateOption { | ||
return func(c *terminateOptions) { | ||
c.volumes = volumes | ||
} | ||
} | ||
|
||
// TerminateContainer calls [Container.Terminate] on the container if it is not nil. | ||
// | ||
// This should be called as a defer directly after [GenericContainer](...) | ||
// or a modules Run(...) to ensure the container is terminated when the | ||
// function ends. | ||
func TerminateContainer(container Container, options ...TerminateOption) error { | ||
if isNil(container) { | ||
return nil | ||
} | ||
|
||
c := &terminateOptions{ | ||
ctx: context.Background(), | ||
} | ||
|
||
for _, opt := range options { | ||
opt(c) | ||
} | ||
|
||
// TODO: Add a timeout when terminate supports it. | ||
err := container.Terminate(c.ctx) | ||
if !isCleanupSafe(err) { | ||
return fmt.Errorf("terminate: %w", err) | ||
} | ||
|
||
// Remove additional volumes if any. | ||
if len(c.volumes) == 0 { | ||
return nil | ||
} | ||
|
||
client, err := NewDockerClientWithOpts(c.ctx) | ||
if err != nil { | ||
return fmt.Errorf("docker client: %w", err) | ||
} | ||
|
||
defer client.Close() | ||
|
||
// Best effort to remove all volumes. | ||
var errs []error | ||
for _, volume := range c.volumes { | ||
if errRemove := client.VolumeRemove(c.ctx, volume, true); errRemove != nil { | ||
errs = append(errs, fmt.Errorf("volume remove %q: %w", volume, errRemove)) | ||
} | ||
} | ||
|
||
return errors.Join(errs...) | ||
} | ||
|
||
// isNil returns true if val is nil or an nil instance false otherwise. | ||
func isNil(val any) bool { | ||
if val == nil { | ||
return true | ||
} | ||
|
||
valueOf := reflect.ValueOf(val) | ||
switch valueOf.Kind() { | ||
case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice: | ||
return valueOf.IsNil() | ||
default: | ||
return false | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.