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); }
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()); }
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}"); }
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}"); }
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); }
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); }
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}"); }
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}"); }