From 9f687608ad9521c1939f9fe07d515cbefcdbc71a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Thu, 21 Dec 2023 12:33:10 +0100 Subject: [PATCH] feat: support configuring Ryuk verbose mode at config level (#2038) --- docs/features/configuration.md | 2 +- internal/config/config.go | 6 ++++ internal/config/config_test.go | 53 ++++++++++++++++++++++++++++++++++ reaper.go | 3 ++ reaper_test.go | 13 +++++++++ 5 files changed, 76 insertions(+), 1 deletion(-) diff --git a/docs/features/configuration.md b/docs/features/configuration.md index ede9dbcae5..5b0d5973d7 100644 --- a/docs/features/configuration.md +++ b/docs/features/configuration.md @@ -52,7 +52,7 @@ but does not allow starting privileged containers, you can turn off the Ryuk con `TESTCONTAINERS_RYUK_DISABLED` **environment variable** to `true`. 1. You can specify the connection timeout for Ryuk by setting the `ryuk.connection.timeout` **property**. The default value is 1 minute. 1. You can specify the reconnection timeout for Ryuk by setting the `ryuk.reconnection.timeout` **property**. The default value is 10 seconds. - +1. You can configure Ryuk to run in verbose mode by setting any of the `ryuk.verbose` **property** or the `TESTCONTAINERS_RYUK_VERBOSE` **environment variable**. The default value is `false`. !!!info For more information about Ryuk, see [Garbage Collector](garbage_collector.md). diff --git a/internal/config/config.go b/internal/config/config.go index 038a7b85d8..1c8da09c99 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -29,6 +29,7 @@ type Config struct { RyukPrivileged bool `properties:"ryuk.container.privileged,default=false"` RyukReconnectionTimeout time.Duration `properties:"ryuk.reconnection.timeout,default=10s"` RyukConnectionTimeout time.Duration `properties:"ryuk.connection.timeout,default=1m"` + RyukVerbose bool `properties:"ryuk.verbose,default=false"` TestcontainersHost string `properties:"tc.host,default="` } @@ -80,6 +81,11 @@ func read() Config { config.RyukPrivileged = ryukPrivilegedEnv == "true" } + ryukVerboseEnv := os.Getenv("TESTCONTAINERS_RYUK_VERBOSE") + if parseBool(ryukVerboseEnv) { + config.RyukVerbose = ryukVerboseEnv == "true" + } + return config } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 39cb0a87a7..6c9cb0dd3c 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -22,6 +22,7 @@ func resetTestEnv(t *testing.T) { t.Setenv("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", "") t.Setenv("TESTCONTAINERS_RYUK_DISABLED", "") t.Setenv("TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED", "") + t.Setenv("TESTCONTAINERS_RYUK_VERBOSE", "") } func TestReadConfig(t *testing.T) { @@ -117,12 +118,14 @@ func TestReadTCConfig(t *testing.T) { t.Setenv("TESTCONTAINERS_RYUK_DISABLED", "true") t.Setenv("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", defaultHubPrefix) t.Setenv("TESTCONTAINERS_RYUK_CONTAINER_PRIVILEGED", "true") + t.Setenv("TESTCONTAINERS_RYUK_VERBOSE", "true") config := read() expected := Config{ HubImageNamePrefix: defaultHubPrefix, RyukDisabled: true, RyukPrivileged: true, + RyukVerbose: true, } assert.Equal(t, expected, config) @@ -260,6 +263,16 @@ func TestReadTCConfig(t *testing.T) { RyukConnectionTimeout: 12 * time.Second, }, }, + { + "With Ryuk verbose configured using properties", + `ryuk.verbose=true`, + map[string]string{}, + Config{ + RyukVerbose: true, + RyukConnectionTimeout: defaultRyukConnectionTimeout, + RyukReconnectionTimeout: defaultRyukReonnectionTimeout, + }, + }, { "With Ryuk disabled using an env var", ``, @@ -324,6 +337,46 @@ func TestReadTCConfig(t *testing.T) { }, defaultConfig, }, + { + "With Ryuk verbose using an env var and properties. Env var wins (0)", + `ryuk.verbose=true`, + map[string]string{ + "TESTCONTAINERS_RYUK_VERBOSE": "true", + }, + Config{ + RyukVerbose: true, + RyukConnectionTimeout: defaultRyukConnectionTimeout, + RyukReconnectionTimeout: defaultRyukReonnectionTimeout, + }, + }, + { + "With Ryuk verbose using an env var and properties. Env var wins (1)", + `ryuk.verbose=false`, + map[string]string{ + "TESTCONTAINERS_RYUK_VERBOSE": "true", + }, + Config{ + RyukVerbose: true, + RyukConnectionTimeout: defaultRyukConnectionTimeout, + RyukReconnectionTimeout: defaultRyukReonnectionTimeout, + }, + }, + { + "With Ryuk verbose using an env var and properties. Env var wins (2)", + `ryuk.verbose=true`, + map[string]string{ + "TESTCONTAINERS_RYUK_VERBOSE": "false", + }, + defaultConfig, + }, + { + "With Ryuk verbose using an env var and properties. Env var wins (3)", + `ryuk.verbose=false`, + map[string]string{ + "TESTCONTAINERS_RYUK_VERBOSE": "false", + }, + defaultConfig, + }, { "With Ryuk container privileged using an env var and properties. Env var wins (0)", `ryuk.container.privileged=true`, diff --git a/reaper.go b/reaper.go index 72a5acab3f..5b3bd8f5f8 100644 --- a/reaper.go +++ b/reaper.go @@ -236,6 +236,9 @@ func newReaper(ctx context.Context, sessionID string, provider ReaperProvider) ( if to := tcConfig.RyukReconnectionTimeout; to > time.Duration(0) { req.Env["RYUK_RECONNECTION_TIMEOUT"] = to.String() } + if tcConfig.RyukVerbose { + req.Env["RYUK_VERBOSE"] = "true" + } // include reaper-specific labels to the reaper container req.Labels[testcontainersdocker.LabelReaper] = "true" diff --git a/reaper_test.go b/reaper_test.go index 718491d700..4657e1ba09 100644 --- a/reaper_test.go +++ b/reaper_test.go @@ -354,6 +354,19 @@ func Test_NewReaper(t *testing.T) { RyukReconnectionTimeout: 10 * time.Minute, }}, }, + { + name: "configured verbose mode", + req: createContainerRequest(func(req ContainerRequest) ContainerRequest { + req.Env = map[string]string{ + "RYUK_VERBOSE": "true", + } + return req + }), + config: TestcontainersConfig{Config: config.Config{ + RyukPrivileged: true, + RyukVerbose: true, + }}, + }, { name: "docker-host in context", req: createContainerRequest(func(req ContainerRequest) ContainerRequest {