public void ExposePortsAddsPortsToExisting(int?internalPort1, int?externalPort1, int?internalPort2, int?externalPort2)
        {
            // Arrange
            var sut = new StartContainerOptions();

            sut.ExposePort(42, 42);

            var portMappings = new List <DockerPortMapping>
            {
                GetPortMapping(internalPort1, externalPort1),
                GetPortMapping(internalPort2, externalPort2)
            }.Where(p => p != null);

            var expectedMappings = new List <DockerPortMapping> {
                new DockerPortMapping(42, 42)
            };

            expectedMappings.AddRange(portMappings);

            // Act
            sut.ExposePorts(portMappings);

            // Assert
            sut.DockerPortMappings.Should().BeEquivalentTo(expectedMappings);
        }
Beispiel #2
0
        internal async Task <DockerContainer> StartContainerAsync(string imageId, Action <StartContainerOptions> configureOptions = null)
        {
            StartContainerOptions options = null;

            if (configureOptions != null)
            {
                options = new StartContainerOptions();
                configureOptions(options);
                options.Validate();
            }

            var cmd     = DockerCommands.Image.RunContainer(imageId, options);
            var command = _commandFactory.RunCommand(cmd, _client.WorkingDirectory, new CancellationToken());

            await command.Task;

            var success = command.Result.Success;

            if (!success)
            {
                throw new DockerCommandException(cmd, command.GetOutputAndErrorLines().ToList());
            }

            var output    = command.GetOutputAndErrorLines();
            var firstLine = output.FirstOrDefault();

            if (string.IsNullOrWhiteSpace(firstLine) || firstLine.Length < 12)
            {
                throw new DockerCommandUnexpectedOutputException(cmd, command.GetOutputAndErrorLines().ToList());
            }

            var containerId = firstLine.Substring(0, 12);

            return(new DockerContainer(_client, _commandFactory, containerId, options?.DockerPortMappings));
        }
        public void ConstructorDefaultsSet_Memory()
        {
            // Arrange/Act
            var sut = new StartContainerOptions();

            // Assert
            sut.MemoryLimitMb.Should().Be(null);
        }
        public void ConstructorDefaultsSet_PortMappings()
        {
            // Arrange/Act
            var sut = new StartContainerOptions();

            // Assert
            sut.DockerPortMappings.Should().BeEmpty();
        }
        public void ValidateWhenCpuCountAtMaxAllowed()
        {
            // Arrange
            var sut = new StartContainerOptions();

            sut.WithCpuLimit(Environment.ProcessorCount);

            // Act/Assert
            Assert.DoesNotThrow(() => sut.Validate());
        }
        public void ValidateWhenMemoryLimitValid(int memLimit)
        {
            // Arrange
            var sut = new StartContainerOptions();

            sut.WithMemoryLimit(memLimit);

            // Act/Assert
            Assert.DoesNotThrow(() => sut.Validate());
        }
        public void ValidateWhenCpuCountValidAboveZero()
        {
            // Arrange
            var sut = new StartContainerOptions();

            sut.WithCpuLimit(0.1m);

            // Act/Assert
            Assert.DoesNotThrow(() => sut.Validate());
        }
Beispiel #8
0
        public void WithOptionsCpuLimit_AddsArgument()
        {
            //Arrange
            var options = new StartContainerOptions().WithCpuLimit(0m);

            // Act
            var result = Dockhand.Client.DockerCommands.Image.RunContainer(ImageId, options);

            // Assert
            result.Should().Contain($"docker run -d --cpus 0 {ImageId}");
        }
Beispiel #9
0
        public void WithOptionsMemoryLimit_AddsArgument()
        {
            //Arrange
            var options = new StartContainerOptions().WithMemoryLimit(1);

            // Act
            var result = Dockhand.Client.DockerCommands.Image.RunContainer(ImageId, options);

            // Assert
            result.Should().Be($"docker run -d --memory 1m {ImageId}");
        }
