/// <summary>
        /// Merges the current with the new Docker resource configuration.
        /// </summary>
        /// <param name="dockerResourceConfiguration">The new Docker resource configuration.</param>
        /// <param name="moduleConfiguration">The module configuration.</param>
        /// <returns>A configured instance of <see cref="ITestcontainersBuilder{TDockerContainer}" />.</returns>
        protected virtual ITestcontainersBuilder <TDockerContainer> MergeNewConfiguration(ITestcontainersConfiguration dockerResourceConfiguration, Action <TDockerContainer> moduleConfiguration = null)
        {
            var autoRemove = BuildConfiguration.Combine(dockerResourceConfiguration.AutoRemove, this.DockerResourceConfiguration.AutoRemove);
            var privileged = BuildConfiguration.Combine(dockerResourceConfiguration.Privileged, this.DockerResourceConfiguration.Privileged);

            var image            = BuildConfiguration.Combine(dockerResourceConfiguration.Image, this.DockerResourceConfiguration.Image);
            var name             = BuildConfiguration.Combine(dockerResourceConfiguration.Name, this.DockerResourceConfiguration.Name);
            var hostname         = BuildConfiguration.Combine(dockerResourceConfiguration.Hostname, this.DockerResourceConfiguration.Hostname);
            var workingDirectory = BuildConfiguration.Combine(dockerResourceConfiguration.WorkingDirectory, this.DockerResourceConfiguration.WorkingDirectory);
            var entrypoint       = BuildConfiguration.Combine(dockerResourceConfiguration.Entrypoint, this.DockerResourceConfiguration.Entrypoint);
            var command          = BuildConfiguration.Combine(dockerResourceConfiguration.Command, this.DockerResourceConfiguration.Command);
            var environments     = BuildConfiguration.Combine(dockerResourceConfiguration.Environments, this.DockerResourceConfiguration.Environments);
            var labels           = BuildConfiguration.Combine(dockerResourceConfiguration.Labels, this.DockerResourceConfiguration.Labels);
            var exposedPorts     = BuildConfiguration.Combine(dockerResourceConfiguration.ExposedPorts, this.DockerResourceConfiguration.ExposedPorts);
            var portBindings     = BuildConfiguration.Combine(dockerResourceConfiguration.PortBindings, this.DockerResourceConfiguration.PortBindings);
            var mounts           = BuildConfiguration.Combine(dockerResourceConfiguration.Mounts, this.DockerResourceConfiguration.Mounts);
            var networks         = BuildConfiguration.Combine(dockerResourceConfiguration.Networks, this.DockerResourceConfiguration.Networks);
            var networkAliases   = BuildConfiguration.Combine(dockerResourceConfiguration.NetworkAliases, this.DockerResourceConfiguration.NetworkAliases);

            var dockerEndpointAuthConfig = BuildConfiguration.Combine(dockerResourceConfiguration.DockerEndpointAuthConfig, this.DockerResourceConfiguration.DockerEndpointAuthConfig);
            var dockerRegistryAuthConfig = BuildConfiguration.Combine(dockerResourceConfiguration.DockerRegistryAuthConfig, this.DockerResourceConfiguration.DockerRegistryAuthConfig);
            var outputConsumer           = BuildConfiguration.Combine(dockerResourceConfiguration.OutputConsumer, this.DockerResourceConfiguration.OutputConsumer);
            var waitStrategies           = BuildConfiguration.Combine <IEnumerable <IWaitUntil> >(dockerResourceConfiguration.WaitStrategies, this.DockerResourceConfiguration.WaitStrategies);
            var startupCallback          = BuildConfiguration.Combine(dockerResourceConfiguration.StartupCallback, this.DockerResourceConfiguration.StartupCallback);

            var updatedDockerResourceConfiguration = new TestcontainersConfiguration(dockerEndpointAuthConfig, dockerRegistryAuthConfig, image, name, hostname, workingDirectory, entrypoint, command, environments, labels, exposedPorts, portBindings, mounts, networks, networkAliases, outputConsumer, waitStrategies, startupCallback, autoRemove, privileged);

            return(new TestcontainersBuilder <TDockerContainer>(updatedDockerResourceConfiguration, moduleConfiguration ?? this.mergeModuleConfiguration));
        }
 private TestcontainersBuilder(
     TestcontainersConfiguration config,
     Action <T> overrideConfiguration)
 {
     this.config = config;
     this.overrideConfiguration = overrideConfiguration;
 }
Esempio n. 3
0
 private TestcontainersBuilder(
     TestcontainersConfiguration config,
     Action <T> configureContainer)
 {
     this.config             = config;
     this.configureContainer = configureContainer;
 }
Esempio n. 4
0
 private static ITestcontainersBuilder <T> Build(
     TestcontainersBuilder <T> old,
     TestcontainersConfiguration config,
     Action <T> configureContainer = null)
 {
     configureContainer = configureContainer ?? old.configureContainer;
     return(new TestcontainersBuilder <T>(config.Merge(old.config), configureContainer));
 }
