From 3a2d37e553afa53935bdbddfbcefcb2e954013cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Luthi?= Date: Sun, 11 Feb 2024 10:23:10 +0100 Subject: [PATCH 01/12] Make the logger configurable with a new WithLogger method on the builders This will enable a seamless integration with xUnit.net (both ITestOutputHelper and IMessageSink) Fixes #996 --- .../ModuleNameContainer.cs | 5 +- src/Testcontainers.ActiveMq/ArtemisBuilder.cs | 2 +- .../ArtemisContainer.cs | 5 +- src/Testcontainers.ActiveMq/Usings.cs | 3 +- .../ArangoDbBuilder.cs | 2 +- .../ArangoDbContainer.cs | 5 +- src/Testcontainers.ArangoDb/Usings.cs | 3 +- src/Testcontainers.Azurite/AzuriteBuilder.cs | 2 +- .../AzuriteContainer.cs | 5 +- src/Testcontainers.Azurite/Usings.cs | 3 +- .../BigQueryBuilder.cs | 2 +- .../BigQueryContainer.cs | 5 +- src/Testcontainers.BigQuery/Usings.cs | 3 +- .../BigtableBuilder.cs | 2 +- .../BigtableContainer.cs | 5 +- src/Testcontainers.Bigtable/Usings.cs | 3 +- .../ClickHouseBuilder.cs | 2 +- .../ClickHouseContainer.cs | 5 +- src/Testcontainers.ClickHouse/Usings.cs | 3 +- .../CockroachDbBuilder.cs | 2 +- .../CockroachDbContainer.cs | 5 +- src/Testcontainers.CockroachDb/Usings.cs | 3 +- src/Testcontainers.Consul/ConsulBuilder.cs | 2 +- src/Testcontainers.Consul/ConsulContainer.cs | 5 +- src/Testcontainers.Consul/Usings.cs | 3 +- .../CosmosDbBuilder.cs | 2 +- .../CosmosDbContainer.cs | 5 +- src/Testcontainers.CosmosDb/Usings.cs | 3 +- src/Testcontainers.CouchDb/CouchDbBuilder.cs | 2 +- .../CouchDbContainer.cs | 5 +- src/Testcontainers.CouchDb/Usings.cs | 3 +- .../CouchbaseBuilder.cs | 2 +- .../CouchbaseContainer.cs | 5 +- .../DynamoDbBuilder.cs | 2 +- .../DynamoDbContainer.cs | 5 +- src/Testcontainers.DynamoDb/Usings.cs | 3 +- .../ElasticsearchBuilder.cs | 2 +- .../ElasticsearchContainer.cs | 5 +- src/Testcontainers.Elasticsearch/Usings.cs | 3 +- .../EventStoreDbBuilder.cs | 2 +- .../EventStoreDbContainer.cs | 5 +- src/Testcontainers.EventStoreDb/Usings.cs | 3 +- .../FakeGcsServerBuilder.cs | 2 +- .../FakeGcsServerContainer.cs | 5 +- src/Testcontainers.FakeGcsServer/Usings.cs | 3 +- .../FirebirdSqlBuilder.cs | 2 +- .../FirebirdSqlContainer.cs | 5 +- src/Testcontainers.FirebirdSql/Usings.cs | 3 +- .../FirestoreBuilder.cs | 2 +- .../FirestoreContainer.cs | 5 +- src/Testcontainers.Firestore/Usings.cs | 3 +- .../InfluxDbBuilder.cs | 2 +- .../InfluxDbContainer.cs | 5 +- src/Testcontainers.InfluxDb/Usings.cs | 3 +- .../JanusGraphBuilder.cs | 2 +- .../JanusGraphContainer.cs | 5 +- src/Testcontainers.JanusGraph/Usings.cs | 3 +- src/Testcontainers.K3s/K3sBuilder.cs | 2 +- src/Testcontainers.K3s/K3sContainer.cs | 5 +- src/Testcontainers.K3s/Usings.cs | 3 +- src/Testcontainers.Kafka/KafkaBuilder.cs | 2 +- src/Testcontainers.Kafka/KafkaContainer.cs | 5 +- src/Testcontainers.Kafka/Usings.cs | 3 +- .../KeycloakBuilder.cs | 2 +- .../KeycloakContainer.cs | 5 +- src/Testcontainers.Keycloak/Usings.cs | 3 +- src/Testcontainers.Kusto/KustoBuilder.cs | 2 +- src/Testcontainers.Kusto/KustoContainer.cs | 5 +- src/Testcontainers.Kusto/Usings.cs | 3 +- .../LocalStackBuilder.cs | 2 +- .../LocalStackContainer.cs | 5 +- src/Testcontainers.LocalStack/Usings.cs | 3 +- src/Testcontainers.MariaDb/MariaDbBuilder.cs | 2 +- .../MariaDbContainer.cs | 5 +- src/Testcontainers.MariaDb/Usings.cs | 3 +- src/Testcontainers.Minio/MinioBuilder.cs | 2 +- src/Testcontainers.Minio/MinioContainer.cs | 5 +- src/Testcontainers.Minio/Usings.cs | 3 +- src/Testcontainers.MongoDb/MongoDbBuilder.cs | 2 +- .../MongoDbContainer.cs | 5 +- src/Testcontainers.MongoDb/Usings.cs | 3 +- src/Testcontainers.MsSql/MsSqlBuilder.cs | 2 +- src/Testcontainers.MsSql/MsSqlContainer.cs | 5 +- src/Testcontainers.MsSql/Usings.cs | 3 +- src/Testcontainers.MySql/MySqlBuilder.cs | 2 +- src/Testcontainers.MySql/MySqlContainer.cs | 5 +- src/Testcontainers.MySql/Usings.cs | 3 +- src/Testcontainers.Nats/NatsBuilder.cs | 2 +- src/Testcontainers.Nats/NatsContainer.cs | 5 +- src/Testcontainers.Nats/Usings.cs | 3 +- src/Testcontainers.Neo4j/Neo4jBuilder.cs | 2 +- src/Testcontainers.Neo4j/Neo4jContainer.cs | 5 +- src/Testcontainers.Neo4j/Usings.cs | 3 +- src/Testcontainers.Oracle/OracleBuilder.cs | 2 +- src/Testcontainers.Oracle/OracleContainer.cs | 5 +- src/Testcontainers.Oracle/Usings.cs | 3 +- .../PapercutBuilder.cs | 2 +- .../PapercutContainer.cs | 5 +- src/Testcontainers.Papercut/Usings.cs | 3 +- .../PostgreSqlBuilder.cs | 2 +- .../PostgreSqlContainer.cs | 5 +- src/Testcontainers.PostgreSql/Usings.cs | 3 +- src/Testcontainers.PubSub/PubSubBuilder.cs | 2 +- src/Testcontainers.PubSub/PubSubContainer.cs | 5 +- src/Testcontainers.PubSub/Usings.cs | 3 +- .../RabbitMqBuilder.cs | 2 +- .../RabbitMqContainer.cs | 5 +- src/Testcontainers.RabbitMq/Usings.cs | 3 +- src/Testcontainers.RavenDb/RavenDbBuilder.cs | 2 +- .../RavenDbContainer.cs | 5 +- src/Testcontainers.RavenDb/Usings.cs | 3 +- src/Testcontainers.Redis/RedisBuilder.cs | 2 +- src/Testcontainers.Redis/RedisContainer.cs | 5 +- src/Testcontainers.Redis/Usings.cs | 3 +- .../RedpandaBuilder.cs | 2 +- .../RedpandaContainer.cs | 5 +- src/Testcontainers.Redpanda/Usings.cs | 3 +- src/Testcontainers.SqlEdge/SqlEdgeBuilder.cs | 2 +- .../SqlEdgeContainer.cs | 5 +- src/Testcontainers.SqlEdge/Usings.cs | 3 +- src/Testcontainers.WebDriver/Usings.cs | 1 - .../WebDriverBuilder.cs | 2 +- .../WebDriverContainer.cs | 7 +- .../Builders/AbstractBuilder`4.cs | 10 ++- .../Builders/ContainerBuilder.cs | 2 +- .../Builders/IAbstractBuilder`3.cs | 9 +++ .../Builders/ImageFromDockerfileBuilder.cs | 2 +- src/Testcontainers/Builders/NetworkBuilder.cs | 2 +- src/Testcontainers/Builders/VolumeBuilder.cs | 2 +- .../Clients/TestcontainersClient.cs | 3 + .../Commons/IResourceConfiguration.cs | 6 ++ .../Commons/ResourceConfiguration.cs | 12 +++- .../Configurations/TestcontainersSettings.cs | 68 +------------------ .../Containers/DockerContainer.cs | 8 +-- .../Containers/PortForwarding.cs | 8 +-- .../Images/FutureDockerImage.cs | 6 +- src/Testcontainers/Logging.cs | 39 +++++++++++ src/Testcontainers/Networks/DockerNetwork.cs | 7 +- src/Testcontainers/Volumes/DockerVolume.cs | 7 +- 139 files changed, 261 insertions(+), 342 deletions(-) diff --git a/src/Templates/CSharp/Testcontainers.ModuleName/ModuleNameContainer.cs b/src/Templates/CSharp/Testcontainers.ModuleName/ModuleNameContainer.cs index d6977575a..4b2137d2a 100644 --- a/src/Templates/CSharp/Testcontainers.ModuleName/ModuleNameContainer.cs +++ b/src/Templates/CSharp/Testcontainers.ModuleName/ModuleNameContainer.cs @@ -8,9 +8,8 @@ public sealed class ModuleNameContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public ModuleNameContainer(ModuleNameConfiguration configuration, ILogger logger) - : base(configuration, logger) + public ModuleNameContainer(ModuleNameConfiguration configuration) + : base(configuration) { } } \ No newline at end of file diff --git a/src/Testcontainers.ActiveMq/ArtemisBuilder.cs b/src/Testcontainers.ActiveMq/ArtemisBuilder.cs index 3d41e0be8..afaa7e82f 100644 --- a/src/Testcontainers.ActiveMq/ArtemisBuilder.cs +++ b/src/Testcontainers.ActiveMq/ArtemisBuilder.cs @@ -62,7 +62,7 @@ public ArtemisBuilder WithPassword(string password) public override ArtemisContainer Build() { Validate(); - return new ArtemisContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new ArtemisContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.ActiveMq/ArtemisContainer.cs b/src/Testcontainers.ActiveMq/ArtemisContainer.cs index 2e48cab34..61416d900 100644 --- a/src/Testcontainers.ActiveMq/ArtemisContainer.cs +++ b/src/Testcontainers.ActiveMq/ArtemisContainer.cs @@ -10,9 +10,8 @@ public sealed class ArtemisContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public ArtemisContainer(ActiveMqConfiguration configuration, ILogger logger) - : base(configuration, logger) + public ArtemisContainer(ActiveMqConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.ActiveMq/Usings.cs b/src/Testcontainers.ActiveMq/Usings.cs index c6ee33b57..8e5c20fd5 100644 --- a/src/Testcontainers.ActiveMq/Usings.cs +++ b/src/Testcontainers.ActiveMq/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.ArangoDb/ArangoDbBuilder.cs b/src/Testcontainers.ArangoDb/ArangoDbBuilder.cs index d9d192566..4ca7b499a 100644 --- a/src/Testcontainers.ArangoDb/ArangoDbBuilder.cs +++ b/src/Testcontainers.ArangoDb/ArangoDbBuilder.cs @@ -49,7 +49,7 @@ public ArangoDbBuilder WithPassword(string password) public override ArangoDbContainer Build() { Validate(); - return new ArangoDbContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new ArangoDbContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.ArangoDb/ArangoDbContainer.cs b/src/Testcontainers.ArangoDb/ArangoDbContainer.cs index 5568ccaa3..ae7986855 100644 --- a/src/Testcontainers.ArangoDb/ArangoDbContainer.cs +++ b/src/Testcontainers.ArangoDb/ArangoDbContainer.cs @@ -8,9 +8,8 @@ public sealed class ArangoDbContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public ArangoDbContainer(ArangoDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public ArangoDbContainer(ArangoDbConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.ArangoDb/Usings.cs b/src/Testcontainers.ArangoDb/Usings.cs index c6ee33b57..8e5c20fd5 100644 --- a/src/Testcontainers.ArangoDb/Usings.cs +++ b/src/Testcontainers.ArangoDb/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Azurite/AzuriteBuilder.cs b/src/Testcontainers.Azurite/AzuriteBuilder.cs index 222d0d346..fe733e48b 100644 --- a/src/Testcontainers.Azurite/AzuriteBuilder.cs +++ b/src/Testcontainers.Azurite/AzuriteBuilder.cs @@ -86,7 +86,7 @@ public override AzuriteContainer Build() } var azuriteBuilder = DockerResourceConfiguration.WaitStrategies.Count() > 1 ? this : WithWaitStrategy(waitStrategy); - return new AzuriteContainer(azuriteBuilder.DockerResourceConfiguration, TestcontainersSettings.Logger); + return new AzuriteContainer(azuriteBuilder.DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Azurite/AzuriteContainer.cs b/src/Testcontainers.Azurite/AzuriteContainer.cs index a0fed14eb..ff1dee087 100644 --- a/src/Testcontainers.Azurite/AzuriteContainer.cs +++ b/src/Testcontainers.Azurite/AzuriteContainer.cs @@ -12,9 +12,8 @@ public sealed class AzuriteContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public AzuriteContainer(AzuriteConfiguration configuration, ILogger logger) - : base(configuration, logger) + public AzuriteContainer(AzuriteConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Azurite/Usings.cs b/src/Testcontainers.Azurite/Usings.cs index 428b90761..2607026ed 100644 --- a/src/Testcontainers.Azurite/Usings.cs +++ b/src/Testcontainers.Azurite/Usings.cs @@ -5,5 +5,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.BigQuery/BigQueryBuilder.cs b/src/Testcontainers.BigQuery/BigQueryBuilder.cs index 3d2d66288..985dcf639 100644 --- a/src/Testcontainers.BigQuery/BigQueryBuilder.cs +++ b/src/Testcontainers.BigQuery/BigQueryBuilder.cs @@ -46,7 +46,7 @@ public BigQueryBuilder WithProject(string projectId) public override BigQueryContainer Build() { Validate(); - return new BigQueryContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new BigQueryContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.BigQuery/BigQueryContainer.cs b/src/Testcontainers.BigQuery/BigQueryContainer.cs index 41936520e..9c2a70e51 100644 --- a/src/Testcontainers.BigQuery/BigQueryContainer.cs +++ b/src/Testcontainers.BigQuery/BigQueryContainer.cs @@ -8,9 +8,8 @@ public sealed class BigQueryContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public BigQueryContainer(BigQueryConfiguration configuration, ILogger logger) - : base(configuration, logger) + public BigQueryContainer(BigQueryConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.BigQuery/Usings.cs b/src/Testcontainers.BigQuery/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.BigQuery/Usings.cs +++ b/src/Testcontainers.BigQuery/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Bigtable/BigtableBuilder.cs b/src/Testcontainers.Bigtable/BigtableBuilder.cs index 0a51140af..867487f68 100644 --- a/src/Testcontainers.Bigtable/BigtableBuilder.cs +++ b/src/Testcontainers.Bigtable/BigtableBuilder.cs @@ -34,7 +34,7 @@ private BigtableBuilder(BigtableConfiguration resourceConfiguration) public override BigtableContainer Build() { Validate(); - return new BigtableContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new BigtableContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Bigtable/BigtableContainer.cs b/src/Testcontainers.Bigtable/BigtableContainer.cs index d0bde283d..f9f402aa4 100644 --- a/src/Testcontainers.Bigtable/BigtableContainer.cs +++ b/src/Testcontainers.Bigtable/BigtableContainer.cs @@ -8,9 +8,8 @@ public sealed class BigtableContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public BigtableContainer(IContainerConfiguration configuration, ILogger logger) - : base(configuration, logger) + public BigtableContainer(IContainerConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Bigtable/Usings.cs b/src/Testcontainers.Bigtable/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.Bigtable/Usings.cs +++ b/src/Testcontainers.Bigtable/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.ClickHouse/ClickHouseBuilder.cs b/src/Testcontainers.ClickHouse/ClickHouseBuilder.cs index aafb71d5c..2a4c69387 100644 --- a/src/Testcontainers.ClickHouse/ClickHouseBuilder.cs +++ b/src/Testcontainers.ClickHouse/ClickHouseBuilder.cs @@ -75,7 +75,7 @@ public ClickHouseBuilder WithPassword(string password) public override ClickHouseContainer Build() { Validate(); - return new ClickHouseContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new ClickHouseContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.ClickHouse/ClickHouseContainer.cs b/src/Testcontainers.ClickHouse/ClickHouseContainer.cs index d1bc808ff..a52a749f2 100644 --- a/src/Testcontainers.ClickHouse/ClickHouseContainer.cs +++ b/src/Testcontainers.ClickHouse/ClickHouseContainer.cs @@ -10,9 +10,8 @@ public sealed class ClickHouseContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public ClickHouseContainer(ClickHouseConfiguration configuration, ILogger logger) - : base(configuration, logger) + public ClickHouseContainer(ClickHouseConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.ClickHouse/Usings.cs b/src/Testcontainers.ClickHouse/Usings.cs index fa70e2120..ee2e98dbe 100644 --- a/src/Testcontainers.ClickHouse/Usings.cs +++ b/src/Testcontainers.ClickHouse/Usings.cs @@ -11,5 +11,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.CockroachDb/CockroachDbBuilder.cs b/src/Testcontainers.CockroachDb/CockroachDbBuilder.cs index 414828161..eea0cda4d 100644 --- a/src/Testcontainers.CockroachDb/CockroachDbBuilder.cs +++ b/src/Testcontainers.CockroachDb/CockroachDbBuilder.cs @@ -75,7 +75,7 @@ public CockroachDbBuilder WithPassword(string password) public override CockroachDbContainer Build() { Validate(); - return new CockroachDbContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new CockroachDbContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.CockroachDb/CockroachDbContainer.cs b/src/Testcontainers.CockroachDb/CockroachDbContainer.cs index 84deffa1e..f13c98ea7 100644 --- a/src/Testcontainers.CockroachDb/CockroachDbContainer.cs +++ b/src/Testcontainers.CockroachDb/CockroachDbContainer.cs @@ -10,9 +10,8 @@ public sealed class CockroachDbContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public CockroachDbContainer(CockroachDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public CockroachDbContainer(CockroachDbConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.CockroachDb/Usings.cs b/src/Testcontainers.CockroachDb/Usings.cs index a01abde62..e2b02a51e 100644 --- a/src/Testcontainers.CockroachDb/Usings.cs +++ b/src/Testcontainers.CockroachDb/Usings.cs @@ -10,5 +10,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Consul/ConsulBuilder.cs b/src/Testcontainers.Consul/ConsulBuilder.cs index 6c0ecdaa5..902f10e8e 100644 --- a/src/Testcontainers.Consul/ConsulBuilder.cs +++ b/src/Testcontainers.Consul/ConsulBuilder.cs @@ -36,7 +36,7 @@ private ConsulBuilder(ConsulConfiguration resourceConfiguration) public override ConsulContainer Build() { Validate(); - return new ConsulContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new ConsulContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Consul/ConsulContainer.cs b/src/Testcontainers.Consul/ConsulContainer.cs index 7cb73c250..9d431865b 100644 --- a/src/Testcontainers.Consul/ConsulContainer.cs +++ b/src/Testcontainers.Consul/ConsulContainer.cs @@ -8,9 +8,8 @@ public sealed class ConsulContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public ConsulContainer(ConsulConfiguration configuration, ILogger logger) - : base(configuration, logger) + public ConsulContainer(ConsulConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Consul/Usings.cs b/src/Testcontainers.Consul/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.Consul/Usings.cs +++ b/src/Testcontainers.Consul/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.CosmosDb/CosmosDbBuilder.cs b/src/Testcontainers.CosmosDb/CosmosDbBuilder.cs index d40116625..bde981f22 100644 --- a/src/Testcontainers.CosmosDb/CosmosDbBuilder.cs +++ b/src/Testcontainers.CosmosDb/CosmosDbBuilder.cs @@ -36,7 +36,7 @@ private CosmosDbBuilder(CosmosDbConfiguration resourceConfiguration) public override CosmosDbContainer Build() { Validate(); - return new CosmosDbContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new CosmosDbContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.CosmosDb/CosmosDbContainer.cs b/src/Testcontainers.CosmosDb/CosmosDbContainer.cs index 3f04d5742..b7b0a57d7 100644 --- a/src/Testcontainers.CosmosDb/CosmosDbContainer.cs +++ b/src/Testcontainers.CosmosDb/CosmosDbContainer.cs @@ -8,9 +8,8 @@ public sealed class CosmosDbContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public CosmosDbContainer(CosmosDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public CosmosDbContainer(CosmosDbConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.CosmosDb/Usings.cs b/src/Testcontainers.CosmosDb/Usings.cs index fad310b40..8642a70f5 100644 --- a/src/Testcontainers.CosmosDb/Usings.cs +++ b/src/Testcontainers.CosmosDb/Usings.cs @@ -8,5 +8,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.CouchDb/CouchDbBuilder.cs b/src/Testcontainers.CouchDb/CouchDbBuilder.cs index 5f1ea5ecd..bae17e902 100644 --- a/src/Testcontainers.CouchDb/CouchDbBuilder.cs +++ b/src/Testcontainers.CouchDb/CouchDbBuilder.cs @@ -60,7 +60,7 @@ public CouchDbBuilder WithPassword(string password) public override CouchDbContainer Build() { Validate(); - return new CouchDbContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new CouchDbContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.CouchDb/CouchDbContainer.cs b/src/Testcontainers.CouchDb/CouchDbContainer.cs index 1edfaac56..e75b000e8 100644 --- a/src/Testcontainers.CouchDb/CouchDbContainer.cs +++ b/src/Testcontainers.CouchDb/CouchDbContainer.cs @@ -10,9 +10,8 @@ public sealed class CouchDbContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public CouchDbContainer(CouchDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public CouchDbContainer(CouchDbConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.CouchDb/Usings.cs b/src/Testcontainers.CouchDb/Usings.cs index c6ee33b57..8e5c20fd5 100644 --- a/src/Testcontainers.CouchDb/Usings.cs +++ b/src/Testcontainers.CouchDb/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Couchbase/CouchbaseBuilder.cs b/src/Testcontainers.Couchbase/CouchbaseBuilder.cs index f8ae8eacc..b41a63b99 100644 --- a/src/Testcontainers.Couchbase/CouchbaseBuilder.cs +++ b/src/Testcontainers.Couchbase/CouchbaseBuilder.cs @@ -122,7 +122,7 @@ public override CouchbaseContainer Build() } var couchbaseBuilder = DockerResourceConfiguration.WaitStrategies.Count() > 1 ? this : WithWaitStrategy(waitStrategy); - return new CouchbaseContainer(couchbaseBuilder.DockerResourceConfiguration, TestcontainersSettings.Logger); + return new CouchbaseContainer(couchbaseBuilder.DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Couchbase/CouchbaseContainer.cs b/src/Testcontainers.Couchbase/CouchbaseContainer.cs index 9da54d89c..9c196359c 100644 --- a/src/Testcontainers.Couchbase/CouchbaseContainer.cs +++ b/src/Testcontainers.Couchbase/CouchbaseContainer.cs @@ -10,9 +10,8 @@ public sealed class CouchbaseContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public CouchbaseContainer(CouchbaseConfiguration configuration, ILogger logger) - : base(configuration, logger) + public CouchbaseContainer(CouchbaseConfiguration configuration) + : base(configuration) { _configuration = configuration; Starting += (_, _) => Logger.LogInformation("Couchbase container is starting, performing configuration."); diff --git a/src/Testcontainers.DynamoDb/DynamoDbBuilder.cs b/src/Testcontainers.DynamoDb/DynamoDbBuilder.cs index c5e2e5267..531ef2473 100644 --- a/src/Testcontainers.DynamoDb/DynamoDbBuilder.cs +++ b/src/Testcontainers.DynamoDb/DynamoDbBuilder.cs @@ -34,7 +34,7 @@ private DynamoDbBuilder(DynamoDbConfiguration dockerResourceConfiguration) public override DynamoDbContainer Build() { Validate(); - return new DynamoDbContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new DynamoDbContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.DynamoDb/DynamoDbContainer.cs b/src/Testcontainers.DynamoDb/DynamoDbContainer.cs index 88064d3ea..dfd8c4b83 100644 --- a/src/Testcontainers.DynamoDb/DynamoDbContainer.cs +++ b/src/Testcontainers.DynamoDb/DynamoDbContainer.cs @@ -8,9 +8,8 @@ public sealed class DynamoDbContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public DynamoDbContainer(DynamoDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public DynamoDbContainer(DynamoDbConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.DynamoDb/Usings.cs b/src/Testcontainers.DynamoDb/Usings.cs index 49507dd3e..418bc08bd 100644 --- a/src/Testcontainers.DynamoDb/Usings.cs +++ b/src/Testcontainers.DynamoDb/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Elasticsearch/ElasticsearchBuilder.cs b/src/Testcontainers.Elasticsearch/ElasticsearchBuilder.cs index 6dc19adff..39c78bf50 100644 --- a/src/Testcontainers.Elasticsearch/ElasticsearchBuilder.cs +++ b/src/Testcontainers.Elasticsearch/ElasticsearchBuilder.cs @@ -59,7 +59,7 @@ public ElasticsearchBuilder WithPassword(string password) public override ElasticsearchContainer Build() { Validate(); - return new ElasticsearchContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new ElasticsearchContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Elasticsearch/ElasticsearchContainer.cs b/src/Testcontainers.Elasticsearch/ElasticsearchContainer.cs index 8cc24f9cb..87233e3c1 100644 --- a/src/Testcontainers.Elasticsearch/ElasticsearchContainer.cs +++ b/src/Testcontainers.Elasticsearch/ElasticsearchContainer.cs @@ -10,9 +10,8 @@ public sealed class ElasticsearchContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public ElasticsearchContainer(ElasticsearchConfiguration configuration, ILogger logger) - : base(configuration, logger) + public ElasticsearchContainer(ElasticsearchConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.Elasticsearch/Usings.cs b/src/Testcontainers.Elasticsearch/Usings.cs index 5696bb0bf..292302742 100644 --- a/src/Testcontainers.Elasticsearch/Usings.cs +++ b/src/Testcontainers.Elasticsearch/Usings.cs @@ -8,5 +8,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.EventStoreDb/EventStoreDbBuilder.cs b/src/Testcontainers.EventStoreDb/EventStoreDbBuilder.cs index c48c8d2f3..32377502b 100644 --- a/src/Testcontainers.EventStoreDb/EventStoreDbBuilder.cs +++ b/src/Testcontainers.EventStoreDb/EventStoreDbBuilder.cs @@ -33,7 +33,7 @@ private EventStoreDbBuilder(EventStoreDbConfiguration dockerResourceConfiguratio /// public override EventStoreDbContainer Build() { - return new EventStoreDbContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new EventStoreDbContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.EventStoreDb/EventStoreDbContainer.cs b/src/Testcontainers.EventStoreDb/EventStoreDbContainer.cs index 5f6579155..6d0ddc347 100644 --- a/src/Testcontainers.EventStoreDb/EventStoreDbContainer.cs +++ b/src/Testcontainers.EventStoreDb/EventStoreDbContainer.cs @@ -8,9 +8,8 @@ public sealed class EventStoreDbContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public EventStoreDbContainer(EventStoreDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public EventStoreDbContainer(EventStoreDbConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.EventStoreDb/Usings.cs b/src/Testcontainers.EventStoreDb/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.EventStoreDb/Usings.cs +++ b/src/Testcontainers.EventStoreDb/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.FakeGcsServer/FakeGcsServerBuilder.cs b/src/Testcontainers.FakeGcsServer/FakeGcsServerBuilder.cs index 1dab125cf..31664d075 100644 --- a/src/Testcontainers.FakeGcsServer/FakeGcsServerBuilder.cs +++ b/src/Testcontainers.FakeGcsServer/FakeGcsServerBuilder.cs @@ -36,7 +36,7 @@ private FakeGcsServerBuilder(FakeGcsServerConfiguration dockerResourceConfigurat public override FakeGcsServerContainer Build() { Validate(); - return new FakeGcsServerContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new FakeGcsServerContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.FakeGcsServer/FakeGcsServerContainer.cs b/src/Testcontainers.FakeGcsServer/FakeGcsServerContainer.cs index 40fbc80ae..8eb31f3ca 100644 --- a/src/Testcontainers.FakeGcsServer/FakeGcsServerContainer.cs +++ b/src/Testcontainers.FakeGcsServer/FakeGcsServerContainer.cs @@ -8,9 +8,8 @@ public sealed class FakeGcsServerContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public FakeGcsServerContainer(FakeGcsServerConfiguration configuration, ILogger logger) - : base(configuration, logger) + public FakeGcsServerContainer(FakeGcsServerConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.FakeGcsServer/Usings.cs b/src/Testcontainers.FakeGcsServer/Usings.cs index fd93092b4..4ee39f0be 100644 --- a/src/Testcontainers.FakeGcsServer/Usings.cs +++ b/src/Testcontainers.FakeGcsServer/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs index 19b957eba..fb1f42795 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlBuilder.cs @@ -78,7 +78,7 @@ public FirebirdSqlBuilder WithPassword(string password) public override FirebirdSqlContainer Build() { Validate(); - return new FirebirdSqlContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new FirebirdSqlContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs index f12568949..0c5538fe0 100644 --- a/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs +++ b/src/Testcontainers.FirebirdSql/FirebirdSqlContainer.cs @@ -10,9 +10,8 @@ public sealed class FirebirdSqlContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public FirebirdSqlContainer(FirebirdSqlConfiguration configuration, ILogger logger) - : base(configuration, logger) + public FirebirdSqlContainer(FirebirdSqlConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.FirebirdSql/Usings.cs b/src/Testcontainers.FirebirdSql/Usings.cs index a01abde62..e2b02a51e 100644 --- a/src/Testcontainers.FirebirdSql/Usings.cs +++ b/src/Testcontainers.FirebirdSql/Usings.cs @@ -10,5 +10,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Firestore/FirestoreBuilder.cs b/src/Testcontainers.Firestore/FirestoreBuilder.cs index c2a06c3cd..74ff2e38d 100644 --- a/src/Testcontainers.Firestore/FirestoreBuilder.cs +++ b/src/Testcontainers.Firestore/FirestoreBuilder.cs @@ -34,7 +34,7 @@ private FirestoreBuilder(FirestoreConfiguration resourceConfiguration) public override FirestoreContainer Build() { Validate(); - return new FirestoreContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new FirestoreContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Firestore/FirestoreContainer.cs b/src/Testcontainers.Firestore/FirestoreContainer.cs index c662f9c18..2c90e42e5 100644 --- a/src/Testcontainers.Firestore/FirestoreContainer.cs +++ b/src/Testcontainers.Firestore/FirestoreContainer.cs @@ -8,9 +8,8 @@ public sealed class FirestoreContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public FirestoreContainer(FirestoreConfiguration configuration, ILogger logger) - : base(configuration, logger) + public FirestoreContainer(FirestoreConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Firestore/Usings.cs b/src/Testcontainers.Firestore/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.Firestore/Usings.cs +++ b/src/Testcontainers.Firestore/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.InfluxDb/InfluxDbBuilder.cs b/src/Testcontainers.InfluxDb/InfluxDbBuilder.cs index 527ae75dd..de01dbabd 100644 --- a/src/Testcontainers.InfluxDb/InfluxDbBuilder.cs +++ b/src/Testcontainers.InfluxDb/InfluxDbBuilder.cs @@ -108,7 +108,7 @@ public InfluxDbBuilder WithRetention(string retention) public override InfluxDbContainer Build() { Validate(); - return new InfluxDbContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new InfluxDbContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.InfluxDb/InfluxDbContainer.cs b/src/Testcontainers.InfluxDb/InfluxDbContainer.cs index 7f459e253..29f9efe44 100644 --- a/src/Testcontainers.InfluxDb/InfluxDbContainer.cs +++ b/src/Testcontainers.InfluxDb/InfluxDbContainer.cs @@ -8,9 +8,8 @@ public sealed class InfluxDbContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public InfluxDbContainer(InfluxDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public InfluxDbContainer(InfluxDbConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.InfluxDb/Usings.cs b/src/Testcontainers.InfluxDb/Usings.cs index 3e8ed8e4c..40b1c789a 100644 --- a/src/Testcontainers.InfluxDb/Usings.cs +++ b/src/Testcontainers.InfluxDb/Usings.cs @@ -5,5 +5,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.JanusGraph/JanusGraphBuilder.cs b/src/Testcontainers.JanusGraph/JanusGraphBuilder.cs index 12e3055a8..2b30f7f45 100644 --- a/src/Testcontainers.JanusGraph/JanusGraphBuilder.cs +++ b/src/Testcontainers.JanusGraph/JanusGraphBuilder.cs @@ -34,7 +34,7 @@ private JanusGraphBuilder(JanusGraphConfiguration resourceConfiguration) public override JanusGraphContainer Build() { Validate(); - return new JanusGraphContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new JanusGraphContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.JanusGraph/JanusGraphContainer.cs b/src/Testcontainers.JanusGraph/JanusGraphContainer.cs index 550a86f6b..0896ba0fc 100644 --- a/src/Testcontainers.JanusGraph/JanusGraphContainer.cs +++ b/src/Testcontainers.JanusGraph/JanusGraphContainer.cs @@ -8,9 +8,8 @@ public sealed class JanusGraphContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public JanusGraphContainer(JanusGraphConfiguration configuration, ILogger logger) - : base(configuration, logger) + public JanusGraphContainer(JanusGraphConfiguration configuration) + : base(configuration) { } } \ No newline at end of file diff --git a/src/Testcontainers.JanusGraph/Usings.cs b/src/Testcontainers.JanusGraph/Usings.cs index 238dcb1c1..a2faed446 100644 --- a/src/Testcontainers.JanusGraph/Usings.cs +++ b/src/Testcontainers.JanusGraph/Usings.cs @@ -2,5 +2,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.K3s/K3sBuilder.cs b/src/Testcontainers.K3s/K3sBuilder.cs index abe3ea8b0..6734ebb2c 100644 --- a/src/Testcontainers.K3s/K3sBuilder.cs +++ b/src/Testcontainers.K3s/K3sBuilder.cs @@ -36,7 +36,7 @@ private K3sBuilder(K3sConfiguration resourceConfiguration) public override K3sContainer Build() { Validate(); - return new K3sContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new K3sContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.K3s/K3sContainer.cs b/src/Testcontainers.K3s/K3sContainer.cs index 10ee15e70..aac1ea798 100644 --- a/src/Testcontainers.K3s/K3sContainer.cs +++ b/src/Testcontainers.K3s/K3sContainer.cs @@ -8,9 +8,8 @@ public sealed class K3sContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public K3sContainer(K3sConfiguration configuration, ILogger logger) - : base(configuration, logger) + public K3sContainer(K3sConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.K3s/Usings.cs b/src/Testcontainers.K3s/Usings.cs index 3c3852113..633a735fb 100644 --- a/src/Testcontainers.K3s/Usings.cs +++ b/src/Testcontainers.K3s/Usings.cs @@ -6,5 +6,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Kafka/KafkaBuilder.cs b/src/Testcontainers.Kafka/KafkaBuilder.cs index 39824e925..acb302c89 100644 --- a/src/Testcontainers.Kafka/KafkaBuilder.cs +++ b/src/Testcontainers.Kafka/KafkaBuilder.cs @@ -40,7 +40,7 @@ private KafkaBuilder(KafkaConfiguration resourceConfiguration) public override KafkaContainer Build() { Validate(); - return new KafkaContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new KafkaContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Kafka/KafkaContainer.cs b/src/Testcontainers.Kafka/KafkaContainer.cs index 5a51e4381..41407fa7d 100644 --- a/src/Testcontainers.Kafka/KafkaContainer.cs +++ b/src/Testcontainers.Kafka/KafkaContainer.cs @@ -8,9 +8,8 @@ public sealed class KafkaContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public KafkaContainer(KafkaConfiguration configuration, ILogger logger) - : base(configuration, logger) + public KafkaContainer(KafkaConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Kafka/Usings.cs b/src/Testcontainers.Kafka/Usings.cs index fd93092b4..4ee39f0be 100644 --- a/src/Testcontainers.Kafka/Usings.cs +++ b/src/Testcontainers.Kafka/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Keycloak/KeycloakBuilder.cs b/src/Testcontainers.Keycloak/KeycloakBuilder.cs index 933cbae0a..e61810f01 100644 --- a/src/Testcontainers.Keycloak/KeycloakBuilder.cs +++ b/src/Testcontainers.Keycloak/KeycloakBuilder.cs @@ -60,7 +60,7 @@ public KeycloakBuilder WithPassword(string password) public override KeycloakContainer Build() { Validate(); - return new KeycloakContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new KeycloakContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Keycloak/KeycloakContainer.cs b/src/Testcontainers.Keycloak/KeycloakContainer.cs index 775b14834..526aec6a1 100644 --- a/src/Testcontainers.Keycloak/KeycloakContainer.cs +++ b/src/Testcontainers.Keycloak/KeycloakContainer.cs @@ -8,9 +8,8 @@ public sealed class KeycloakContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public KeycloakContainer(KeycloakConfiguration configuration, ILogger logger) - : base(configuration, logger) + public KeycloakContainer(KeycloakConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Keycloak/Usings.cs b/src/Testcontainers.Keycloak/Usings.cs index c6ee33b57..8e5c20fd5 100644 --- a/src/Testcontainers.Keycloak/Usings.cs +++ b/src/Testcontainers.Keycloak/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Kusto/KustoBuilder.cs b/src/Testcontainers.Kusto/KustoBuilder.cs index bcef295ab..a946ecde1 100644 --- a/src/Testcontainers.Kusto/KustoBuilder.cs +++ b/src/Testcontainers.Kusto/KustoBuilder.cs @@ -38,7 +38,7 @@ private KustoBuilder(KustoConfiguration resourceConfiguration) public override KustoContainer Build() { Validate(); - return new KustoContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new KustoContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Kusto/KustoContainer.cs b/src/Testcontainers.Kusto/KustoContainer.cs index b27b4df0d..05599e180 100644 --- a/src/Testcontainers.Kusto/KustoContainer.cs +++ b/src/Testcontainers.Kusto/KustoContainer.cs @@ -8,9 +8,8 @@ public sealed class KustoContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public KustoContainer(KustoConfiguration configuration, ILogger logger) - : base(configuration, logger) + public KustoContainer(KustoConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Kusto/Usings.cs b/src/Testcontainers.Kusto/Usings.cs index de9f0ad87..1ea451a51 100644 --- a/src/Testcontainers.Kusto/Usings.cs +++ b/src/Testcontainers.Kusto/Usings.cs @@ -5,5 +5,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.LocalStack/LocalStackBuilder.cs b/src/Testcontainers.LocalStack/LocalStackBuilder.cs index d5f605380..f11f88d3e 100644 --- a/src/Testcontainers.LocalStack/LocalStackBuilder.cs +++ b/src/Testcontainers.LocalStack/LocalStackBuilder.cs @@ -34,7 +34,7 @@ private LocalStackBuilder(LocalStackConfiguration dockerResourceConfiguration) public override LocalStackContainer Build() { Validate(); - return new LocalStackContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new LocalStackContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.LocalStack/LocalStackContainer.cs b/src/Testcontainers.LocalStack/LocalStackContainer.cs index 107a613e3..a65f776ea 100644 --- a/src/Testcontainers.LocalStack/LocalStackContainer.cs +++ b/src/Testcontainers.LocalStack/LocalStackContainer.cs @@ -8,9 +8,8 @@ public sealed class LocalStackContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public LocalStackContainer(LocalStackConfiguration configuration, ILogger logger) - : base(configuration, logger) + public LocalStackContainer(LocalStackConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.LocalStack/Usings.cs b/src/Testcontainers.LocalStack/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.LocalStack/Usings.cs +++ b/src/Testcontainers.LocalStack/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.MariaDb/MariaDbBuilder.cs b/src/Testcontainers.MariaDb/MariaDbBuilder.cs index 87da769fc..cbc7c6da7 100644 --- a/src/Testcontainers.MariaDb/MariaDbBuilder.cs +++ b/src/Testcontainers.MariaDb/MariaDbBuilder.cs @@ -78,7 +78,7 @@ public override MariaDbContainer Build() // By default, the base builder waits until the container is running. However, for MariaDb, a more advanced waiting strategy is necessary that requires access to the configured database, username and password. // If the user does not provide a custom waiting strategy, append the default MariaDb waiting strategy. var mariaDbBuilder = DockerResourceConfiguration.WaitStrategies.Count() > 1 ? this : WithWaitStrategy(Wait.ForUnixContainer().AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration))); - return new MariaDbContainer(mariaDbBuilder.DockerResourceConfiguration, TestcontainersSettings.Logger); + return new MariaDbContainer(mariaDbBuilder.DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.MariaDb/MariaDbContainer.cs b/src/Testcontainers.MariaDb/MariaDbContainer.cs index 08b603344..fd3845fa3 100644 --- a/src/Testcontainers.MariaDb/MariaDbContainer.cs +++ b/src/Testcontainers.MariaDb/MariaDbContainer.cs @@ -10,9 +10,8 @@ public sealed class MariaDbContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public MariaDbContainer(MariaDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public MariaDbContainer(MariaDbConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.MariaDb/Usings.cs b/src/Testcontainers.MariaDb/Usings.cs index a01abde62..e2b02a51e 100644 --- a/src/Testcontainers.MariaDb/Usings.cs +++ b/src/Testcontainers.MariaDb/Usings.cs @@ -10,5 +10,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Minio/MinioBuilder.cs b/src/Testcontainers.Minio/MinioBuilder.cs index d3277a04d..184c384b1 100644 --- a/src/Testcontainers.Minio/MinioBuilder.cs +++ b/src/Testcontainers.Minio/MinioBuilder.cs @@ -60,7 +60,7 @@ public MinioBuilder WithPassword(string password) public override MinioContainer Build() { Validate(); - return new MinioContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new MinioContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Minio/MinioContainer.cs b/src/Testcontainers.Minio/MinioContainer.cs index 776b37675..656d577a9 100644 --- a/src/Testcontainers.Minio/MinioContainer.cs +++ b/src/Testcontainers.Minio/MinioContainer.cs @@ -10,9 +10,8 @@ public sealed class MinioContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public MinioContainer(MinioConfiguration configuration, ILogger logger) - : base(configuration, logger) + public MinioContainer(MinioConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.Minio/Usings.cs b/src/Testcontainers.Minio/Usings.cs index c6ee33b57..8e5c20fd5 100644 --- a/src/Testcontainers.Minio/Usings.cs +++ b/src/Testcontainers.Minio/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.MongoDb/MongoDbBuilder.cs b/src/Testcontainers.MongoDb/MongoDbBuilder.cs index 033cd9fdd..b4221b018 100644 --- a/src/Testcontainers.MongoDb/MongoDbBuilder.cs +++ b/src/Testcontainers.MongoDb/MongoDbBuilder.cs @@ -69,7 +69,7 @@ public override MongoDbContainer Build() // provided, the log message "Waiting for connections" appears twice. // If the user does not provide a custom waiting strategy, append the default MongoDb waiting strategy. var mongoDbBuilder = DockerResourceConfiguration.WaitStrategies.Count() > 1 ? this : WithWaitStrategy(Wait.ForUnixContainer().AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration))); - return new MongoDbContainer(mongoDbBuilder.DockerResourceConfiguration, TestcontainersSettings.Logger); + return new MongoDbContainer(mongoDbBuilder.DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.MongoDb/MongoDbContainer.cs b/src/Testcontainers.MongoDb/MongoDbContainer.cs index 88ad50832..b5eb44752 100644 --- a/src/Testcontainers.MongoDb/MongoDbContainer.cs +++ b/src/Testcontainers.MongoDb/MongoDbContainer.cs @@ -10,9 +10,8 @@ public sealed class MongoDbContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public MongoDbContainer(MongoDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public MongoDbContainer(MongoDbConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.MongoDb/Usings.cs b/src/Testcontainers.MongoDb/Usings.cs index a01abde62..e2b02a51e 100644 --- a/src/Testcontainers.MongoDb/Usings.cs +++ b/src/Testcontainers.MongoDb/Usings.cs @@ -10,5 +10,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.MsSql/MsSqlBuilder.cs b/src/Testcontainers.MsSql/MsSqlBuilder.cs index 804dc8e75..402986a81 100644 --- a/src/Testcontainers.MsSql/MsSqlBuilder.cs +++ b/src/Testcontainers.MsSql/MsSqlBuilder.cs @@ -52,7 +52,7 @@ public MsSqlBuilder WithPassword(string password) public override MsSqlContainer Build() { Validate(); - return new MsSqlContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new MsSqlContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.MsSql/MsSqlContainer.cs b/src/Testcontainers.MsSql/MsSqlContainer.cs index 78c8f2c36..626fec38d 100644 --- a/src/Testcontainers.MsSql/MsSqlContainer.cs +++ b/src/Testcontainers.MsSql/MsSqlContainer.cs @@ -10,9 +10,8 @@ public sealed class MsSqlContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public MsSqlContainer(MsSqlConfiguration configuration, ILogger logger) - : base(configuration, logger) + public MsSqlContainer(MsSqlConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.MsSql/Usings.cs b/src/Testcontainers.MsSql/Usings.cs index a01abde62..e2b02a51e 100644 --- a/src/Testcontainers.MsSql/Usings.cs +++ b/src/Testcontainers.MsSql/Usings.cs @@ -10,5 +10,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.MySql/MySqlBuilder.cs b/src/Testcontainers.MySql/MySqlBuilder.cs index 9baba9bac..ac756ec73 100644 --- a/src/Testcontainers.MySql/MySqlBuilder.cs +++ b/src/Testcontainers.MySql/MySqlBuilder.cs @@ -78,7 +78,7 @@ public override MySqlContainer Build() // By default, the base builder waits until the container is running. However, for MySql, a more advanced waiting strategy is necessary that requires access to the configured database, username and password. // If the user does not provide a custom waiting strategy, append the default MySql waiting strategy. var mySqlBuilder = DockerResourceConfiguration.WaitStrategies.Count() > 1 ? this : WithWaitStrategy(Wait.ForUnixContainer().AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration))); - return new MySqlContainer(mySqlBuilder.DockerResourceConfiguration, TestcontainersSettings.Logger); + return new MySqlContainer(mySqlBuilder.DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.MySql/MySqlContainer.cs b/src/Testcontainers.MySql/MySqlContainer.cs index 5b55be35e..001b1fef6 100644 --- a/src/Testcontainers.MySql/MySqlContainer.cs +++ b/src/Testcontainers.MySql/MySqlContainer.cs @@ -10,9 +10,8 @@ public sealed class MySqlContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public MySqlContainer(MySqlConfiguration configuration, ILogger logger) - : base(configuration, logger) + public MySqlContainer(MySqlConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.MySql/Usings.cs b/src/Testcontainers.MySql/Usings.cs index a01abde62..e2b02a51e 100644 --- a/src/Testcontainers.MySql/Usings.cs +++ b/src/Testcontainers.MySql/Usings.cs @@ -10,5 +10,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Nats/NatsBuilder.cs b/src/Testcontainers.Nats/NatsBuilder.cs index 8de672756..eaea58cca 100644 --- a/src/Testcontainers.Nats/NatsBuilder.cs +++ b/src/Testcontainers.Nats/NatsBuilder.cs @@ -60,7 +60,7 @@ public NatsBuilder WithPassword(string password) public override NatsContainer Build() { Validate(); - return new NatsContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new NatsContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Nats/NatsContainer.cs b/src/Testcontainers.Nats/NatsContainer.cs index 0800fe0b5..23d8b2519 100644 --- a/src/Testcontainers.Nats/NatsContainer.cs +++ b/src/Testcontainers.Nats/NatsContainer.cs @@ -10,9 +10,8 @@ public sealed class NatsContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public NatsContainer(NatsConfiguration configuration, ILogger logger) - : base(configuration, logger) + public NatsContainer(NatsConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.Nats/Usings.cs b/src/Testcontainers.Nats/Usings.cs index 346e012e3..f82c6873d 100644 --- a/src/Testcontainers.Nats/Usings.cs +++ b/src/Testcontainers.Nats/Usings.cs @@ -5,5 +5,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Neo4j/Neo4jBuilder.cs b/src/Testcontainers.Neo4j/Neo4jBuilder.cs index f839b3556..54770e961 100644 --- a/src/Testcontainers.Neo4j/Neo4jBuilder.cs +++ b/src/Testcontainers.Neo4j/Neo4jBuilder.cs @@ -36,7 +36,7 @@ private Neo4jBuilder(Neo4jConfiguration resourceConfiguration) public override Neo4jContainer Build() { Validate(); - return new Neo4jContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new Neo4jContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Neo4j/Neo4jContainer.cs b/src/Testcontainers.Neo4j/Neo4jContainer.cs index 267037220..cbc5c7e35 100644 --- a/src/Testcontainers.Neo4j/Neo4jContainer.cs +++ b/src/Testcontainers.Neo4j/Neo4jContainer.cs @@ -8,9 +8,8 @@ public sealed class Neo4jContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public Neo4jContainer(Neo4jConfiguration configuration, ILogger logger) - : base(configuration, logger) + public Neo4jContainer(Neo4jConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Neo4j/Usings.cs b/src/Testcontainers.Neo4j/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.Neo4j/Usings.cs +++ b/src/Testcontainers.Neo4j/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Oracle/OracleBuilder.cs b/src/Testcontainers.Oracle/OracleBuilder.cs index 584bad01b..c5cd3339e 100644 --- a/src/Testcontainers.Oracle/OracleBuilder.cs +++ b/src/Testcontainers.Oracle/OracleBuilder.cs @@ -63,7 +63,7 @@ public OracleBuilder WithPassword(string password) public override OracleContainer Build() { Validate(); - return new OracleContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new OracleContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Oracle/OracleContainer.cs b/src/Testcontainers.Oracle/OracleContainer.cs index e1b1ae4c1..54eac0c72 100644 --- a/src/Testcontainers.Oracle/OracleContainer.cs +++ b/src/Testcontainers.Oracle/OracleContainer.cs @@ -10,9 +10,8 @@ public sealed class OracleContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public OracleContainer(OracleConfiguration configuration, ILogger logger) - : base(configuration, logger) + public OracleContainer(OracleConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.Oracle/Usings.cs b/src/Testcontainers.Oracle/Usings.cs index 648e00a64..6fe3559a7 100644 --- a/src/Testcontainers.Oracle/Usings.cs +++ b/src/Testcontainers.Oracle/Usings.cs @@ -8,5 +8,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Papercut/PapercutBuilder.cs b/src/Testcontainers.Papercut/PapercutBuilder.cs index ecef08c86..c0202b818 100644 --- a/src/Testcontainers.Papercut/PapercutBuilder.cs +++ b/src/Testcontainers.Papercut/PapercutBuilder.cs @@ -36,7 +36,7 @@ private PapercutBuilder(PapercutConfiguration resourceConfiguration) public override PapercutContainer Build() { Validate(); - return new PapercutContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new PapercutContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Papercut/PapercutContainer.cs b/src/Testcontainers.Papercut/PapercutContainer.cs index e73e762e6..2ad934865 100644 --- a/src/Testcontainers.Papercut/PapercutContainer.cs +++ b/src/Testcontainers.Papercut/PapercutContainer.cs @@ -8,9 +8,8 @@ public sealed class PapercutContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public PapercutContainer(PapercutConfiguration configuration, ILogger logger) - : base(configuration, logger) + public PapercutContainer(PapercutConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Papercut/Usings.cs b/src/Testcontainers.Papercut/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.Papercut/Usings.cs +++ b/src/Testcontainers.Papercut/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.PostgreSql/PostgreSqlBuilder.cs b/src/Testcontainers.PostgreSql/PostgreSqlBuilder.cs index c7a0334ac..73ec3a317 100644 --- a/src/Testcontainers.PostgreSql/PostgreSqlBuilder.cs +++ b/src/Testcontainers.PostgreSql/PostgreSqlBuilder.cs @@ -77,7 +77,7 @@ public override PostgreSqlContainer Build() // By default, the base builder waits until the container is running. However, for PostgreSql, a more advanced waiting strategy is necessary that requires access to the configured database and username. // If the user does not provide a custom waiting strategy, append the default PostgreSql waiting strategy. var postgreSqlBuilder = DockerResourceConfiguration.WaitStrategies.Count() > 1 ? this : WithWaitStrategy(Wait.ForUnixContainer().AddCustomWaitStrategy(new WaitUntil(DockerResourceConfiguration))); - return new PostgreSqlContainer(postgreSqlBuilder.DockerResourceConfiguration, TestcontainersSettings.Logger); + return new PostgreSqlContainer(postgreSqlBuilder.DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.PostgreSql/PostgreSqlContainer.cs b/src/Testcontainers.PostgreSql/PostgreSqlContainer.cs index c771e6f11..b4ebdf8a9 100644 --- a/src/Testcontainers.PostgreSql/PostgreSqlContainer.cs +++ b/src/Testcontainers.PostgreSql/PostgreSqlContainer.cs @@ -10,9 +10,8 @@ public sealed class PostgreSqlContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public PostgreSqlContainer(PostgreSqlConfiguration configuration, ILogger logger) - : base(configuration, logger) + public PostgreSqlContainer(PostgreSqlConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.PostgreSql/Usings.cs b/src/Testcontainers.PostgreSql/Usings.cs index a01abde62..e2b02a51e 100644 --- a/src/Testcontainers.PostgreSql/Usings.cs +++ b/src/Testcontainers.PostgreSql/Usings.cs @@ -10,5 +10,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.PubSub/PubSubBuilder.cs b/src/Testcontainers.PubSub/PubSubBuilder.cs index f9c14cef2..3956e8a13 100644 --- a/src/Testcontainers.PubSub/PubSubBuilder.cs +++ b/src/Testcontainers.PubSub/PubSubBuilder.cs @@ -34,7 +34,7 @@ private PubSubBuilder(PubSubConfiguration resourceConfiguration) public override PubSubContainer Build() { Validate(); - return new PubSubContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new PubSubContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.PubSub/PubSubContainer.cs b/src/Testcontainers.PubSub/PubSubContainer.cs index 32b07879f..b3a8e7ec6 100644 --- a/src/Testcontainers.PubSub/PubSubContainer.cs +++ b/src/Testcontainers.PubSub/PubSubContainer.cs @@ -8,9 +8,8 @@ public sealed class PubSubContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public PubSubContainer(PubSubConfiguration configuration, ILogger logger) - : base(configuration, logger) + public PubSubContainer(PubSubConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.PubSub/Usings.cs b/src/Testcontainers.PubSub/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.PubSub/Usings.cs +++ b/src/Testcontainers.PubSub/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.RabbitMq/RabbitMqBuilder.cs b/src/Testcontainers.RabbitMq/RabbitMqBuilder.cs index 6ea51ddfb..5b72bbb95 100644 --- a/src/Testcontainers.RabbitMq/RabbitMqBuilder.cs +++ b/src/Testcontainers.RabbitMq/RabbitMqBuilder.cs @@ -60,7 +60,7 @@ public RabbitMqBuilder WithPassword(string password) public override RabbitMqContainer Build() { Validate(); - return new RabbitMqContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new RabbitMqContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.RabbitMq/RabbitMqContainer.cs b/src/Testcontainers.RabbitMq/RabbitMqContainer.cs index 5f0431099..3e6a0fd95 100644 --- a/src/Testcontainers.RabbitMq/RabbitMqContainer.cs +++ b/src/Testcontainers.RabbitMq/RabbitMqContainer.cs @@ -10,9 +10,8 @@ public sealed class RabbitMqContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public RabbitMqContainer(RabbitMqConfiguration configuration, ILogger logger) - : base(configuration, logger) + public RabbitMqContainer(RabbitMqConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.RabbitMq/Usings.cs b/src/Testcontainers.RabbitMq/Usings.cs index c6ee33b57..8e5c20fd5 100644 --- a/src/Testcontainers.RabbitMq/Usings.cs +++ b/src/Testcontainers.RabbitMq/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.RavenDb/RavenDbBuilder.cs b/src/Testcontainers.RavenDb/RavenDbBuilder.cs index 4c5dfbf98..86fc1435f 100644 --- a/src/Testcontainers.RavenDb/RavenDbBuilder.cs +++ b/src/Testcontainers.RavenDb/RavenDbBuilder.cs @@ -34,7 +34,7 @@ private RavenDbBuilder(RavenDbConfiguration resourceConfiguration) public override RavenDbContainer Build() { Validate(); - return new RavenDbContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new RavenDbContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.RavenDb/RavenDbContainer.cs b/src/Testcontainers.RavenDb/RavenDbContainer.cs index 8252aeb38..62a5ad872 100644 --- a/src/Testcontainers.RavenDb/RavenDbContainer.cs +++ b/src/Testcontainers.RavenDb/RavenDbContainer.cs @@ -8,9 +8,8 @@ public sealed class RavenDbContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public RavenDbContainer(RavenDbConfiguration configuration, ILogger logger) - : base(configuration, logger) + public RavenDbContainer(RavenDbConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.RavenDb/Usings.cs b/src/Testcontainers.RavenDb/Usings.cs index bf2829a65..79fd3af9b 100644 --- a/src/Testcontainers.RavenDb/Usings.cs +++ b/src/Testcontainers.RavenDb/Usings.cs @@ -3,5 +3,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Redis/RedisBuilder.cs b/src/Testcontainers.Redis/RedisBuilder.cs index 41d56b6c1..9c8be98d3 100644 --- a/src/Testcontainers.Redis/RedisBuilder.cs +++ b/src/Testcontainers.Redis/RedisBuilder.cs @@ -34,7 +34,7 @@ private RedisBuilder(RedisConfiguration resourceConfiguration) public override RedisContainer Build() { Validate(); - return new RedisContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new RedisContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Redis/RedisContainer.cs b/src/Testcontainers.Redis/RedisContainer.cs index ec3691919..4c30d0917 100644 --- a/src/Testcontainers.Redis/RedisContainer.cs +++ b/src/Testcontainers.Redis/RedisContainer.cs @@ -8,9 +8,8 @@ public sealed class RedisContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public RedisContainer(RedisConfiguration configuration, ILogger logger) - : base(configuration, logger) + public RedisContainer(RedisConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Redis/Usings.cs b/src/Testcontainers.Redis/Usings.cs index b535a7165..3c22a4545 100644 --- a/src/Testcontainers.Redis/Usings.cs +++ b/src/Testcontainers.Redis/Usings.cs @@ -7,5 +7,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Redpanda/RedpandaBuilder.cs b/src/Testcontainers.Redpanda/RedpandaBuilder.cs index 91cb37069..2a9d38260 100644 --- a/src/Testcontainers.Redpanda/RedpandaBuilder.cs +++ b/src/Testcontainers.Redpanda/RedpandaBuilder.cs @@ -38,7 +38,7 @@ private RedpandaBuilder(RedpandaConfiguration resourceConfiguration) public override RedpandaContainer Build() { Validate(); - return new RedpandaContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new RedpandaContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Redpanda/RedpandaContainer.cs b/src/Testcontainers.Redpanda/RedpandaContainer.cs index 1878f9b76..0ac279353 100644 --- a/src/Testcontainers.Redpanda/RedpandaContainer.cs +++ b/src/Testcontainers.Redpanda/RedpandaContainer.cs @@ -8,9 +8,8 @@ public sealed class RedpandaContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public RedpandaContainer(RedpandaConfiguration configuration, ILogger logger) - : base(configuration, logger) + public RedpandaContainer(RedpandaConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Redpanda/Usings.cs b/src/Testcontainers.Redpanda/Usings.cs index 7752824f3..fd6c6ccbc 100644 --- a/src/Testcontainers.Redpanda/Usings.cs +++ b/src/Testcontainers.Redpanda/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.SqlEdge/SqlEdgeBuilder.cs b/src/Testcontainers.SqlEdge/SqlEdgeBuilder.cs index 01bacc4e1..5c2b0d123 100644 --- a/src/Testcontainers.SqlEdge/SqlEdgeBuilder.cs +++ b/src/Testcontainers.SqlEdge/SqlEdgeBuilder.cs @@ -51,7 +51,7 @@ public SqlEdgeBuilder WithPassword(string password) public override SqlEdgeContainer Build() { Validate(); - return new SqlEdgeContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new SqlEdgeContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.SqlEdge/SqlEdgeContainer.cs b/src/Testcontainers.SqlEdge/SqlEdgeContainer.cs index 17ff0f4f1..d26157cdd 100644 --- a/src/Testcontainers.SqlEdge/SqlEdgeContainer.cs +++ b/src/Testcontainers.SqlEdge/SqlEdgeContainer.cs @@ -10,9 +10,8 @@ public sealed class SqlEdgeContainer : DockerContainer, IDatabaseContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public SqlEdgeContainer(SqlEdgeConfiguration configuration, ILogger logger) - : base(configuration, logger) + public SqlEdgeContainer(SqlEdgeConfiguration configuration) + : base(configuration) { _configuration = configuration; } diff --git a/src/Testcontainers.SqlEdge/Usings.cs b/src/Testcontainers.SqlEdge/Usings.cs index c42d82b9c..d0d26d7b2 100644 --- a/src/Testcontainers.SqlEdge/Usings.cs +++ b/src/Testcontainers.SqlEdge/Usings.cs @@ -5,5 +5,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.WebDriver/Usings.cs b/src/Testcontainers.WebDriver/Usings.cs index 6b26f91d1..00e88cf71 100644 --- a/src/Testcontainers.WebDriver/Usings.cs +++ b/src/Testcontainers.WebDriver/Usings.cs @@ -13,5 +13,4 @@ global using DotNet.Testcontainers.Images; global using DotNet.Testcontainers.Networks; global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; global using Microsoft.Extensions.Logging.Abstractions; \ No newline at end of file diff --git a/src/Testcontainers.WebDriver/WebDriverBuilder.cs b/src/Testcontainers.WebDriver/WebDriverBuilder.cs index 15171b2a9..ed749451a 100644 --- a/src/Testcontainers.WebDriver/WebDriverBuilder.cs +++ b/src/Testcontainers.WebDriver/WebDriverBuilder.cs @@ -88,7 +88,7 @@ public WebDriverBuilder WithRecording() public override WebDriverContainer Build() { Validate(); - return new WebDriverContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new WebDriverContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.WebDriver/WebDriverContainer.cs b/src/Testcontainers.WebDriver/WebDriverContainer.cs index 3c90cbc4e..c279afb5a 100644 --- a/src/Testcontainers.WebDriver/WebDriverContainer.cs +++ b/src/Testcontainers.WebDriver/WebDriverContainer.cs @@ -12,9 +12,8 @@ public sealed class WebDriverContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public WebDriverContainer(WebDriverConfiguration configuration, ILogger logger) - : base(configuration, logger) + public WebDriverContainer(WebDriverConfiguration configuration) + : base(configuration) { _configuration = configuration; _ffmpegContainer = configuration.FFmpegContainer ?? FFmpegContainer.Instance; @@ -110,7 +109,7 @@ static FFmpegContainer() /// Initializes a new instance of the class. /// private FFmpegContainer() - : base(new ContainerConfiguration(new ResourceConfiguration(new DockerEndpointAuthenticationConfiguration(new Uri("tcp://ffmpeg")))), NullLogger.Instance) + : base(new ContainerConfiguration(new ResourceConfiguration(new DockerEndpointAuthenticationConfiguration(new Uri("tcp://ffmpeg")), logger: NullLogger.Instance))) { } diff --git a/src/Testcontainers/Builders/AbstractBuilder`4.cs b/src/Testcontainers/Builders/AbstractBuilder`4.cs index 364bc7b2a..05d05a3c1 100644 --- a/src/Testcontainers/Builders/AbstractBuilder`4.cs +++ b/src/Testcontainers/Builders/AbstractBuilder`4.cs @@ -6,6 +6,7 @@ namespace DotNet.Testcontainers.Builders using DotNet.Testcontainers.Configurations; using DotNet.Testcontainers.Containers; using JetBrains.Annotations; + using Microsoft.Extensions.Logging; /// /// An abstract fluent Docker resource builder. @@ -25,7 +26,6 @@ public abstract class AbstractBuilderThe Docker resource configuration. protected AbstractBuilder(TConfigurationEntity dockerResourceConfiguration) { - _ = TestcontainersSettings.SettingsInitialized.WaitOne(TimeSpan.FromSeconds(5)); } /// @@ -82,6 +82,12 @@ public TBuilderEntity WithCreateParameterModifier(Action return Clone(new ResourceConfiguration(parameterModifiers: parameterModifiers)); } + /// + public TBuilderEntity WithLogger(ILogger logger) + { + return Clone(new ResourceConfiguration(logger: logger)); + } + /// public abstract TResourceEntity Build(); @@ -123,7 +129,7 @@ protected TBuilderEntity WithResourceReaperSessionId(Guid resourceReaperSessionI /// A configured instance of . protected virtual TBuilderEntity Init() { - return WithDockerEndpoint(TestcontainersSettings.OS.DockerEndpointAuthConfig).WithLabel(DefaultLabels.Instance); + return WithDockerEndpoint(TestcontainersSettings.OS.DockerEndpointAuthConfig).WithLabel(DefaultLabels.Instance).WithLogger(ConsoleLogger.Instance); } /// diff --git a/src/Testcontainers/Builders/ContainerBuilder.cs b/src/Testcontainers/Builders/ContainerBuilder.cs index 783f781c6..416640f48 100644 --- a/src/Testcontainers/Builders/ContainerBuilder.cs +++ b/src/Testcontainers/Builders/ContainerBuilder.cs @@ -54,7 +54,7 @@ protected ContainerBuilder(IContainerConfiguration dockerResourceConfiguration) public override IContainer Build() { Validate(); - return new DockerContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new DockerContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers/Builders/IAbstractBuilder`3.cs b/src/Testcontainers/Builders/IAbstractBuilder`3.cs index 12e4cf8b3..aa9a54d55 100644 --- a/src/Testcontainers/Builders/IAbstractBuilder`3.cs +++ b/src/Testcontainers/Builders/IAbstractBuilder`3.cs @@ -5,6 +5,7 @@ namespace DotNet.Testcontainers.Builders using DotNet.Testcontainers.Configurations; using DotNet.Testcontainers.Containers; using JetBrains.Annotations; + using Microsoft.Extensions.Logging; /// /// A fluent Docker resource builder. @@ -107,6 +108,14 @@ public interface IAbstractBuilder parameterModifier); + /// + /// Sets the logger. + /// + /// The logger. + /// A configured instance of . + [PublicAPI] + TBuilderEntity WithLogger(ILogger logger); + /// /// Builds an instance of with the given resource configuration. /// diff --git a/src/Testcontainers/Builders/ImageFromDockerfileBuilder.cs b/src/Testcontainers/Builders/ImageFromDockerfileBuilder.cs index fa7986f8d..27ca60591 100644 --- a/src/Testcontainers/Builders/ImageFromDockerfileBuilder.cs +++ b/src/Testcontainers/Builders/ImageFromDockerfileBuilder.cs @@ -103,7 +103,7 @@ public ImageFromDockerfileBuilder WithBuildArgument(string name, string value) public override IFutureDockerImage Build() { Validate(); - return new FutureDockerImage(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new FutureDockerImage(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers/Builders/NetworkBuilder.cs b/src/Testcontainers/Builders/NetworkBuilder.cs index 42b7a9f60..43b7b957c 100644 --- a/src/Testcontainers/Builders/NetworkBuilder.cs +++ b/src/Testcontainers/Builders/NetworkBuilder.cs @@ -69,7 +69,7 @@ public NetworkBuilder WithOption(string name, string value) public override INetwork Build() { Validate(); - return new DockerNetwork(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new DockerNetwork(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers/Builders/VolumeBuilder.cs b/src/Testcontainers/Builders/VolumeBuilder.cs index 5af8f5941..a56d246d1 100644 --- a/src/Testcontainers/Builders/VolumeBuilder.cs +++ b/src/Testcontainers/Builders/VolumeBuilder.cs @@ -54,7 +54,7 @@ public VolumeBuilder WithName(string name) public override IVolume Build() { Validate(); - return new DockerVolume(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new DockerVolume(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers/Clients/TestcontainersClient.cs b/src/Testcontainers/Clients/TestcontainersClient.cs index e6852f95a..a582def62 100644 --- a/src/Testcontainers/Clients/TestcontainersClient.cs +++ b/src/Testcontainers/Clients/TestcontainersClient.cs @@ -286,6 +286,9 @@ public async Task ReadFileAsync(string id, string filePath, Cancellation /// public async Task RunAsync(IContainerConfiguration configuration, CancellationToken ct = default) { + await configuration.Logger.DockerRuntimeInfoAsync(configuration.DockerEndpointAuthConfig) + .ConfigureAwait(false); + if (TestcontainersSettings.ResourceReaperEnabled && ResourceReaper.DefaultSessionId.Equals(configuration.SessionId)) { var isWindowsEngineEnabled = await System.GetIsWindowsEngineEnabled(ct) diff --git a/src/Testcontainers/Configurations/Commons/IResourceConfiguration.cs b/src/Testcontainers/Configurations/Commons/IResourceConfiguration.cs index eaf7f720c..9d8a174cc 100644 --- a/src/Testcontainers/Configurations/Commons/IResourceConfiguration.cs +++ b/src/Testcontainers/Configurations/Commons/IResourceConfiguration.cs @@ -3,6 +3,7 @@ namespace DotNet.Testcontainers.Configurations using System; using System.Collections.Generic; using JetBrains.Annotations; + using Microsoft.Extensions.Logging; /// /// A resource configuration. @@ -40,5 +41,10 @@ public interface IResourceConfiguration /// Gets the reuse hash. /// string GetReuseHash(); + + /// + /// Gets the logger. + /// + ILogger Logger { get; } } } diff --git a/src/Testcontainers/Configurations/Commons/ResourceConfiguration.cs b/src/Testcontainers/Configurations/Commons/ResourceConfiguration.cs index 0fa813bdf..553b66fa3 100644 --- a/src/Testcontainers/Configurations/Commons/ResourceConfiguration.cs +++ b/src/Testcontainers/Configurations/Commons/ResourceConfiguration.cs @@ -8,6 +8,7 @@ namespace DotNet.Testcontainers.Configurations using DotNet.Testcontainers.Builders; using DotNet.Testcontainers.Containers; using JetBrains.Annotations; + using Microsoft.Extensions.Logging; /// [PublicAPI] @@ -20,17 +21,20 @@ public class ResourceConfiguration : IResourceConfigurati /// The test session id. /// A list of low level modifications of the Docker.DotNet entity. /// A value indicating whether to reuse an existing resource configuration or not. + /// The logger. public ResourceConfiguration( IDockerEndpointAuthenticationConfiguration dockerEndpointAuthenticationConfiguration = null, IReadOnlyDictionary labels = null, IReadOnlyList> parameterModifiers = null, - bool? reuse = null) + bool? reuse = null, + ILogger logger = null) { SessionId = labels != null && labels.TryGetValue(ResourceReaper.ResourceReaperSessionLabel, out var resourceReaperSessionId) && Guid.TryParseExact(resourceReaperSessionId, "D", out var sessionId) ? sessionId : Guid.Empty; DockerEndpointAuthConfig = dockerEndpointAuthenticationConfiguration; Labels = labels; ParameterModifiers = parameterModifiers; Reuse = reuse; + Logger = logger; } /// @@ -52,7 +56,8 @@ protected ResourceConfiguration(IResourceConfiguration ol dockerEndpointAuthenticationConfiguration: BuildConfiguration.Combine(oldValue.DockerEndpointAuthConfig, newValue.DockerEndpointAuthConfig), labels: BuildConfiguration.Combine(oldValue.Labels, newValue.Labels), parameterModifiers: BuildConfiguration.Combine(oldValue.ParameterModifiers, newValue.ParameterModifiers), - reuse: (oldValue.Reuse.HasValue && oldValue.Reuse.Value) || (newValue.Reuse.HasValue && newValue.Reuse.Value)) + reuse: (oldValue.Reuse.HasValue && oldValue.Reuse.Value) || (newValue.Reuse.HasValue && newValue.Reuse.Value), + logger: BuildConfiguration.Combine(oldValue.Logger, newValue.Logger)) { } @@ -86,5 +91,8 @@ public virtual string GetReuseHash() return Convert.ToBase64String(sha1.ComputeHash(jsonUtf8Bytes)); } } + + /// + public ILogger Logger { get; } } } diff --git a/src/Testcontainers/Configurations/TestcontainersSettings.cs b/src/Testcontainers/Configurations/TestcontainersSettings.cs index d565b61b4..ca4c0d38a 100644 --- a/src/Testcontainers/Configurations/TestcontainersSettings.cs +++ b/src/Testcontainers/Configurations/TestcontainersSettings.cs @@ -2,10 +2,8 @@ namespace DotNet.Testcontainers.Configurations { using System; using System.Collections.Generic; - using System.Globalization; using System.Linq; using System.Runtime.InteropServices; - using System.Text; using System.Threading; using System.Threading.Tasks; using DotNet.Testcontainers.Builders; @@ -20,7 +18,7 @@ namespace DotNet.Testcontainers.Configurations [PublicAPI] public static class TestcontainersSettings { - private static readonly ManualResetEventSlim ManualResetEvent = new ManualResetEventSlim(false); + private static readonly ManualResetEventSlim ManualResetEvent = new ManualResetEventSlim(true); [CanBeNull] private static readonly IDockerEndpointAuthenticationProvider DockerEndpointAuthProvider @@ -42,68 +40,6 @@ private static readonly IDockerEndpointAuthenticationProvider DockerEndpointAuth private static readonly IDockerEndpointAuthenticationConfiguration DockerEndpointAuthConfig = DockerEndpointAuthProvider?.GetAuthConfig(); - static TestcontainersSettings() - { - Task.Run(async () => - { - var runtimeInfo = new StringBuilder(); - - if (DockerEndpointAuthConfig != null) - { - using (var dockerClientConfiguration = DockerEndpointAuthConfig.GetDockerClientConfiguration()) - { - using (var dockerClient = dockerClientConfiguration.CreateClient()) - { - try - { - var byteUnits = new[] { "KB", "MB", "GB" }; - - var dockerInfo = await dockerClient.System.GetSystemInfoAsync() - .ConfigureAwait(false); - - var dockerVersion = await dockerClient.System.GetVersionAsync() - .ConfigureAwait(false); - - runtimeInfo.AppendLine("Connected to Docker:"); - - runtimeInfo.Append(" Host: "); - runtimeInfo.AppendLine(dockerClient.Configuration.EndpointBaseUri.ToString()); - - runtimeInfo.Append(" Server Version: "); - runtimeInfo.AppendLine(dockerInfo.ServerVersion); - - runtimeInfo.Append(" Kernel Version: "); - runtimeInfo.AppendLine(dockerInfo.KernelVersion); - - runtimeInfo.Append(" API Version: "); - runtimeInfo.AppendLine(dockerVersion.APIVersion); - - runtimeInfo.Append(" Operating System: "); - runtimeInfo.AppendLine(dockerInfo.OperatingSystem); - - runtimeInfo.Append(" Total Memory: "); - runtimeInfo.AppendFormat(CultureInfo.InvariantCulture, "{0:F} {1}", dockerInfo.MemTotal / Math.Pow(1024, byteUnits.Length), byteUnits[byteUnits.Length - 1]); - } - catch - { - // Ignore exceptions in auto discovery. Users can provide the Docker endpoint with the builder too. - } - } - } - } - else - { - runtimeInfo.AppendLine("Auto discovery did not detect a Docker host configuration"); - } - -#pragma warning disable CA1848, CA2254 - Logger.LogInformation(runtimeInfo.ToString()); -#pragma warning restore CA1848, CA2254 - - ManualResetEvent.Set(); - }); - } - /// /// Gets or sets the Docker host override value. /// @@ -167,6 +103,7 @@ static TestcontainersSettings() /// Gets or sets the logger. /// [NotNull] + [Obsolete("The logger is now configured per resource by calling WithLogger(ILogger logger) in the builder.")] public static ILogger Logger { get; set; } = ConsoleLogger.Instance; @@ -181,6 +118,7 @@ static TestcontainersSettings() /// Gets the wait handle that signals settings initialized. /// [NotNull] + [Obsolete("This wait handle is not used anymore.")] public static WaitHandle SettingsInitialized => ManualResetEvent.WaitHandle; diff --git a/src/Testcontainers/Containers/DockerContainer.cs b/src/Testcontainers/Containers/DockerContainer.cs index 3afaffc82..9ce68f8f0 100644 --- a/src/Testcontainers/Containers/DockerContainer.cs +++ b/src/Testcontainers/Containers/DockerContainer.cs @@ -32,12 +32,10 @@ public class DockerContainer : Resource, IContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public DockerContainer(IContainerConfiguration configuration, ILogger logger) + public DockerContainer(IContainerConfiguration configuration) { - _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, logger); + _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, configuration.Logger); _configuration = configuration; - Logger = logger; } /// @@ -59,7 +57,7 @@ public DockerContainer(IContainerConfiguration configuration, ILogger logger) public event EventHandler Stopped; /// - public ILogger Logger { get; } + public ILogger Logger => _configuration.Logger; /// public DateTime CreatedTime { get; private set; } diff --git a/src/Testcontainers/Containers/PortForwarding.cs b/src/Testcontainers/Containers/PortForwarding.cs index 2ebec57f2..0fa61a035 100644 --- a/src/Testcontainers/Containers/PortForwarding.cs +++ b/src/Testcontainers/Containers/PortForwarding.cs @@ -9,7 +9,6 @@ namespace DotNet.Testcontainers.Containers using DotNet.Testcontainers.Builders; using DotNet.Testcontainers.Configurations; using JetBrains.Annotations; - using Microsoft.Extensions.Logging; using Renci.SshNet; /// @@ -26,9 +25,8 @@ static PortForwardingContainer() /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - private PortForwardingContainer(PortForwardingConfiguration configuration, ILogger logger) - : base(configuration, logger) + private PortForwardingContainer(PortForwardingConfiguration configuration) + : base(configuration) { _configuration = configuration; } @@ -107,7 +105,7 @@ public override PortForwardingContainer Build() // instance of the port forwarding container. To improve the user experience, it // is preferable to stop supporting `WithDockerEndpoint(string)` and instead rely // on the environment variables or the properties file custom configurations. - return DockerResourceConfiguration.DockerEndpointAuthConfig == null ? null : new PortForwardingContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return DockerResourceConfiguration.DockerEndpointAuthConfig == null ? null : new PortForwardingContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers/Images/FutureDockerImage.cs b/src/Testcontainers/Images/FutureDockerImage.cs index 211c690b2..12c888d48 100644 --- a/src/Testcontainers/Images/FutureDockerImage.cs +++ b/src/Testcontainers/Images/FutureDockerImage.cs @@ -6,7 +6,6 @@ namespace DotNet.Testcontainers.Images using DotNet.Testcontainers.Clients; using DotNet.Testcontainers.Configurations; using JetBrains.Annotations; - using Microsoft.Extensions.Logging; /// [PublicAPI] @@ -22,10 +21,9 @@ internal sealed class FutureDockerImage : Resource, IFutureDockerImage /// Initializes a new instance of the class. /// /// The image configuration. - /// The logger. - public FutureDockerImage(IImageFromDockerfileConfiguration configuration, ILogger logger) + public FutureDockerImage(IImageFromDockerfileConfiguration configuration) { - _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, logger); + _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, configuration.Logger); _configuration = configuration; } diff --git a/src/Testcontainers/Logging.cs b/src/Testcontainers/Logging.cs index 8e1d5b07a..2dac659a8 100644 --- a/src/Testcontainers/Logging.cs +++ b/src/Testcontainers/Logging.cs @@ -4,6 +4,8 @@ namespace DotNet.Testcontainers using System.Collections.Generic; using System.Text.Json; using System.Text.RegularExpressions; + using System.Threading.Tasks; + using DotNet.Testcontainers.Configurations; using DotNet.Testcontainers.Images; using Microsoft.Extensions.Logging; @@ -11,6 +13,19 @@ internal static class Logging { #pragma warning disable InconsistentNaming, SA1309 + private static readonly Action _DockerRuntimeInfo + = LoggerMessage.Define(LogLevel.Information, default, + "Connected to Docker" + Environment.NewLine + + " Host: {Host}" + Environment.NewLine + + " Server Version: {ServerVersion}" + Environment.NewLine + + " Kernel Version: {KernelVersion}" + Environment.NewLine + + " API Version: {APIVersion}" + Environment.NewLine + + " Operating System: {OperatingSystem}" + Environment.NewLine + + " Total Memory: {TotalMemory}"); + + private static readonly Action _DockerRuntimeError + = LoggerMessage.Define(LogLevel.Error, default, "Failed to get Docker runtime information: {Exception}"); + private static readonly Action _IgnorePatternAdded = LoggerMessage.Define(LogLevel.Information, default, "Pattern {IgnorePattern} added to the regex cache"); @@ -112,6 +127,30 @@ private static readonly Action _ReusableResourceNotFound #pragma warning restore InconsistentNaming, SA1309 + public static async Task DockerRuntimeInfoAsync(this ILogger logger, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig) + { + try + { + using (var dockerClientConfiguration = dockerEndpointAuthConfig.GetDockerClientConfiguration()) + { + using (var dockerClient = dockerClientConfiguration.CreateClient()) + { + var dockerInfo = await dockerClient.System.GetSystemInfoAsync() + .ConfigureAwait(false); + var dockerVersion = await dockerClient.System.GetVersionAsync() + .ConfigureAwait(false); + var byteUnits = new[] { "KB", "MB", "GB" }; + var totalMemory = FormattableString.Invariant($"{dockerInfo.MemTotal / Math.Pow(1024, byteUnits.Length):F} {byteUnits[byteUnits.Length - 1]}"); + _DockerRuntimeInfo(logger, dockerClient.Configuration.EndpointBaseUri, dockerInfo.ServerVersion, dockerInfo.KernelVersion, dockerVersion.APIVersion, dockerInfo.OperatingSystem, totalMemory, null); + } + } + } + catch (Exception exception) + { + _DockerRuntimeError(logger, exception, exception); + } + } + public static void IgnorePatternAdded(this ILogger logger, Regex ignorePattern) { _IgnorePatternAdded(logger, ignorePattern, null); diff --git a/src/Testcontainers/Networks/DockerNetwork.cs b/src/Testcontainers/Networks/DockerNetwork.cs index d17c66b3f..5dab5d363 100644 --- a/src/Testcontainers/Networks/DockerNetwork.cs +++ b/src/Testcontainers/Networks/DockerNetwork.cs @@ -27,12 +27,11 @@ internal sealed class DockerNetwork : Resource, INetwork /// Initializes a new instance of the class. /// /// The network configuration. - /// The logger. - public DockerNetwork(INetworkConfiguration configuration, ILogger logger) + public DockerNetwork(INetworkConfiguration configuration) { - _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, logger); + _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, configuration.Logger); _configuration = configuration; - _logger = logger; + _logger = configuration.Logger; } /// diff --git a/src/Testcontainers/Volumes/DockerVolume.cs b/src/Testcontainers/Volumes/DockerVolume.cs index bd78c9242..73c5199ed 100644 --- a/src/Testcontainers/Volumes/DockerVolume.cs +++ b/src/Testcontainers/Volumes/DockerVolume.cs @@ -27,12 +27,11 @@ internal sealed class DockerVolume : Resource, IVolume /// Initializes a new instance of the class. /// /// The volume configuration. - /// The logger. - public DockerVolume(IVolumeConfiguration configuration, ILogger logger) + public DockerVolume(IVolumeConfiguration configuration) { - _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, logger); + _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, configuration.Logger); _configuration = configuration; - _logger = logger; + _logger = configuration.Logger; } /// From e535cbec9dacc98a499efdcaaa6883f9db83f8cf Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Tue, 27 Feb 2024 20:08:55 +0100 Subject: [PATCH 02/12] refactor: Log runtime information once per logger, add LoggerTest class --- Directory.Packages.props | 1 + .../WebDriverContainer.cs | 2 +- .../Builders/AbstractBuilder`4.cs | 3 + src/Testcontainers/Clients/DockerApiClient.cs | 124 ++++++++++++++++-- .../Clients/DockerContainerOperations.cs | 55 ++++---- .../Clients/DockerImageOperations.cs | 23 ++-- .../Clients/DockerNetworkOperations.cs | 23 ++-- .../Clients/DockerSystemOperations.cs | 7 +- .../Clients/DockerVolumeOperations.cs | 19 ++- .../Clients/TestcontainersClient.cs | 3 - .../Commons/IResourceConfiguration.cs | 14 +- .../Commons/ResourceConfiguration.cs | 15 ++- .../Configurations/TestcontainersSettings.cs | 8 +- src/Testcontainers/Configurations/Unix.cs | 4 + src/Testcontainers/Configurations/Windows.cs | 4 + .../Containers/DockerContainer.cs | 12 +- src/Testcontainers/Containers/IContainer.cs | 12 +- src/Testcontainers/Logging.cs | 39 ------ src/Testcontainers/Networks/DockerNetwork.cs | 10 +- src/Testcontainers/Volumes/DockerVolume.cs | 10 +- .../LoggerTest.cs | 104 +++++++++++++++ ...Testcontainers.Platform.Linux.Tests.csproj | 1 + .../Usings.cs | 6 +- 23 files changed, 337 insertions(+), 162 deletions(-) create mode 100644 tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 6eeb39533..7e1e9bfc2 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -15,6 +15,7 @@ + diff --git a/src/Testcontainers.WebDriver/WebDriverContainer.cs b/src/Testcontainers.WebDriver/WebDriverContainer.cs index c279afb5a..dabf9ea9c 100644 --- a/src/Testcontainers.WebDriver/WebDriverContainer.cs +++ b/src/Testcontainers.WebDriver/WebDriverContainer.cs @@ -109,7 +109,7 @@ static FFmpegContainer() /// Initializes a new instance of the class. /// private FFmpegContainer() - : base(new ContainerConfiguration(new ResourceConfiguration(new DockerEndpointAuthenticationConfiguration(new Uri("tcp://ffmpeg")), logger: NullLogger.Instance))) + : base(new ContainerConfiguration(new ResourceConfiguration(new DockerEndpointAuthenticationConfiguration(new Uri("tcp://ffmpeg")), null, null, false, NullLogger.Instance))) { } diff --git a/src/Testcontainers/Builders/AbstractBuilder`4.cs b/src/Testcontainers/Builders/AbstractBuilder`4.cs index 05d05a3c1..6af5ceb79 100644 --- a/src/Testcontainers/Builders/AbstractBuilder`4.cs +++ b/src/Testcontainers/Builders/AbstractBuilder`4.cs @@ -138,6 +138,9 @@ protected virtual TBuilderEntity Init() /// Thrown when a mandatory Docker resource configuration is not set. protected virtual void Validate() { + _ = Guard.Argument(DockerResourceConfiguration.Logger, nameof(IResourceConfiguration.Logger)) + .NotNull(); + const string containerRuntimeNotFound = "Docker is either not running or misconfigured. Please ensure that Docker is running and that the endpoint is properly configured. You can customize your configuration using either the environment variables or the ~/.testcontainers.properties file. For more information, visit:\nhttps://dotnet.testcontainers.org/custom_configuration/"; _ = Guard.Argument(DockerResourceConfiguration.DockerEndpointAuthConfig, nameof(IResourceConfiguration.DockerEndpointAuthConfig)) .ThrowIf(argument => argument.Value == null, argument => new ArgumentException(containerRuntimeNotFound, argument.Name)); diff --git a/src/Testcontainers/Clients/DockerApiClient.cs b/src/Testcontainers/Clients/DockerApiClient.cs index c5a7b55b1..c03dba406 100644 --- a/src/Testcontainers/Clients/DockerApiClient.cs +++ b/src/Testcontainers/Clients/DockerApiClient.cs @@ -2,27 +2,129 @@ namespace DotNet.Testcontainers.Clients { using System; using System.Collections.Concurrent; + using System.Collections.Generic; + using System.Globalization; + using System.Text; + using System.Threading; + using System.Threading.Tasks; using Docker.DotNet; using DotNet.Testcontainers.Configurations; + using JetBrains.Annotations; + using Microsoft.Extensions.Logging; - internal abstract class DockerApiClient + /// + /// A Docker Engine API client. + /// + internal class DockerApiClient { private static readonly ConcurrentDictionary> Clients = new ConcurrentDictionary>(); - protected DockerApiClient(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig) + private static readonly ISet ProcessedHashCodes = new HashSet(); + + private static readonly SemaphoreSlim RuntimeInitialized = new SemaphoreSlim(1, 1); + + /// + /// Initializes a new instance of the class. + /// + /// The test session id. + /// The Docker endpoint authentication configuration. + /// The logger. + protected DockerApiClient(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, ILogger logger) + : this(Clients.GetOrAdd(dockerEndpointAuthConfig.Endpoint, _ => new Lazy(() => GetDockerClient(sessionId, dockerEndpointAuthConfig))).Value, logger) { - var lazyDockerClient = Clients.GetOrAdd(dockerEndpointAuthConfig.Endpoint, _ => - new Lazy(() => + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker Engine API client. + /// The logger. + protected DockerApiClient(IDockerClient dockerClient, ILogger logger) + { + DockerClient = dockerClient; + Logger = logger; + } + + /// + /// Gets the Docker Engine API client. + /// + [NotNull] + protected IDockerClient DockerClient { get; } + + /// + /// Gets the logger. + /// + [NotNull] + protected ILogger Logger { get; } + + /// + /// + /// + /// Cancellation token. + /// + protected async Task LogContainerRuntimeInfoAsync(CancellationToken ct = default) + { + var hashCode = Logger.GetHashCode(); + + await RuntimeInitialized.WaitAsync(ct) + .ConfigureAwait(false); + + try + { + if (ProcessedHashCodes.Contains(hashCode)) { - using (var dockerClientConfiguration = dockerEndpointAuthConfig.GetDockerClientConfiguration(sessionId)) - { - return dockerClientConfiguration.CreateClient(); - } - })); + return; + } + + var runtimeInfo = new StringBuilder(); - Docker = lazyDockerClient.Value; + var byteUnits = new[] { "KB", "MB", "GB" }; + + var dockerInfo = await DockerClient.System.GetSystemInfoAsync(ct) + .ConfigureAwait(false); + + var dockerVersion = await DockerClient.System.GetVersionAsync(ct) + .ConfigureAwait(false); + + runtimeInfo.AppendLine("Connected to Docker:"); + + runtimeInfo.Append(" Host: "); + runtimeInfo.AppendLine(DockerClient.Configuration.EndpointBaseUri.ToString()); + + runtimeInfo.Append(" Server Version: "); + runtimeInfo.AppendLine(dockerInfo.ServerVersion); + + runtimeInfo.Append(" Kernel Version: "); + runtimeInfo.AppendLine(dockerInfo.KernelVersion); + + runtimeInfo.Append(" API Version: "); + runtimeInfo.AppendLine(dockerVersion.APIVersion); + + runtimeInfo.Append(" Operating System: "); + runtimeInfo.AppendLine(dockerInfo.OperatingSystem); + + runtimeInfo.Append(" Total Memory: "); + runtimeInfo.AppendFormat(CultureInfo.InvariantCulture, "{0:F} {1}", dockerInfo.MemTotal / Math.Pow(1024, byteUnits.Length), byteUnits[byteUnits.Length - 1]); + + Logger.LogInformation(runtimeInfo.ToString()); + } + catch(Exception e) + { + Logger.LogError(e, "Failed to retrieve Docker container runtime information."); + } + finally + { + ProcessedHashCodes.Add(hashCode); + RuntimeInitialized.Release(); + } } - protected IDockerClient Docker { get; } + private static IDockerClient GetDockerClient(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig) + { + using (var dockerClientConfiguration = dockerEndpointAuthConfig.GetDockerClientConfiguration(sessionId)) + { + return dockerClientConfiguration.CreateClient(); + } + } } } diff --git a/src/Testcontainers/Clients/DockerContainerOperations.cs b/src/Testcontainers/Clients/DockerContainerOperations.cs index f30d9feb0..9c8b934a5 100644 --- a/src/Testcontainers/Clients/DockerContainerOperations.cs +++ b/src/Testcontainers/Clients/DockerContainerOperations.cs @@ -14,23 +14,20 @@ namespace DotNet.Testcontainers.Clients internal sealed class DockerContainerOperations : DockerApiClient, IDockerContainerOperations { - private readonly ILogger _logger; - public DockerContainerOperations(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, ILogger logger) - : base(sessionId, dockerEndpointAuthConfig) + : base(sessionId, dockerEndpointAuthConfig, logger) { - _logger = logger; } public async Task> GetAllAsync(CancellationToken ct = default) { - return await Docker.Containers.ListContainersAsync(new ContainersListParameters { All = true }, ct) + return await DockerClient.Containers.ListContainersAsync(new ContainersListParameters { All = true }, ct) .ConfigureAwait(false); } public async Task> GetAllAsync(FilterByProperty filters, CancellationToken ct = default) { - return await Docker.Containers.ListContainersAsync(new ContainersListParameters { All = true, Filters = filters }, ct) + return await DockerClient.Containers.ListContainersAsync(new ContainersListParameters { All = true, Filters = filters }, ct) .ConfigureAwait(false); } @@ -38,7 +35,7 @@ public async Task ByIdAsync(string id, CancellationTok { try { - return await Docker.Containers.InspectContainerAsync(id, ct) + return await DockerClient.Containers.InspectContainerAsync(id, ct) .ConfigureAwait(false); } catch (DockerApiException) @@ -57,7 +54,7 @@ public async Task ExistsWithIdAsync(string id, CancellationToken ct = defa public async Task GetExitCodeAsync(string id, CancellationToken ct = default) { - var response = await Docker.Containers.WaitContainerAsync(id, ct) + var response = await DockerClient.Containers.WaitContainerAsync(id, ct) .ConfigureAwait(false); return response.StatusCode; @@ -74,7 +71,7 @@ public async Task GetExitCodeAsync(string id, CancellationToken ct = defau Timestamps = timestampsEnabled, }; - using (var stdOutAndErrStream = await Docker.Containers.GetContainerLogsAsync(id, false, logsParameters, ct) + using (var stdOutAndErrStream = await DockerClient.Containers.GetContainerLogsAsync(id, false, logsParameters, ct) .ConfigureAwait(false)) { return await stdOutAndErrStream.ReadOutputToEndAsync(ct) @@ -84,33 +81,33 @@ public async Task GetExitCodeAsync(string id, CancellationToken ct = defau public Task StartAsync(string id, CancellationToken ct = default) { - _logger.StartDockerContainer(id); - return Docker.Containers.StartContainerAsync(id, new ContainerStartParameters(), ct); + Logger.StartDockerContainer(id); + return DockerClient.Containers.StartContainerAsync(id, new ContainerStartParameters(), ct); } public Task StopAsync(string id, CancellationToken ct = default) { - _logger.StopDockerContainer(id); - return Docker.Containers.StopContainerAsync(id, new ContainerStopParameters { WaitBeforeKillSeconds = 15 }, ct); + Logger.StopDockerContainer(id); + return DockerClient.Containers.StopContainerAsync(id, new ContainerStopParameters { WaitBeforeKillSeconds = 15 }, ct); } public Task RemoveAsync(string id, CancellationToken ct = default) { - _logger.DeleteDockerContainer(id); - return Docker.Containers.RemoveContainerAsync(id, new ContainerRemoveParameters { Force = true, RemoveVolumes = true }, ct); + Logger.DeleteDockerContainer(id); + return DockerClient.Containers.RemoveContainerAsync(id, new ContainerRemoveParameters { Force = true, RemoveVolumes = true }, ct); } public Task ExtractArchiveToContainerAsync(string id, string path, TarOutputMemoryStream tarStream, CancellationToken ct = default) { - _logger.CopyArchiveToDockerContainer(id, tarStream.ContentLength); - return Docker.Containers.ExtractArchiveToContainerAsync(id, new ContainerPathStatParameters { Path = path, AllowOverwriteDirWithFile = false }, tarStream, ct); + Logger.CopyArchiveToDockerContainer(id, tarStream.ContentLength); + return DockerClient.Containers.ExtractArchiveToContainerAsync(id, new ContainerPathStatParameters { Path = path, AllowOverwriteDirWithFile = false }, tarStream, ct); } public async Task GetArchiveFromContainerAsync(string id, string path, CancellationToken ct = default) { - _logger.ReadArchiveFromDockerContainer(id, path); + Logger.ReadArchiveFromDockerContainer(id, path); - var tarResponse = await Docker.Containers.GetArchiveFromContainerAsync(id, new GetArchiveFromContainerParameters { Path = path }, false, ct) + var tarResponse = await DockerClient.Containers.GetArchiveFromContainerAsync(id, new GetArchiveFromContainerParameters { Path = path }, false, ct) .ConfigureAwait(false); return tarResponse.Stream; @@ -123,7 +120,7 @@ public async Task AttachAsync(string id, IOutputConsumer outputConsumer, Cancell return; } - _logger.AttachToDockerContainer(id, outputConsumer.GetType()); + Logger.AttachToDockerContainer(id, outputConsumer.GetType()); var attachParameters = new ContainerAttachParameters { @@ -132,7 +129,7 @@ public async Task AttachAsync(string id, IOutputConsumer outputConsumer, Cancell Stream = true, }; - var stream = await Docker.Containers.AttachContainerAsync(id, false, attachParameters, ct) + var stream = await DockerClient.Containers.AttachContainerAsync(id, false, attachParameters, ct) .ConfigureAwait(false); _ = stream.CopyOutputToAsync(Stream.Null, outputConsumer.Stdout, outputConsumer.Stderr, ct) @@ -141,7 +138,7 @@ public async Task AttachAsync(string id, IOutputConsumer outputConsumer, Cancell public async Task ExecAsync(string id, IList command, CancellationToken ct = default) { - _logger.ExecuteCommandInDockerContainer(id, command); + Logger.ExecuteCommandInDockerContainer(id, command); var execCreateParameters = new ContainerExecCreateParameters { @@ -150,16 +147,16 @@ public async Task ExecAsync(string id, IList command, Cancel AttachStderr = true, }; - var execCreateResponse = await Docker.Exec.ExecCreateContainerAsync(id, execCreateParameters, ct) + var execCreateResponse = await DockerClient.Exec.ExecCreateContainerAsync(id, execCreateParameters, ct) .ConfigureAwait(false); - using (var stdOutAndErrStream = await Docker.Exec.StartAndAttachContainerExecAsync(execCreateResponse.ID, false, ct) + using (var stdOutAndErrStream = await DockerClient.Exec.StartAndAttachContainerExecAsync(execCreateResponse.ID, false, ct) .ConfigureAwait(false)) { var (stdout, stderr) = await stdOutAndErrStream.ReadOutputToEndAsync(ct) .ConfigureAwait(false); - var execInspectResponse = await Docker.Exec.InspectContainerExecAsync(execCreateResponse.ID, ct) + var execInspectResponse = await DockerClient.Exec.InspectContainerExecAsync(execCreateResponse.ID, ct) .ConfigureAwait(false); return new ExecResult(stdout, stderr, execInspectResponse.ExitCode); @@ -168,6 +165,10 @@ public async Task ExecAsync(string id, IList command, Cancel public async Task RunAsync(IContainerConfiguration configuration, CancellationToken ct = default) { + // TODO: Move to an appropriate location. This is only for demonstration purposes; ideally, we add this to each resource CreateAsync(CancellationToken) method. + await LogContainerRuntimeInfoAsync(ct) + .ConfigureAwait(false); + var converter = new ContainerConfigurationConverter(configuration); var hostConfig = new HostConfig @@ -213,10 +214,10 @@ public async Task RunAsync(IContainerConfiguration configuration, Cancel } } - var createContainerResponse = await Docker.Containers.CreateContainerAsync(createParameters, ct) + var createContainerResponse = await DockerClient.Containers.CreateContainerAsync(createParameters, ct) .ConfigureAwait(false); - _logger.DockerContainerCreated(createContainerResponse.ID); + Logger.DockerContainerCreated(createContainerResponse.ID); return createContainerResponse.ID; } } diff --git a/src/Testcontainers/Clients/DockerImageOperations.cs b/src/Testcontainers/Clients/DockerImageOperations.cs index 7dc2df009..5c6c2196b 100644 --- a/src/Testcontainers/Clients/DockerImageOperations.cs +++ b/src/Testcontainers/Clients/DockerImageOperations.cs @@ -14,26 +14,23 @@ namespace DotNet.Testcontainers.Clients internal sealed class DockerImageOperations : DockerApiClient, IDockerImageOperations { - private readonly ILogger _logger; - private readonly TraceProgress _traceProgress; public DockerImageOperations(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, ILogger logger) - : base(sessionId, dockerEndpointAuthConfig) + : base(sessionId, dockerEndpointAuthConfig, logger) { - _logger = logger; _traceProgress = new TraceProgress(logger); } public async Task> GetAllAsync(CancellationToken ct = default) { - return await Docker.Images.ListImagesAsync(new ImagesListParameters { All = true }, ct) + return await DockerClient.Images.ListImagesAsync(new ImagesListParameters { All = true }, ct) .ConfigureAwait(false); } public async Task> GetAllAsync(FilterByProperty filters, CancellationToken ct = default) { - return await Docker.Images.ListImagesAsync(new ImagesListParameters { All = true, Filters = filters }, ct) + return await DockerClient.Images.ListImagesAsync(new ImagesListParameters { All = true, Filters = filters }, ct) .ConfigureAwait(false); } @@ -41,7 +38,7 @@ public async Task ByIdAsync(string id, CancellationToken c { try { - return await Docker.Images.InspectImageAsync(id, ct) + return await DockerClient.Images.InspectImageAsync(id, ct) .ConfigureAwait(false); } catch (DockerApiException) @@ -74,16 +71,16 @@ public async Task CreateAsync(IImage image, IDockerRegistryAuthenticationConfigu IdentityToken = dockerRegistryAuthConfig.IdentityToken, }; - await Docker.Images.CreateImageAsync(createParameters, authConfig, _traceProgress, ct) + await DockerClient.Images.CreateImageAsync(createParameters, authConfig, _traceProgress, ct) .ConfigureAwait(false); - _logger.DockerImageCreated(image); + Logger.DockerImageCreated(image); } public Task DeleteAsync(IImage image, CancellationToken ct = default) { - _logger.DeleteDockerImage(image); - return Docker.Images.DeleteImageAsync(image.FullName, new ImageDeleteParameters { Force = true }, ct); + Logger.DeleteDockerImage(image); + return DockerClient.Images.DeleteImageAsync(image.FullName, new ImageDeleteParameters { Force = true }, ct); } public async Task BuildAsync(IImageFromDockerfileConfiguration configuration, ITarArchive dockerfileArchive, CancellationToken ct = default) @@ -122,7 +119,7 @@ await DeleteAsync(image, ct) { using (var dockerfileArchiveStream = new FileStream(dockerfileArchiveFilePath, FileMode.Open, FileAccess.Read)) { - await Docker.Images.BuildImageFromDockerfileAsync(buildParameters, dockerfileArchiveStream, Array.Empty(), new Dictionary(), _traceProgress, ct) + await DockerClient.Images.BuildImageFromDockerfileAsync(buildParameters, dockerfileArchiveStream, Array.Empty(), new Dictionary(), _traceProgress, ct) .ConfigureAwait(false); var imageHasBeenCreated = await ExistsWithIdAsync(image.FullName, ct) @@ -142,7 +139,7 @@ await DeleteAsync(image, ct) } } - _logger.DockerImageBuilt(image); + Logger.DockerImageBuilt(image); return image.FullName; } } diff --git a/src/Testcontainers/Clients/DockerNetworkOperations.cs b/src/Testcontainers/Clients/DockerNetworkOperations.cs index 5f9e086a4..d4a15af04 100644 --- a/src/Testcontainers/Clients/DockerNetworkOperations.cs +++ b/src/Testcontainers/Clients/DockerNetworkOperations.cs @@ -12,23 +12,20 @@ namespace DotNet.Testcontainers.Clients internal sealed class DockerNetworkOperations : DockerApiClient, IDockerNetworkOperations { - private readonly ILogger _logger; - public DockerNetworkOperations(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, ILogger logger) - : base(sessionId, dockerEndpointAuthConfig) + : base(sessionId, dockerEndpointAuthConfig, logger) { - _logger = logger; } public async Task> GetAllAsync(CancellationToken ct = default) { - return await Docker.Networks.ListNetworksAsync(new NetworksListParameters(), ct) + return await DockerClient.Networks.ListNetworksAsync(new NetworksListParameters(), ct) .ConfigureAwait(false); } public async Task> GetAllAsync(FilterByProperty filters, CancellationToken ct = default) { - return await Docker.Networks.ListNetworksAsync(new NetworksListParameters { Filters = filters }, ct) + return await DockerClient.Networks.ListNetworksAsync(new NetworksListParameters { Filters = filters }, ct) .ConfigureAwait(false); } @@ -36,7 +33,7 @@ public async Task ByIdAsync(string id, CancellationToken ct = d { try { - return await Docker.Networks.InspectNetworkAsync(id, ct) + return await DockerClient.Networks.InspectNetworkAsync(id, ct) .ConfigureAwait(false); } catch (DockerApiException) @@ -76,23 +73,23 @@ public async Task CreateAsync(INetworkConfiguration configuration, Cance } } - var createNetworkResponse = await Docker.Networks.CreateNetworkAsync(createParameters, ct) + var createNetworkResponse = await DockerClient.Networks.CreateNetworkAsync(createParameters, ct) .ConfigureAwait(false); - _logger.DockerNetworkCreated(createNetworkResponse.ID); + Logger.DockerNetworkCreated(createNetworkResponse.ID); return createNetworkResponse.ID; } public Task DeleteAsync(string id, CancellationToken ct = default) { - _logger.DeleteDockerNetwork(id); - return Docker.Networks.DeleteNetworkAsync(id, ct); + Logger.DeleteDockerNetwork(id); + return DockerClient.Networks.DeleteNetworkAsync(id, ct); } public Task ConnectAsync(string networkId, string containerId, CancellationToken ct = default) { - _logger.ConnectToDockerNetwork(networkId, containerId); - return Docker.Networks.ConnectNetworkAsync(networkId, new NetworkConnectParameters { Container = containerId }, ct); + Logger.ConnectToDockerNetwork(networkId, containerId); + return DockerClient.Networks.ConnectNetworkAsync(networkId, new NetworkConnectParameters { Container = containerId }, ct); } } } diff --git a/src/Testcontainers/Clients/DockerSystemOperations.cs b/src/Testcontainers/Clients/DockerSystemOperations.cs index 72853fcfc..628f02894 100644 --- a/src/Testcontainers/Clients/DockerSystemOperations.cs +++ b/src/Testcontainers/Clients/DockerSystemOperations.cs @@ -10,9 +10,8 @@ namespace DotNet.Testcontainers.Clients internal sealed class DockerSystemOperations : DockerApiClient, IDockerSystemOperations { public DockerSystemOperations(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, ILogger logger) - : base(sessionId, dockerEndpointAuthConfig) + : base(sessionId, dockerEndpointAuthConfig, logger) { - _ = logger; } public async Task GetIsWindowsEngineEnabled(CancellationToken ct = default) @@ -25,12 +24,12 @@ public async Task GetIsWindowsEngineEnabled(CancellationToken ct = default public Task GetInfoAsync(CancellationToken ct = default) { - return Docker.System.GetSystemInfoAsync(ct); + return DockerClient.System.GetSystemInfoAsync(ct); } public Task GetVersionAsync(CancellationToken ct = default) { - return Docker.System.GetVersionAsync(ct); + return DockerClient.System.GetVersionAsync(ct); } } } diff --git a/src/Testcontainers/Clients/DockerVolumeOperations.cs b/src/Testcontainers/Clients/DockerVolumeOperations.cs index 07b6634dd..aebd74d71 100644 --- a/src/Testcontainers/Clients/DockerVolumeOperations.cs +++ b/src/Testcontainers/Clients/DockerVolumeOperations.cs @@ -12,17 +12,14 @@ namespace DotNet.Testcontainers.Clients internal sealed class DockerVolumeOperations : DockerApiClient, IDockerVolumeOperations { - private readonly ILogger _logger; - public DockerVolumeOperations(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, ILogger logger) - : base(sessionId, dockerEndpointAuthConfig) + : base(sessionId, dockerEndpointAuthConfig, logger) { - _logger = logger; } public async Task> GetAllAsync(CancellationToken ct = default) { - var response = await Docker.Volumes.ListAsync(ct) + var response = await DockerClient.Volumes.ListAsync(ct) .ConfigureAwait(false); return response.Volumes; @@ -30,7 +27,7 @@ public async Task> GetAllAsync(CancellationToken ct public async Task> GetAllAsync(FilterByProperty filters, CancellationToken ct = default) { - var response = await Docker.Volumes.ListAsync(new VolumesListParameters { Filters = filters }, ct) + var response = await DockerClient.Volumes.ListAsync(new VolumesListParameters { Filters = filters }, ct) .ConfigureAwait(false); return response.Volumes; @@ -40,7 +37,7 @@ public async Task ByIdAsync(string id, CancellationToken ct = de { try { - return await Docker.Volumes.InspectAsync(id, ct) + return await DockerClient.Volumes.InspectAsync(id, ct) .ConfigureAwait(false); } catch (DockerApiException) @@ -78,17 +75,17 @@ public async Task CreateAsync(IVolumeConfiguration configuration, Cancel } } - var createVolumeResponse = await Docker.Volumes.CreateAsync(createParameters, ct) + var createVolumeResponse = await DockerClient.Volumes.CreateAsync(createParameters, ct) .ConfigureAwait(false); - _logger.DockerVolumeCreated(createVolumeResponse.Name); + Logger.DockerVolumeCreated(createVolumeResponse.Name); return createVolumeResponse.Name; } public Task DeleteAsync(string name, CancellationToken ct = default) { - _logger.DeleteDockerVolume(name); - return Docker.Volumes.RemoveAsync(name, false, ct); + Logger.DeleteDockerVolume(name); + return DockerClient.Volumes.RemoveAsync(name, false, ct); } } } diff --git a/src/Testcontainers/Clients/TestcontainersClient.cs b/src/Testcontainers/Clients/TestcontainersClient.cs index a582def62..e6852f95a 100644 --- a/src/Testcontainers/Clients/TestcontainersClient.cs +++ b/src/Testcontainers/Clients/TestcontainersClient.cs @@ -286,9 +286,6 @@ public async Task ReadFileAsync(string id, string filePath, Cancellation /// public async Task RunAsync(IContainerConfiguration configuration, CancellationToken ct = default) { - await configuration.Logger.DockerRuntimeInfoAsync(configuration.DockerEndpointAuthConfig) - .ConfigureAwait(false); - if (TestcontainersSettings.ResourceReaperEnabled && ResourceReaper.DefaultSessionId.Equals(configuration.SessionId)) { var isWindowsEngineEnabled = await System.GetIsWindowsEngineEnabled(ct) diff --git a/src/Testcontainers/Configurations/Commons/IResourceConfiguration.cs b/src/Testcontainers/Configurations/Commons/IResourceConfiguration.cs index 9d8a174cc..5db978354 100644 --- a/src/Testcontainers/Configurations/Commons/IResourceConfiguration.cs +++ b/src/Testcontainers/Configurations/Commons/IResourceConfiguration.cs @@ -17,11 +17,6 @@ public interface IResourceConfiguration /// Guid SessionId { get; } - /// - /// Gets a value indicating whether to reuse an existing resource configuration or not. - /// - bool? Reuse { get; } - /// /// Gets the Docker endpoint authentication configuration. /// @@ -38,13 +33,18 @@ public interface IResourceConfiguration IReadOnlyList> ParameterModifiers { get; } /// - /// Gets the reuse hash. + /// Gets a value indicating whether to reuse an existing resource configuration or not. /// - string GetReuseHash(); + bool? Reuse { get; } /// /// Gets the logger. /// ILogger Logger { get; } + + /// + /// Gets the reuse hash. + /// + string GetReuseHash(); } } diff --git a/src/Testcontainers/Configurations/Commons/ResourceConfiguration.cs b/src/Testcontainers/Configurations/Commons/ResourceConfiguration.cs index 553b66fa3..c4e2b6720 100644 --- a/src/Testcontainers/Configurations/Commons/ResourceConfiguration.cs +++ b/src/Testcontainers/Configurations/Commons/ResourceConfiguration.cs @@ -65,10 +65,6 @@ protected ResourceConfiguration(IResourceConfiguration ol [JsonIgnore] public Guid SessionId { get; } - /// - [JsonIgnore] - public bool? Reuse { get; } - /// [JsonIgnore] public IDockerEndpointAuthenticationConfiguration DockerEndpointAuthConfig { get; } @@ -81,6 +77,14 @@ protected ResourceConfiguration(IResourceConfiguration ol [JsonIgnore] public IReadOnlyList> ParameterModifiers { get; } + /// + [JsonIgnore] + public bool? Reuse { get; } + + /// + [JsonIgnore] + public ILogger Logger { get; } + /// public virtual string GetReuseHash() { @@ -91,8 +95,5 @@ public virtual string GetReuseHash() return Convert.ToBase64String(sha1.ComputeHash(jsonUtf8Bytes)); } } - - /// - public ILogger Logger { get; } } } diff --git a/src/Testcontainers/Configurations/TestcontainersSettings.cs b/src/Testcontainers/Configurations/TestcontainersSettings.cs index ca4c0d38a..40735c2dc 100644 --- a/src/Testcontainers/Configurations/TestcontainersSettings.cs +++ b/src/Testcontainers/Configurations/TestcontainersSettings.cs @@ -40,6 +40,10 @@ private static readonly IDockerEndpointAuthenticationProvider DockerEndpointAuth private static readonly IDockerEndpointAuthenticationConfiguration DockerEndpointAuthConfig = DockerEndpointAuthProvider?.GetAuthConfig(); + static TestcontainersSettings() + { + } + /// /// Gets or sets the Docker host override value. /// @@ -103,7 +107,7 @@ private static readonly IDockerEndpointAuthenticationConfiguration DockerEndpoin /// Gets or sets the logger. /// [NotNull] - [Obsolete("The logger is now configured per resource by calling WithLogger(ILogger logger) in the builder.")] + [Obsolete("Use the builder API WithLogger(ILogger) instead.")] public static ILogger Logger { get; set; } = ConsoleLogger.Instance; @@ -118,7 +122,7 @@ private static readonly IDockerEndpointAuthenticationConfiguration DockerEndpoin /// Gets the wait handle that signals settings initialized. /// [NotNull] - [Obsolete("This wait handle is not used anymore.")] + [Obsolete("This property is no longer supported.")] public static WaitHandle SettingsInitialized => ManualResetEvent.WaitHandle; diff --git a/src/Testcontainers/Configurations/Unix.cs b/src/Testcontainers/Configurations/Unix.cs index 4ccba5663..d6e8da664 100644 --- a/src/Testcontainers/Configurations/Unix.cs +++ b/src/Testcontainers/Configurations/Unix.cs @@ -64,6 +64,10 @@ public sealed class Unix : IOperatingSystem UnixFileModes.OtherWrite | UnixFileModes.OtherExecute; + static Unix() + { + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Testcontainers/Configurations/Windows.cs b/src/Testcontainers/Configurations/Windows.cs index 36e36eeeb..bdf53a285 100644 --- a/src/Testcontainers/Configurations/Windows.cs +++ b/src/Testcontainers/Configurations/Windows.cs @@ -10,6 +10,10 @@ namespace DotNet.Testcontainers.Configurations [PublicAPI] public sealed class Windows : IOperatingSystem { + static Windows() + { + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Testcontainers/Containers/DockerContainer.cs b/src/Testcontainers/Containers/DockerContainer.cs index 9ce68f8f0..727330a78 100644 --- a/src/Testcontainers/Containers/DockerContainer.cs +++ b/src/Testcontainers/Containers/DockerContainer.cs @@ -56,9 +56,6 @@ public DockerContainer(IContainerConfiguration configuration) /// public event EventHandler Stopped; - /// - public ILogger Logger => _configuration.Logger; - /// public DateTime CreatedTime { get; private set; } @@ -68,6 +65,15 @@ public DockerContainer(IContainerConfiguration configuration) /// public DateTime StoppedTime { get; private set; } + /// + public ILogger Logger + { + get + { + return _configuration.Logger; + } + } + /// public string Id { diff --git a/src/Testcontainers/Containers/IContainer.cs b/src/Testcontainers/Containers/IContainer.cs index 11b784bfe..d041f7822 100644 --- a/src/Testcontainers/Containers/IContainer.cs +++ b/src/Testcontainers/Containers/IContainer.cs @@ -52,12 +52,6 @@ public interface IContainer : IAsyncDisposable [CanBeNull] event EventHandler Stopped; - /// - /// Gets the logger. - /// - [NotNull] - ILogger Logger { get; } - /// /// Gets the created timestamp. /// @@ -73,6 +67,12 @@ public interface IContainer : IAsyncDisposable /// DateTime StoppedTime { get; } + /// + /// Gets the logger. + /// + [NotNull] + ILogger Logger { get; } + /// /// Gets the container id. /// diff --git a/src/Testcontainers/Logging.cs b/src/Testcontainers/Logging.cs index 2dac659a8..8e1d5b07a 100644 --- a/src/Testcontainers/Logging.cs +++ b/src/Testcontainers/Logging.cs @@ -4,8 +4,6 @@ namespace DotNet.Testcontainers using System.Collections.Generic; using System.Text.Json; using System.Text.RegularExpressions; - using System.Threading.Tasks; - using DotNet.Testcontainers.Configurations; using DotNet.Testcontainers.Images; using Microsoft.Extensions.Logging; @@ -13,19 +11,6 @@ internal static class Logging { #pragma warning disable InconsistentNaming, SA1309 - private static readonly Action _DockerRuntimeInfo - = LoggerMessage.Define(LogLevel.Information, default, - "Connected to Docker" + Environment.NewLine + - " Host: {Host}" + Environment.NewLine + - " Server Version: {ServerVersion}" + Environment.NewLine + - " Kernel Version: {KernelVersion}" + Environment.NewLine + - " API Version: {APIVersion}" + Environment.NewLine + - " Operating System: {OperatingSystem}" + Environment.NewLine + - " Total Memory: {TotalMemory}"); - - private static readonly Action _DockerRuntimeError - = LoggerMessage.Define(LogLevel.Error, default, "Failed to get Docker runtime information: {Exception}"); - private static readonly Action _IgnorePatternAdded = LoggerMessage.Define(LogLevel.Information, default, "Pattern {IgnorePattern} added to the regex cache"); @@ -127,30 +112,6 @@ private static readonly Action _ReusableResourceNotFound #pragma warning restore InconsistentNaming, SA1309 - public static async Task DockerRuntimeInfoAsync(this ILogger logger, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig) - { - try - { - using (var dockerClientConfiguration = dockerEndpointAuthConfig.GetDockerClientConfiguration()) - { - using (var dockerClient = dockerClientConfiguration.CreateClient()) - { - var dockerInfo = await dockerClient.System.GetSystemInfoAsync() - .ConfigureAwait(false); - var dockerVersion = await dockerClient.System.GetVersionAsync() - .ConfigureAwait(false); - var byteUnits = new[] { "KB", "MB", "GB" }; - var totalMemory = FormattableString.Invariant($"{dockerInfo.MemTotal / Math.Pow(1024, byteUnits.Length):F} {byteUnits[byteUnits.Length - 1]}"); - _DockerRuntimeInfo(logger, dockerClient.Configuration.EndpointBaseUri, dockerInfo.ServerVersion, dockerInfo.KernelVersion, dockerVersion.APIVersion, dockerInfo.OperatingSystem, totalMemory, null); - } - } - } - catch (Exception exception) - { - _DockerRuntimeError(logger, exception, exception); - } - } - public static void IgnorePatternAdded(this ILogger logger, Regex ignorePattern) { _IgnorePatternAdded(logger, ignorePattern, null); diff --git a/src/Testcontainers/Networks/DockerNetwork.cs b/src/Testcontainers/Networks/DockerNetwork.cs index 5dab5d363..2d1964647 100644 --- a/src/Testcontainers/Networks/DockerNetwork.cs +++ b/src/Testcontainers/Networks/DockerNetwork.cs @@ -9,7 +9,6 @@ namespace DotNet.Testcontainers.Networks using DotNet.Testcontainers.Clients; using DotNet.Testcontainers.Configurations; using JetBrains.Annotations; - using Microsoft.Extensions.Logging; /// [PublicAPI] @@ -19,8 +18,6 @@ internal sealed class DockerNetwork : Resource, INetwork private readonly INetworkConfiguration _configuration; - private readonly ILogger _logger; - private NetworkResponse _network = new NetworkResponse(); /// @@ -31,7 +28,6 @@ public DockerNetwork(INetworkConfiguration configuration) { _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, configuration.Logger); _configuration = configuration; - _logger = configuration.Logger; } /// @@ -102,7 +98,7 @@ protected override async Task UnsafeCreateAsync(CancellationToken ct = default) if (_configuration.Reuse.HasValue && _configuration.Reuse.Value) { - _logger.ReusableExperimentalFeature(); + _configuration.Logger.ReusableExperimentalFeature(); var filters = new FilterByReuseHash(_configuration); @@ -113,13 +109,13 @@ protected override async Task UnsafeCreateAsync(CancellationToken ct = default) if (reusableNetwork != null) { - _logger.ReusableResourceFound(); + _configuration.Logger.ReusableResourceFound(); id = reusableNetwork.ID; } else { - _logger.ReusableResourceNotFound(); + _configuration.Logger.ReusableResourceNotFound(); id = await _client.Network.CreateAsync(_configuration, ct) .ConfigureAwait(false); diff --git a/src/Testcontainers/Volumes/DockerVolume.cs b/src/Testcontainers/Volumes/DockerVolume.cs index 73c5199ed..58ac88312 100644 --- a/src/Testcontainers/Volumes/DockerVolume.cs +++ b/src/Testcontainers/Volumes/DockerVolume.cs @@ -9,7 +9,6 @@ namespace DotNet.Testcontainers.Volumes using DotNet.Testcontainers.Clients; using DotNet.Testcontainers.Configurations; using JetBrains.Annotations; - using Microsoft.Extensions.Logging; /// [PublicAPI] @@ -19,8 +18,6 @@ internal sealed class DockerVolume : Resource, IVolume private readonly IVolumeConfiguration _configuration; - private readonly ILogger _logger; - private VolumeResponse _volume = new VolumeResponse(); /// @@ -31,7 +28,6 @@ public DockerVolume(IVolumeConfiguration configuration) { _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, configuration.Logger); _configuration = configuration; - _logger = configuration.Logger; } /// @@ -102,7 +98,7 @@ protected override async Task UnsafeCreateAsync(CancellationToken ct = default) if (_configuration.Reuse.HasValue && _configuration.Reuse.Value) { - _logger.ReusableExperimentalFeature(); + _configuration.Logger.ReusableExperimentalFeature(); var filters = new FilterByReuseHash(_configuration); @@ -113,13 +109,13 @@ protected override async Task UnsafeCreateAsync(CancellationToken ct = default) if (reusableVolume != null) { - _logger.ReusableResourceFound(); + _configuration.Logger.ReusableResourceFound(); id = reusableVolume.Name; } else { - _logger.ReusableResourceNotFound(); + _configuration.Logger.ReusableResourceNotFound(); id = await _client.Volume.CreateAsync(_configuration, ct) .ConfigureAwait(false); diff --git a/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs b/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs new file mode 100644 index 000000000..d7cab8461 --- /dev/null +++ b/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs @@ -0,0 +1,104 @@ +namespace Testcontainers.Tests; + +public abstract class LoggerTest : IAsyncLifetime +{ + private readonly Mock _mockOfILogger; + + protected LoggerTest(MockOfILogger mockOfILogger) + { + _mockOfILogger = mockOfILogger; + } + + public Task InitializeAsync() + { + return new ContainerBuilder() + .WithImage(CommonImages.Alpine) + .WithCommand(CommonCommands.SleepInfinity) + .WithLogger(_mockOfILogger.Object) + .Build() + .StartAsync(); + } + + public Task DisposeAsync() + { + return Task.CompletedTask; + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + public void LogContainerRuntimeInformationOnce(int _) + { + Expression> predicate = logger => logger.Log( + It.Is(logLevel => LogLevel.Information.Equals(logLevel)), + It.IsAny(), + It.Is((state, _) => state.ToString().Contains("Connected to Docker")), + It.IsAny(), + It.IsAny>()); + + _mockOfILogger.Verify(predicate, Times.Once); + } + + [UsedImplicitly] + public sealed class SingleInstanceTest : LoggerTest + { + public SingleInstanceTest() + : base(new SingleInstance()) + { + } + } + + [UsedImplicitly] + public sealed class SharedInstanceTest : LoggerTest, IClassFixture + { + public SharedInstanceTest(SharedInstance sharedInstance) + : base(sharedInstance) + { + } + } + + [UsedImplicitly] + [Collection(nameof(SharedCollection))] + public sealed class SharedCollectionTest1 : LoggerTest + { + public SharedCollectionTest1(SharedInstance sharedInstance) + : base(sharedInstance) + { + } + } + + [UsedImplicitly] + [Collection(nameof(SharedCollection))] + public sealed class SharedCollectionTest2 : LoggerTest + { + public SharedCollectionTest2(SharedInstance sharedInstance) + : base(sharedInstance) + { + } + } + + public sealed class SingleInstance : MockOfILogger + { + // Ctor ITestOutputHelper + } + + public sealed class SharedInstance : MockOfILogger + { + // Ctor IMessageSink + } + + [CollectionDefinition(nameof(SharedCollection))] + public sealed class SharedCollection : ICollectionFixture + { + // Ctor IMessageSink + } + + public abstract class MockOfILogger : Mock + { + public MockOfILogger() + { + Setup(logger => logger.IsEnabled(It.IsAny())).Returns(true); + } + } +} \ No newline at end of file diff --git a/tests/Testcontainers.Platform.Linux.Tests/Testcontainers.Platform.Linux.Tests.csproj b/tests/Testcontainers.Platform.Linux.Tests/Testcontainers.Platform.Linux.Tests.csproj index 0282b5373..bbad56ed2 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/Testcontainers.Platform.Linux.Tests.csproj +++ b/tests/Testcontainers.Platform.Linux.Tests/Testcontainers.Platform.Linux.Tests.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/Testcontainers.Platform.Linux.Tests/Usings.cs b/tests/Testcontainers.Platform.Linux.Tests/Usings.cs index 8e7257e47..3ed3a228a 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/Usings.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/Usings.cs @@ -3,6 +3,7 @@ global using System.Globalization; global using System.IO; global using System.Linq; +global using System.Linq.Expressions; global using System.Net; global using System.Net.Sockets; global using System.Text; @@ -18,5 +19,8 @@ global using DotNet.Testcontainers.Containers; global using ICSharpCode.SharpZipLib.Tar; global using JetBrains.Annotations; +global using Microsoft.Extensions.Logging; global using Microsoft.Extensions.Logging.Abstractions; -global using Xunit; \ No newline at end of file +global using Moq; +global using Xunit; +global using Xunit.Abstractions; \ No newline at end of file From f9bd751fbde091311b252ec3db8550d04e21c0bc Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Wed, 28 Feb 2024 19:56:44 +0100 Subject: [PATCH 03/12] chore: Keep ctor (set obsolete) to not break non TC modules --- src/Testcontainers/Containers/DockerContainer.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Testcontainers/Containers/DockerContainer.cs b/src/Testcontainers/Containers/DockerContainer.cs index 727330a78..3c18de7a6 100644 --- a/src/Testcontainers/Containers/DockerContainer.cs +++ b/src/Testcontainers/Containers/DockerContainer.cs @@ -38,6 +38,18 @@ public DockerContainer(IContainerConfiguration configuration) _configuration = configuration; } + /// + /// Initializes a new instance of the class. + /// + /// The container configuration. + /// The logger. + [Obsolete("Use the constructor DockerContainer(IContainerConfiguration) instead.")] + public DockerContainer(IContainerConfiguration configuration, ILogger logger) + { + _client = new TestcontainersClient(configuration.SessionId, configuration.DockerEndpointAuthConfig, logger); + _configuration = configuration; + } + /// public event EventHandler Creating; From f6fdf1aace81fa23635c055f833e4f5cc315b5f0 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Wed, 28 Feb 2024 21:07:02 +0100 Subject: [PATCH 04/12] chore: Add HashCode.Combine --- Directory.Packages.props | 1 + src/Testcontainers/Clients/DockerApiClient.cs | 2 +- src/Testcontainers/Testcontainers.csproj | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 7e1e9bfc2..ecbb49adc 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -8,6 +8,7 @@ + diff --git a/src/Testcontainers/Clients/DockerApiClient.cs b/src/Testcontainers/Clients/DockerApiClient.cs index c03dba406..4fee5ba09 100644 --- a/src/Testcontainers/Clients/DockerApiClient.cs +++ b/src/Testcontainers/Clients/DockerApiClient.cs @@ -64,7 +64,7 @@ protected DockerApiClient(IDockerClient dockerClient, ILogger logger) /// protected async Task LogContainerRuntimeInfoAsync(CancellationToken ct = default) { - var hashCode = Logger.GetHashCode(); + var hashCode = HashCode.Combine(DockerClient, Logger); await RuntimeInitialized.WaitAsync(ct) .ConfigureAwait(false); diff --git a/src/Testcontainers/Testcontainers.csproj b/src/Testcontainers/Testcontainers.csproj index 591f98636..63610b647 100644 --- a/src/Testcontainers/Testcontainers.csproj +++ b/src/Testcontainers/Testcontainers.csproj @@ -10,6 +10,7 @@ + From ad4ee13e3ea6e2a6b3eecbbb5254748bf3e3370f Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Wed, 28 Feb 2024 21:32:01 +0100 Subject: [PATCH 05/12] feat: Call log runtime info method --- src/Testcontainers/Clients/DockerApiClient.cs | 9 ++++++--- src/Testcontainers/Clients/IDockerSystemOperations.cs | 2 ++ src/Testcontainers/Containers/DockerContainer.cs | 3 +++ src/Testcontainers/Images/FutureDockerImage.cs | 3 +++ src/Testcontainers/Networks/DockerNetwork.cs | 3 +++ src/Testcontainers/Volumes/DockerVolume.cs | 3 +++ 6 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Testcontainers/Clients/DockerApiClient.cs b/src/Testcontainers/Clients/DockerApiClient.cs index 4fee5ba09..0bc991f22 100644 --- a/src/Testcontainers/Clients/DockerApiClient.cs +++ b/src/Testcontainers/Clients/DockerApiClient.cs @@ -58,11 +58,14 @@ protected DockerApiClient(IDockerClient dockerClient, ILogger logger) protected ILogger Logger { get; } /// - /// + /// Logs the container runtime information. /// + /// + /// The method logs the information once per Docker Engine API client and logger. + /// /// Cancellation token. - /// - protected async Task LogContainerRuntimeInfoAsync(CancellationToken ct = default) + /// Task that completes when the information has been logged. + public async Task LogContainerRuntimeInfoAsync(CancellationToken ct = default) { var hashCode = HashCode.Combine(DockerClient, Logger); diff --git a/src/Testcontainers/Clients/IDockerSystemOperations.cs b/src/Testcontainers/Clients/IDockerSystemOperations.cs index ed6f71dd6..577d75765 100644 --- a/src/Testcontainers/Clients/IDockerSystemOperations.cs +++ b/src/Testcontainers/Clients/IDockerSystemOperations.cs @@ -6,6 +6,8 @@ namespace DotNet.Testcontainers.Clients internal interface IDockerSystemOperations { + Task LogContainerRuntimeInfoAsync(CancellationToken ct = default); + Task GetIsWindowsEngineEnabled(CancellationToken ct = default); Task GetInfoAsync(CancellationToken ct = default); diff --git a/src/Testcontainers/Containers/DockerContainer.cs b/src/Testcontainers/Containers/DockerContainer.cs index 3c18de7a6..9d846d40f 100644 --- a/src/Testcontainers/Containers/DockerContainer.cs +++ b/src/Testcontainers/Containers/DockerContainer.cs @@ -387,6 +387,9 @@ protected override async Task UnsafeCreateAsync(CancellationToken ct = default) return; } + await _client.System.LogContainerRuntimeInfoAsync(ct) + .ConfigureAwait(false); + Creating?.Invoke(this, EventArgs.Empty); string id; diff --git a/src/Testcontainers/Images/FutureDockerImage.cs b/src/Testcontainers/Images/FutureDockerImage.cs index 12c888d48..6a48e787e 100644 --- a/src/Testcontainers/Images/FutureDockerImage.cs +++ b/src/Testcontainers/Images/FutureDockerImage.cs @@ -110,6 +110,9 @@ protected override async Task UnsafeCreateAsync(CancellationToken ct = default) return; } + await _client.System.LogContainerRuntimeInfoAsync(ct) + .ConfigureAwait(false); + _ = await _client.BuildAsync(_configuration, ct) .ConfigureAwait(false); diff --git a/src/Testcontainers/Networks/DockerNetwork.cs b/src/Testcontainers/Networks/DockerNetwork.cs index 2d1964647..9c8086eaf 100644 --- a/src/Testcontainers/Networks/DockerNetwork.cs +++ b/src/Testcontainers/Networks/DockerNetwork.cs @@ -94,6 +94,9 @@ protected override async Task UnsafeCreateAsync(CancellationToken ct = default) return; } + await _client.System.LogContainerRuntimeInfoAsync(ct) + .ConfigureAwait(false); + string id; if (_configuration.Reuse.HasValue && _configuration.Reuse.Value) diff --git a/src/Testcontainers/Volumes/DockerVolume.cs b/src/Testcontainers/Volumes/DockerVolume.cs index 58ac88312..2f0e44a4b 100644 --- a/src/Testcontainers/Volumes/DockerVolume.cs +++ b/src/Testcontainers/Volumes/DockerVolume.cs @@ -94,6 +94,9 @@ protected override async Task UnsafeCreateAsync(CancellationToken ct = default) return; } + await _client.System.LogContainerRuntimeInfoAsync(ct) + .ConfigureAwait(false); + string id; if (_configuration.Reuse.HasValue && _configuration.Reuse.Value) From 101c9db40035e6acaaa07e7e23517b788c88fb04 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Wed, 28 Feb 2024 21:33:40 +0100 Subject: [PATCH 06/12] chore: Remove demo log call --- src/Testcontainers/Clients/DockerContainerOperations.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Testcontainers/Clients/DockerContainerOperations.cs b/src/Testcontainers/Clients/DockerContainerOperations.cs index 9c8b934a5..73cf62a31 100644 --- a/src/Testcontainers/Clients/DockerContainerOperations.cs +++ b/src/Testcontainers/Clients/DockerContainerOperations.cs @@ -165,10 +165,6 @@ public async Task ExecAsync(string id, IList command, Cancel public async Task RunAsync(IContainerConfiguration configuration, CancellationToken ct = default) { - // TODO: Move to an appropriate location. This is only for demonstration purposes; ideally, we add this to each resource CreateAsync(CancellationToken) method. - await LogContainerRuntimeInfoAsync(ct) - .ConfigureAwait(false); - var converter = new ContainerConfigurationConverter(configuration); var hostConfig = new HostConfig From 38730370f0150b0e6a55ac71d66a572fe44806e2 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Sat, 2 Mar 2024 13:12:22 +0100 Subject: [PATCH 07/12] chore: Replace Moq with Microsoft.Extensions.Diagnostics.Testing --- Directory.Packages.props | 4 +-- .../LoggerTest.cs | 29 +++++-------------- ...Testcontainers.Platform.Linux.Tests.csproj | 2 +- .../Usings.cs | 2 +- 4 files changed, 11 insertions(+), 26 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index ecbb49adc..17cfe192d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -15,8 +15,8 @@ - - + + diff --git a/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs b/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs index d7cab8461..ea6176b72 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs @@ -2,11 +2,11 @@ public abstract class LoggerTest : IAsyncLifetime { - private readonly Mock _mockOfILogger; + private readonly FakeLogger _fakeLogger; - protected LoggerTest(MockOfILogger mockOfILogger) + protected LoggerTest(FakeLogger fakeLogger) { - _mockOfILogger = mockOfILogger; + _fakeLogger = fakeLogger; } public Task InitializeAsync() @@ -14,7 +14,7 @@ public Task InitializeAsync() return new ContainerBuilder() .WithImage(CommonImages.Alpine) .WithCommand(CommonCommands.SleepInfinity) - .WithLogger(_mockOfILogger.Object) + .WithLogger(_fakeLogger) .Build() .StartAsync(); } @@ -30,14 +30,7 @@ public Task DisposeAsync() [InlineData(2)] public void LogContainerRuntimeInformationOnce(int _) { - Expression> predicate = logger => logger.Log( - It.Is(logLevel => LogLevel.Information.Equals(logLevel)), - It.IsAny(), - It.Is((state, _) => state.ToString().Contains("Connected to Docker")), - It.IsAny(), - It.IsAny>()); - - _mockOfILogger.Verify(predicate, Times.Once); + Assert.Contains("Connected to Docker", _fakeLogger.Collector.GetSnapshot().First().Message); } [UsedImplicitly] @@ -78,12 +71,12 @@ public SharedCollectionTest2(SharedInstance sharedInstance) } } - public sealed class SingleInstance : MockOfILogger + public sealed class SingleInstance : FakeLogger { // Ctor ITestOutputHelper } - public sealed class SharedInstance : MockOfILogger + public sealed class SharedInstance : FakeLogger { // Ctor IMessageSink } @@ -93,12 +86,4 @@ public sealed class SharedCollection : ICollectionFixture { // Ctor IMessageSink } - - public abstract class MockOfILogger : Mock - { - public MockOfILogger() - { - Setup(logger => logger.IsEnabled(It.IsAny())).Returns(true); - } - } } \ No newline at end of file diff --git a/tests/Testcontainers.Platform.Linux.Tests/Testcontainers.Platform.Linux.Tests.csproj b/tests/Testcontainers.Platform.Linux.Tests/Testcontainers.Platform.Linux.Tests.csproj index bbad56ed2..5cde0f59f 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/Testcontainers.Platform.Linux.Tests.csproj +++ b/tests/Testcontainers.Platform.Linux.Tests/Testcontainers.Platform.Linux.Tests.csproj @@ -6,8 +6,8 @@ + - diff --git a/tests/Testcontainers.Platform.Linux.Tests/Usings.cs b/tests/Testcontainers.Platform.Linux.Tests/Usings.cs index 3ed3a228a..62f3a217e 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/Usings.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/Usings.cs @@ -21,6 +21,6 @@ global using JetBrains.Annotations; global using Microsoft.Extensions.Logging; global using Microsoft.Extensions.Logging.Abstractions; -global using Moq; +global using Microsoft.Extensions.Logging.Testing; global using Xunit; global using Xunit.Abstractions; \ No newline at end of file From 1cc49ade73fc23efa0fa442c15af462690dcf7ec Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Sat, 2 Mar 2024 13:17:53 +0100 Subject: [PATCH 08/12] chore: Remove logger from MilvusContainer --- src/Testcontainers.Milvus/MilvusBuilder.cs | 2 +- src/Testcontainers.Milvus/MilvusContainer.cs | 5 ++--- src/Testcontainers.Milvus/Usings.cs | 3 +-- tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs | 2 +- tests/Testcontainers.Platform.Linux.Tests/Usings.cs | 5 +---- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Testcontainers.Milvus/MilvusBuilder.cs b/src/Testcontainers.Milvus/MilvusBuilder.cs index 24c6ed318..44c2d8a60 100644 --- a/src/Testcontainers.Milvus/MilvusBuilder.cs +++ b/src/Testcontainers.Milvus/MilvusBuilder.cs @@ -53,7 +53,7 @@ public MilvusBuilder WithEtcdEndpoint(string etcdEndpoint) public override MilvusContainer Build() { Validate(); - return new MilvusContainer(DockerResourceConfiguration, TestcontainersSettings.Logger); + return new MilvusContainer(DockerResourceConfiguration); } /// diff --git a/src/Testcontainers.Milvus/MilvusContainer.cs b/src/Testcontainers.Milvus/MilvusContainer.cs index 87c58f855..a856ad421 100644 --- a/src/Testcontainers.Milvus/MilvusContainer.cs +++ b/src/Testcontainers.Milvus/MilvusContainer.cs @@ -8,9 +8,8 @@ public sealed class MilvusContainer : DockerContainer /// Initializes a new instance of the class. /// /// The container configuration. - /// The logger. - public MilvusContainer(MilvusConfiguration configuration, ILogger logger) - : base(configuration, logger) + public MilvusContainer(MilvusConfiguration configuration) + : base(configuration) { } diff --git a/src/Testcontainers.Milvus/Usings.cs b/src/Testcontainers.Milvus/Usings.cs index fd93092b4..4ee39f0be 100644 --- a/src/Testcontainers.Milvus/Usings.cs +++ b/src/Testcontainers.Milvus/Usings.cs @@ -4,5 +4,4 @@ global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; -global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using JetBrains.Annotations; \ No newline at end of file diff --git a/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs b/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs index ea6176b72..6cecc4fdb 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/LoggerTest.cs @@ -1,4 +1,4 @@ -namespace Testcontainers.Tests; +namespace Testcontainers.Tests; public abstract class LoggerTest : IAsyncLifetime { diff --git a/tests/Testcontainers.Platform.Linux.Tests/Usings.cs b/tests/Testcontainers.Platform.Linux.Tests/Usings.cs index 62f3a217e..7674d6b7e 100644 --- a/tests/Testcontainers.Platform.Linux.Tests/Usings.cs +++ b/tests/Testcontainers.Platform.Linux.Tests/Usings.cs @@ -3,7 +3,6 @@ global using System.Globalization; global using System.IO; global using System.Linq; -global using System.Linq.Expressions; global using System.Net; global using System.Net.Sockets; global using System.Text; @@ -19,8 +18,6 @@ global using DotNet.Testcontainers.Containers; global using ICSharpCode.SharpZipLib.Tar; global using JetBrains.Annotations; -global using Microsoft.Extensions.Logging; global using Microsoft.Extensions.Logging.Abstractions; global using Microsoft.Extensions.Logging.Testing; -global using Xunit; -global using Xunit.Abstractions; \ No newline at end of file +global using Xunit; \ No newline at end of file From 1ee0e3e56358fef9e2e501741107cd86901989f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Sun, 10 Mar 2024 21:26:01 +0100 Subject: [PATCH 09/12] Pass the configured logger to the resource reaper --- .../Clients/TestcontainersClient.cs | 2 +- .../Containers/ResourceReaper.cs | 31 +++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/Testcontainers/Clients/TestcontainersClient.cs b/src/Testcontainers/Clients/TestcontainersClient.cs index 27c9188c7..1d1090f66 100644 --- a/src/Testcontainers/Clients/TestcontainersClient.cs +++ b/src/Testcontainers/Clients/TestcontainersClient.cs @@ -291,7 +291,7 @@ public async Task RunAsync(IContainerConfiguration configuration, Cancel var isWindowsEngineEnabled = await System.GetIsWindowsEngineEnabled(ct) .ConfigureAwait(false); - _ = await ResourceReaper.GetAndStartDefaultAsync(configuration.DockerEndpointAuthConfig, isWindowsEngineEnabled, ct) + _ = await ResourceReaper.GetAndStartDefaultAsync(configuration.DockerEndpointAuthConfig, configuration.Logger, isWindowsEngineEnabled, ct) .ConfigureAwait(false); } diff --git a/src/Testcontainers/Containers/ResourceReaper.cs b/src/Testcontainers/Containers/ResourceReaper.cs index d3c9af560..6c877109e 100644 --- a/src/Testcontainers/Containers/ResourceReaper.cs +++ b/src/Testcontainers/Containers/ResourceReaper.cs @@ -11,6 +11,7 @@ namespace DotNet.Testcontainers.Containers using DotNet.Testcontainers.Configurations; using DotNet.Testcontainers.Images; using JetBrains.Annotations; + using Microsoft.Extensions.Logging; /// /// The Resource Reaper takes care of the remaining Docker resources and removes them: https://dotnet.testcontainers.org/api/resource-reaper/. @@ -52,7 +53,7 @@ static ResourceReaper() { } - private ResourceReaper(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, IImage resourceReaperImage, IMount dockerSocket, bool requiresPrivilegedMode) + private ResourceReaper(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, IImage resourceReaperImage, IMount dockerSocket, ILogger logger, bool requiresPrivilegedMode) { _resourceReaperContainer = new ContainerBuilder() .WithName($"testcontainers-ryuk-{sessionId:D}") @@ -63,6 +64,7 @@ private ResourceReaper(Guid sessionId, IDockerEndpointAuthenticationConfiguratio .WithCleanUp(false) .WithPortBinding(TestcontainersSettings.ResourceReaperPublicHostPort.Invoke(dockerEndpointAuthConfig), RyukPort) .WithMount(dockerSocket) + .WithLogger(logger) .Build(); SessionId = sessionId; @@ -102,7 +104,22 @@ private ResourceReaper(Guid sessionId, IDockerEndpointAuthenticationConfiguratio /// The cancellation token to cancel the initialization. /// Task that completes when the has been started. [PublicAPI] + [Obsolete("Use GetAndStartDefaultAsync(IDockerEndpointAuthenticationConfiguration, ILogger, bool, CancellationToken) instead.")] public static async Task GetAndStartDefaultAsync(IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, bool isWindowsEngineEnabled = false, CancellationToken ct = default) + { + return await GetAndStartDefaultAsync(dockerEndpointAuthConfig, ConsoleLogger.Instance, isWindowsEngineEnabled, ct); + } + + /// + /// Starts and returns the default instance. + /// + /// The Docker endpoint authentication configuration. + /// The logger. + /// Determines whether the Windows engine is enabled or not. + /// The cancellation token to cancel the initialization. + /// Task that completes when the has been started. + [PublicAPI] + public static async Task GetAndStartDefaultAsync(IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, ILogger logger, bool isWindowsEngineEnabled = false, CancellationToken ct = default) { if (isWindowsEngineEnabled) { @@ -129,7 +146,7 @@ await DefaultLock.WaitAsync(ct) var requiresPrivilegedMode = TestcontainersSettings.ResourceReaperPrivilegedModeEnabled; - _defaultInstance = await GetAndStartNewAsync(DefaultSessionId, dockerEndpointAuthConfig, resourceReaperImage, new UnixSocketMount(dockerEndpointAuthConfig.Endpoint), requiresPrivilegedMode, ct: ct) + _defaultInstance = await GetAndStartNewAsync(DefaultSessionId, dockerEndpointAuthConfig, resourceReaperImage, new UnixSocketMount(dockerEndpointAuthConfig.Endpoint), logger, requiresPrivilegedMode, ct: ct) .ConfigureAwait(false); return _defaultInstance; @@ -177,14 +194,15 @@ await _resourceReaperContainer.DisposeAsync() /// The Docker endpoint authentication configuration. /// The Resource Reaper image. /// The Docker socket. + /// The logger. /// True if the container requires privileged mode, otherwise false. /// The timeout to initialize the Ryuk connection (Default: ). /// The cancellation token to cancel the initialization. /// Task that completes when the has been started. [PublicAPI] - private static Task GetAndStartNewAsync(IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, IImage resourceReaperImage, IMount dockerSocket, bool requiresPrivilegedMode = false, TimeSpan initTimeout = default, CancellationToken ct = default) + private static Task GetAndStartNewAsync(IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, IImage resourceReaperImage, IMount dockerSocket, ILogger logger, bool requiresPrivilegedMode = false, TimeSpan initTimeout = default, CancellationToken ct = default) { - return GetAndStartNewAsync(Guid.NewGuid(), dockerEndpointAuthConfig, resourceReaperImage, dockerSocket, requiresPrivilegedMode, initTimeout, ct); + return GetAndStartNewAsync(Guid.NewGuid(), dockerEndpointAuthConfig, resourceReaperImage, dockerSocket, logger, requiresPrivilegedMode, initTimeout, ct); } /// @@ -194,16 +212,17 @@ private static Task GetAndStartNewAsync(IDockerEndpointAuthentic /// The Docker endpoint authentication configuration. /// The Resource Reaper image. /// The Docker socket. + /// The logger. /// True if the container requires privileged mode, otherwise false. /// The timeout to initialize the Ryuk connection (Default: ). /// The cancellation token to cancel the initialization. /// Task that completes when the has been started. [PublicAPI] - private static async Task GetAndStartNewAsync(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, IImage resourceReaperImage, IMount dockerSocket, bool requiresPrivilegedMode = false, TimeSpan initTimeout = default, CancellationToken ct = default) + private static async Task GetAndStartNewAsync(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, IImage resourceReaperImage, IMount dockerSocket, ILogger logger, bool requiresPrivilegedMode = false, TimeSpan initTimeout = default, CancellationToken ct = default) { var ryukInitializedTaskSource = new TaskCompletionSource(); - var resourceReaper = new ResourceReaper(sessionId, dockerEndpointAuthConfig, resourceReaperImage, dockerSocket, requiresPrivilegedMode); + var resourceReaper = new ResourceReaper(sessionId, dockerEndpointAuthConfig, resourceReaperImage, dockerSocket, logger, requiresPrivilegedMode); initTimeout = TimeSpan.Equals(default, initTimeout) ? TimeSpan.FromSeconds(ConnectionTimeoutInSeconds) : initTimeout; From fef7faaf93c8b9e7ff199071011a22d2556f44ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Mon, 11 Mar 2024 10:23:18 +0100 Subject: [PATCH 10/12] Log structured Docker runtime information --- src/Testcontainers/Clients/DockerApiClient.cs | 48 ++----------------- src/Testcontainers/Logging.cs | 32 +++++++++++++ 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/src/Testcontainers/Clients/DockerApiClient.cs b/src/Testcontainers/Clients/DockerApiClient.cs index 0bc991f22..a1c302c4d 100644 --- a/src/Testcontainers/Clients/DockerApiClient.cs +++ b/src/Testcontainers/Clients/DockerApiClient.cs @@ -72,54 +72,14 @@ public async Task LogContainerRuntimeInfoAsync(CancellationToken ct = default) await RuntimeInitialized.WaitAsync(ct) .ConfigureAwait(false); - try + if (!ProcessedHashCodes.Contains(hashCode)) { - if (ProcessedHashCodes.Contains(hashCode)) - { - return; - } - - var runtimeInfo = new StringBuilder(); - - var byteUnits = new[] { "KB", "MB", "GB" }; - - var dockerInfo = await DockerClient.System.GetSystemInfoAsync(ct) - .ConfigureAwait(false); - - var dockerVersion = await DockerClient.System.GetVersionAsync(ct) + await Logger.DockerRuntimeInfoAsync(DockerClient) .ConfigureAwait(false); - - runtimeInfo.AppendLine("Connected to Docker:"); - - runtimeInfo.Append(" Host: "); - runtimeInfo.AppendLine(DockerClient.Configuration.EndpointBaseUri.ToString()); - - runtimeInfo.Append(" Server Version: "); - runtimeInfo.AppendLine(dockerInfo.ServerVersion); - - runtimeInfo.Append(" Kernel Version: "); - runtimeInfo.AppendLine(dockerInfo.KernelVersion); - - runtimeInfo.Append(" API Version: "); - runtimeInfo.AppendLine(dockerVersion.APIVersion); - - runtimeInfo.Append(" Operating System: "); - runtimeInfo.AppendLine(dockerInfo.OperatingSystem); - - runtimeInfo.Append(" Total Memory: "); - runtimeInfo.AppendFormat(CultureInfo.InvariantCulture, "{0:F} {1}", dockerInfo.MemTotal / Math.Pow(1024, byteUnits.Length), byteUnits[byteUnits.Length - 1]); - - Logger.LogInformation(runtimeInfo.ToString()); - } - catch(Exception e) - { - Logger.LogError(e, "Failed to retrieve Docker container runtime information."); - } - finally - { ProcessedHashCodes.Add(hashCode); - RuntimeInitialized.Release(); } + + RuntimeInitialized.Release(); } private static IDockerClient GetDockerClient(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig) diff --git a/src/Testcontainers/Logging.cs b/src/Testcontainers/Logging.cs index 8e1d5b07a..f5b924c8b 100644 --- a/src/Testcontainers/Logging.cs +++ b/src/Testcontainers/Logging.cs @@ -4,6 +4,8 @@ namespace DotNet.Testcontainers using System.Collections.Generic; using System.Text.Json; using System.Text.RegularExpressions; + using System.Threading.Tasks; + using Docker.DotNet; using DotNet.Testcontainers.Images; using Microsoft.Extensions.Logging; @@ -11,6 +13,19 @@ internal static class Logging { #pragma warning disable InconsistentNaming, SA1309 + private static readonly Action _DockerRuntimeInfo + = LoggerMessage.Define(LogLevel.Information, default, + "Connected to Docker" + Environment.NewLine + + " Host: {Host}" + Environment.NewLine + + " Server Version: {ServerVersion}" + Environment.NewLine + + " Kernel Version: {KernelVersion}" + Environment.NewLine + + " API Version: {APIVersion}" + Environment.NewLine + + " Operating System: {OperatingSystem}" + Environment.NewLine + + " Total Memory: {TotalMemory:F2} GB"); + + private static readonly Action _DockerRuntimeError + = LoggerMessage.Define(LogLevel.Error, default, "Failed to retrieve Docker container runtime information"); + private static readonly Action _IgnorePatternAdded = LoggerMessage.Define(LogLevel.Information, default, "Pattern {IgnorePattern} added to the regex cache"); @@ -112,6 +127,23 @@ private static readonly Action _ReusableResourceNotFound #pragma warning restore InconsistentNaming, SA1309 + public static async Task DockerRuntimeInfoAsync(this ILogger logger, IDockerClient dockerClient) + { + try + { + var dockerInfo = await dockerClient.System.GetSystemInfoAsync() + .ConfigureAwait(false); + var dockerVersion = await dockerClient.System.GetVersionAsync() + .ConfigureAwait(false); + var totalMemory = dockerInfo.MemTotal / (1024.0 * 1024 * 1024); + _DockerRuntimeInfo(logger, dockerClient.Configuration.EndpointBaseUri, dockerInfo.ServerVersion, dockerInfo.KernelVersion, dockerVersion.APIVersion, dockerInfo.OperatingSystem, totalMemory, null); + } + catch (Exception exception) + { + _DockerRuntimeError(logger, exception); + } + } + public static void IgnorePatternAdded(this ILogger logger, Regex ignorePattern) { _IgnorePatternAdded(logger, ignorePattern, null); From 1bf2f9689197779419974c91fcf3d52bb9772a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Luthi?= Date: Mon, 11 Mar 2024 12:18:43 +0100 Subject: [PATCH 11/12] Don't use structured logging for Docker runtime information --- src/Testcontainers/Clients/DockerApiClient.cs | 49 ++++++++++++++++++- src/Testcontainers/Logging.cs | 32 ------------ 2 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/Testcontainers/Clients/DockerApiClient.cs b/src/Testcontainers/Clients/DockerApiClient.cs index a1c302c4d..dc07d52f7 100644 --- a/src/Testcontainers/Clients/DockerApiClient.cs +++ b/src/Testcontainers/Clients/DockerApiClient.cs @@ -8,6 +8,7 @@ namespace DotNet.Testcontainers.Clients using System.Threading; using System.Threading.Tasks; using Docker.DotNet; + using Docker.DotNet.Models; using DotNet.Testcontainers.Configurations; using JetBrains.Annotations; using Microsoft.Extensions.Logging; @@ -74,14 +75,60 @@ await RuntimeInitialized.WaitAsync(ct) if (!ProcessedHashCodes.Contains(hashCode)) { - await Logger.DockerRuntimeInfoAsync(DockerClient) + await LogDockerRuntimeInformationAsync(ct) .ConfigureAwait(false); + ProcessedHashCodes.Add(hashCode); } RuntimeInitialized.Release(); } + private async Task LogDockerRuntimeInformationAsync(CancellationToken ct) + { + SystemInfoResponse dockerInfo; + VersionResponse dockerVersion; + try + { + dockerInfo = await DockerClient.System.GetSystemInfoAsync(ct) + .ConfigureAwait(false); + + dockerVersion = await DockerClient.System.GetVersionAsync(ct) + .ConfigureAwait(false); + } + catch (Exception e) + { + Logger.LogError(e, "Failed to retrieve Docker container runtime information"); + return; + } + + var runtimeInfo = new StringBuilder(); + + var byteUnits = new[] { "KB", "MB", "GB" }; + + runtimeInfo.AppendLine("Connected to Docker:"); + + runtimeInfo.Append(" Host: "); + runtimeInfo.AppendLine(DockerClient.Configuration.EndpointBaseUri.ToString()); + + runtimeInfo.Append(" Server Version: "); + runtimeInfo.AppendLine(dockerInfo.ServerVersion); + + runtimeInfo.Append(" Kernel Version: "); + runtimeInfo.AppendLine(dockerInfo.KernelVersion); + + runtimeInfo.Append(" API Version: "); + runtimeInfo.AppendLine(dockerVersion.APIVersion); + + runtimeInfo.Append(" Operating System: "); + runtimeInfo.AppendLine(dockerInfo.OperatingSystem); + + runtimeInfo.Append(" Total Memory: "); + runtimeInfo.AppendFormat(CultureInfo.InvariantCulture, "{0:F} {1}", dockerInfo.MemTotal / Math.Pow(1024, byteUnits.Length), byteUnits[byteUnits.Length - 1]); + + Logger.LogInformation(runtimeInfo.ToString()); + } + private static IDockerClient GetDockerClient(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig) { using (var dockerClientConfiguration = dockerEndpointAuthConfig.GetDockerClientConfiguration(sessionId)) diff --git a/src/Testcontainers/Logging.cs b/src/Testcontainers/Logging.cs index f5b924c8b..8e1d5b07a 100644 --- a/src/Testcontainers/Logging.cs +++ b/src/Testcontainers/Logging.cs @@ -4,8 +4,6 @@ namespace DotNet.Testcontainers using System.Collections.Generic; using System.Text.Json; using System.Text.RegularExpressions; - using System.Threading.Tasks; - using Docker.DotNet; using DotNet.Testcontainers.Images; using Microsoft.Extensions.Logging; @@ -13,19 +11,6 @@ internal static class Logging { #pragma warning disable InconsistentNaming, SA1309 - private static readonly Action _DockerRuntimeInfo - = LoggerMessage.Define(LogLevel.Information, default, - "Connected to Docker" + Environment.NewLine + - " Host: {Host}" + Environment.NewLine + - " Server Version: {ServerVersion}" + Environment.NewLine + - " Kernel Version: {KernelVersion}" + Environment.NewLine + - " API Version: {APIVersion}" + Environment.NewLine + - " Operating System: {OperatingSystem}" + Environment.NewLine + - " Total Memory: {TotalMemory:F2} GB"); - - private static readonly Action _DockerRuntimeError - = LoggerMessage.Define(LogLevel.Error, default, "Failed to retrieve Docker container runtime information"); - private static readonly Action _IgnorePatternAdded = LoggerMessage.Define(LogLevel.Information, default, "Pattern {IgnorePattern} added to the regex cache"); @@ -127,23 +112,6 @@ private static readonly Action _ReusableResourceNotFound #pragma warning restore InconsistentNaming, SA1309 - public static async Task DockerRuntimeInfoAsync(this ILogger logger, IDockerClient dockerClient) - { - try - { - var dockerInfo = await dockerClient.System.GetSystemInfoAsync() - .ConfigureAwait(false); - var dockerVersion = await dockerClient.System.GetVersionAsync() - .ConfigureAwait(false); - var totalMemory = dockerInfo.MemTotal / (1024.0 * 1024 * 1024); - _DockerRuntimeInfo(logger, dockerClient.Configuration.EndpointBaseUri, dockerInfo.ServerVersion, dockerInfo.KernelVersion, dockerVersion.APIVersion, dockerInfo.OperatingSystem, totalMemory, null); - } - catch (Exception exception) - { - _DockerRuntimeError(logger, exception); - } - } - public static void IgnorePatternAdded(this ILogger logger, Regex ignorePattern) { _IgnorePatternAdded(logger, ignorePattern, null); From 66ec29fa7963d0eaadb13fb2e0ef7afd7eca1d81 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:31:09 +0100 Subject: [PATCH 12/12] chore: Remove async, keep LogContainerRuntimeInfoAsync --- src/Testcontainers/Clients/DockerApiClient.cs | 73 +++++++++---------- .../Containers/ResourceReaper.cs | 4 +- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/Testcontainers/Clients/DockerApiClient.cs b/src/Testcontainers/Clients/DockerApiClient.cs index dc07d52f7..0bc991f22 100644 --- a/src/Testcontainers/Clients/DockerApiClient.cs +++ b/src/Testcontainers/Clients/DockerApiClient.cs @@ -8,7 +8,6 @@ namespace DotNet.Testcontainers.Clients using System.Threading; using System.Threading.Tasks; using Docker.DotNet; - using Docker.DotNet.Models; using DotNet.Testcontainers.Configurations; using JetBrains.Annotations; using Microsoft.Extensions.Logging; @@ -73,60 +72,54 @@ public async Task LogContainerRuntimeInfoAsync(CancellationToken ct = default) await RuntimeInitialized.WaitAsync(ct) .ConfigureAwait(false); - if (!ProcessedHashCodes.Contains(hashCode)) + try { - await LogDockerRuntimeInformationAsync(ct) - .ConfigureAwait(false); + if (ProcessedHashCodes.Contains(hashCode)) + { + return; + } - ProcessedHashCodes.Add(hashCode); - } + var runtimeInfo = new StringBuilder(); - RuntimeInitialized.Release(); - } + var byteUnits = new[] { "KB", "MB", "GB" }; - private async Task LogDockerRuntimeInformationAsync(CancellationToken ct) - { - SystemInfoResponse dockerInfo; - VersionResponse dockerVersion; - try - { - dockerInfo = await DockerClient.System.GetSystemInfoAsync(ct) + var dockerInfo = await DockerClient.System.GetSystemInfoAsync(ct) .ConfigureAwait(false); - dockerVersion = await DockerClient.System.GetVersionAsync(ct) + var dockerVersion = await DockerClient.System.GetVersionAsync(ct) .ConfigureAwait(false); - } - catch (Exception e) - { - Logger.LogError(e, "Failed to retrieve Docker container runtime information"); - return; - } - - var runtimeInfo = new StringBuilder(); - - var byteUnits = new[] { "KB", "MB", "GB" }; - runtimeInfo.AppendLine("Connected to Docker:"); + runtimeInfo.AppendLine("Connected to Docker:"); - runtimeInfo.Append(" Host: "); - runtimeInfo.AppendLine(DockerClient.Configuration.EndpointBaseUri.ToString()); + runtimeInfo.Append(" Host: "); + runtimeInfo.AppendLine(DockerClient.Configuration.EndpointBaseUri.ToString()); - runtimeInfo.Append(" Server Version: "); - runtimeInfo.AppendLine(dockerInfo.ServerVersion); + runtimeInfo.Append(" Server Version: "); + runtimeInfo.AppendLine(dockerInfo.ServerVersion); - runtimeInfo.Append(" Kernel Version: "); - runtimeInfo.AppendLine(dockerInfo.KernelVersion); + runtimeInfo.Append(" Kernel Version: "); + runtimeInfo.AppendLine(dockerInfo.KernelVersion); - runtimeInfo.Append(" API Version: "); - runtimeInfo.AppendLine(dockerVersion.APIVersion); + runtimeInfo.Append(" API Version: "); + runtimeInfo.AppendLine(dockerVersion.APIVersion); - runtimeInfo.Append(" Operating System: "); - runtimeInfo.AppendLine(dockerInfo.OperatingSystem); + runtimeInfo.Append(" Operating System: "); + runtimeInfo.AppendLine(dockerInfo.OperatingSystem); - runtimeInfo.Append(" Total Memory: "); - runtimeInfo.AppendFormat(CultureInfo.InvariantCulture, "{0:F} {1}", dockerInfo.MemTotal / Math.Pow(1024, byteUnits.Length), byteUnits[byteUnits.Length - 1]); + runtimeInfo.Append(" Total Memory: "); + runtimeInfo.AppendFormat(CultureInfo.InvariantCulture, "{0:F} {1}", dockerInfo.MemTotal / Math.Pow(1024, byteUnits.Length), byteUnits[byteUnits.Length - 1]); - Logger.LogInformation(runtimeInfo.ToString()); + Logger.LogInformation(runtimeInfo.ToString()); + } + catch(Exception e) + { + Logger.LogError(e, "Failed to retrieve Docker container runtime information."); + } + finally + { + ProcessedHashCodes.Add(hashCode); + RuntimeInitialized.Release(); + } } private static IDockerClient GetDockerClient(Guid sessionId, IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig) diff --git a/src/Testcontainers/Containers/ResourceReaper.cs b/src/Testcontainers/Containers/ResourceReaper.cs index 6c877109e..7a8081216 100644 --- a/src/Testcontainers/Containers/ResourceReaper.cs +++ b/src/Testcontainers/Containers/ResourceReaper.cs @@ -105,9 +105,9 @@ private ResourceReaper(Guid sessionId, IDockerEndpointAuthenticationConfiguratio /// Task that completes when the has been started. [PublicAPI] [Obsolete("Use GetAndStartDefaultAsync(IDockerEndpointAuthenticationConfiguration, ILogger, bool, CancellationToken) instead.")] - public static async Task GetAndStartDefaultAsync(IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, bool isWindowsEngineEnabled = false, CancellationToken ct = default) + public static Task GetAndStartDefaultAsync(IDockerEndpointAuthenticationConfiguration dockerEndpointAuthConfig, bool isWindowsEngineEnabled = false, CancellationToken ct = default) { - return await GetAndStartDefaultAsync(dockerEndpointAuthConfig, ConsoleLogger.Instance, isWindowsEngineEnabled, ct); + return GetAndStartDefaultAsync(dockerEndpointAuthConfig, ConsoleLogger.Instance, isWindowsEngineEnabled, ct); } ///