Beispiel #10
0
        public void WithEmptyOptions()
        {
            //Arrange
            var options = new StartContainerOptions();

            // Act
            var result = Dockhand.Client.DockerCommands.Image.RunContainer(ImageId, options);

            // Assert
            result.Should().Be($"docker run -d {ImageId}");
        }
        public void WithCpuLimitSetsCpuLimit(decimal cpuLimit)
        {
            // Arrange
            var sut = new StartContainerOptions();

            // Act
            sut.WithCpuLimit(cpuLimit);

            // Assert
            sut.CpuLimit.Should().Be(cpuLimit);
        }
        public void WithMemoryLimitSetsMemoryLimitMb(int memoryLimit)
        {
            // Arrange
            var sut = new StartContainerOptions();


            // Act
            sut.WithMemoryLimit(memoryLimit);

            // Assert
            sut.MemoryLimitMb.Should().Be(memoryLimit);
        }
Beispiel #13
0
        public void WithOptionsMemAndCpuLimit_AddsArguments()
        {
            //Arrange
            var options = new StartContainerOptions()
                          .WithCpuLimit(16.5m)
                          .WithMemoryLimit(0);

            // Act
            var result = Dockhand.Client.DockerCommands.Image.RunContainer(ImageId, options);

            // Assert
            result.Should().Contain($"docker run -d --memory 0m --cpus 16.5 {ImageId}");
        }
        public void ValidateWhenCpuCountTooHigh()
        {
            // Arrange
            var sut = new StartContainerOptions();

            sut.WithCpuLimit(Environment.ProcessorCount + 1);

            // Act
            var exception = Assert.Catch(() => sut.Validate());

            // Assert
            exception.Should().BeOfType <ArgumentException>();
        }
        public void ValidateWhenCpuCountTooLow(decimal cpuCount)
        {
            // Arrange
            var sut = new StartContainerOptions();

            sut.WithCpuLimit(cpuCount);

            // Act
            var exception = Assert.Catch(() => sut.Validate());

            // Assert
            exception.Should().BeOfType <ArgumentException>();
        }
        public void ExposePortAddsPort()
        {
            // Arrange
            var internalPort = 443;
            var externalPort = 5003;
            var sut          = new StartContainerOptions();

            var expectedMappings = new [] { GetPortMapping(internalPort, externalPort) };

            // Act
            sut.ExposePort(443, 5003);

            // Assert
            sut.DockerPortMappings.Should().BeEquivalentTo(expectedMappings);
        }
        public void ExposePortAddsPortToExisting()
        {
            // Arrange
            var internalPort = 43;
            var externalPort = 44;
            var sut          = new StartContainerOptions();

            sut.ExposePorts(new [] { GetPortMapping(42, 42) });

            var expectedMappings = new [] { GetPortMapping(42, 42), GetPortMapping(internalPort, externalPort) };

            // Act
            sut.ExposePort(internalPort, externalPort);

            // Assert
            sut.DockerPortMappings.Should().BeEquivalentTo(expectedMappings);
        }
Beispiel #18
0
        public void WithOptionsPortMappings_AddsArgumentPerPort(int?internalPort1, int?externalPort1, int?internalPort2, int?externalPort2, string expectedPortArguments)
        {
            //Arrange
            var options = new StartContainerOptions();

            if (internalPort1.HasValue && externalPort1.HasValue)
            {
                options.ExposePort(internalPort1.Value, externalPort1.Value);
            }

            if (internalPort2.HasValue && externalPort2.HasValue)
            {
                options.ExposePort(internalPort2.Value, externalPort2.Value);
            }

            // Act
            var result = Dockhand.Client.DockerCommands.Image.RunContainer(ImageId, options);

            // Assert
            result.Should().Contain($"docker run -d {expectedPortArguments}{ImageId}");
        }
Beispiel #19
0
            internal static string RunContainer(string imageId, StartContainerOptions options)
            {
                var command = "docker run -d";

                if (options?.DockerPortMappings.Any() ?? false)
                {
                    var portStringArguments = options.DockerPortMappings.Select(p => $"-p {p.ToString()}").ToArray();
                    command = command + $" {string.Join(" ", portStringArguments)}";
                }

                if (options?.MemoryLimitMb != null)
                {
                    command = command + $" --memory {options.MemoryLimitMb.Value}m";
                }

                if (options?.CpuLimit != null)
                {
                    command = command + $" --cpus {options.CpuLimit.Value}";
                }

                return(command + $" {imageId}");
            }