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 catinapoke/main
* main: (76 commits) fix(influxdb): Respect custom waitStrategy (testcontainers#2845) fix: only upload to sonar on ubuntu-latest (testcontainers#2891) fix: build artifact name properly (testcontainers#2890) fix: do not run sonar upload when ryuk is disabled (testcontainers#2889) fix: update GH actions for uploading/downloading artifacts (testcontainers#2888) feat(ci): Enable master moby with rootless (testcontainers#2880) fix(redpanda): temporary file use chore(deps): bump actions/download-artifact from 3.0.2 to 4.1.8 (testcontainers#2676) chore(deps): bump actions/upload-artifact from 3.1.3 to 4.4.3 (testcontainers#2885) fix!: port forwarding clean up and make private (testcontainers#2881) chore: resolve AWS deprecations for localstack (testcontainers#2879) docs: fix new lifecycle hooks section (testcontainers#2875) fix: host access port instability (testcontainers#2867) feat: add build to life cycle hooks (testcontainers#2653) fix: typo in containerd integration (testcontainers#2873) chore(deps): bump mkdocs-include-markdown-plugin from 6.0.4 to 6.2.2 (testcontainers#2806) chore: use testify instead of t.Error (testcontainers#2871) ci: enable perfsprint linter (testcontainers#2872) chore(deps): bump mkdocs-markdownextradata-plugin from 0.2.5 to 0.2.6 (testcontainers#2807) chore: use testcontainers.RequireContainerExec (testcontainers#2870) ...
- Loading branch information
Showing
423 changed files
with
12,516 additions
and
8,145 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
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
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 | ||
} | ||
} |
Oops, something went wrong.