Esempio n. 5
0
        public async Task <string> RunAsync(TestcontainersConfiguration config, CancellationToken cancellationToken = default)
        {
            var image = config.Container.Image;

            var pullImageTask = MetaDataClientImages.Instance.ExistsWithNameAsync(image).ContinueWith(async imageExists =>
            {
                if (!await imageExists)
                {
                    // await ... does not work here, the image will not be pulled.
                    Docker.Images.CreateImageAsync(new ImagesCreateParameters {
                        FromImage = image
                    }, null, DebugProgress.Instance, cancellationToken).GetAwaiter().GetResult();
                }
            });

            var name = config.Container.Name;

            var workingDir = config.Container.WorkingDirectory;

            var converter = new TestcontainersConfigurationConverter(config);

            var entrypoint = converter.Entrypoint;

            var cmd = converter.Command;

            var env = converter.Environments;

            var labels = converter.Labels;

            var exposedPorts = converter.ExposedPorts;

            var portBindings = converter.PortBindings;

            var mounts = converter.Mounts;

            var hostConfig = new HostConfig
            {
                PortBindings = portBindings,
                Mounts       = mounts,
            };

            var createParameters = new CreateContainerParameters
            {
                Image        = image,
                Name         = name,
                WorkingDir   = workingDir,
                Entrypoint   = entrypoint,
                Env          = env,
                Labels       = labels,
                Cmd          = cmd,
                ExposedPorts = exposedPorts,
                HostConfig   = hostConfig,
            };

            await pullImageTask;

            return((await Docker.Containers.CreateContainerAsync(createParameters, cancellationToken)).ID);
        }
Esempio n. 6
0
 protected DatabaseContainer(TestcontainersConfiguration configuration) : base(configuration)
 {
 }
Esempio n. 7
0
 internal TestcontainersContainer(TestcontainersConfiguration configuration)
 {
     this.Configuration = configuration;
 }
 internal RabbitMqTestcontainer(TestcontainersConfiguration configuration) : base(configuration)
 {
 }
 internal MySqlTestcontainer(TestcontainersConfiguration configuration) : base(configuration)
 {
 }
Esempio n. 10
0
 internal PostgreSqlTestcontainer(TestcontainersConfiguration configuration) : base(configuration)
 {
 }
 public TestcontainersConfigurationConverter(TestcontainersConfiguration config)
 {
     this.Config = config;
 }
 protected TestcontainerMessageBroker(TestcontainersConfiguration configuration) : base(configuration)
 {
 }
Esempio n. 13
0
 internal RedisTestcontainer(TestcontainersConfiguration configuration) : base(configuration)
 {
 }
 protected HostedServiceContainer(TestcontainersConfiguration configuration) : base(configuration)
 {
 }
Esempio n. 15
0
 internal ElasticsearchTestContainer(TestcontainersConfiguration configuration) : base(configuration) => Hostname = "localhost";
 protected TestcontainersContainer(TestcontainersConfiguration configuration)
 {
     this.Configuration = configuration;
 }
 internal CouchDbTestcontainer(TestcontainersConfiguration configuration) : base(configuration)
 {
 }
Esempio n. 18
0
        public async Task <string> RunAsync(TestcontainersConfiguration config, CancellationToken ct = default)
        {
            var image = config.Container.Image;

            var imageExistsTask = DockerApiClientImage.Instance.ExistsWithNameAsync(image);

            var pullImageTask = Task.CompletedTask;

            if (!await imageExistsTask)
            {
                pullImageTask = Docker.Images.CreateImageAsync(new ImagesCreateParameters {
                    FromImage = image
                }, null, DebugProgress.Instance, ct);
            }

            var name = config.Container.Name;

            var workingDir = config.Container.WorkingDirectory;

            var converter = new TestcontainersConfigurationConverter(config);

            var entrypoint = converter.Entrypoint;

            var cmd = converter.Command;

            var env = converter.Environments;

            var labels = converter.Labels;

            var exposedPorts = converter.ExposedPorts;

            var portBindings = converter.PortBindings;

            var mounts = converter.Mounts;

            var hostConfig = new HostConfig
            {
                PortBindings = portBindings,
                Mounts       = mounts,
            };

            var createParameters = new CreateContainerParameters
            {
                Image        = image,
                Name         = name,
                WorkingDir   = workingDir,
                Entrypoint   = entrypoint,
                Env          = env,
                Labels       = labels,
                Cmd          = cmd,
                ExposedPorts = exposedPorts,
                HostConfig   = hostConfig,
            };

            await pullImageTask;

            var id = (await Docker.Containers.CreateContainerAsync(createParameters, ct)).ID;

            TestcontainersRegistryService.Register(id, config.CleanUp);

            return(id);
        }