From 679c2c9af32333823231b43f73dcba8e28b5d9eb Mon Sep 17 00:00:00 2001 From: Peter Kurfer Date: Fri, 5 Mar 2021 21:16:14 +0100 Subject: [PATCH] Try to set Docker endpoint correctly for TLS --- .gitlab-ci.yml | 3 ++ .../DockerEndpoint.cs | 36 +++++++++++++++++++ .../DockerEndpointTests.cs | 22 ++++++++++++ .../INetMock.Client.IntegrationTest.csproj | 2 ++ .../INetMockServerFixture.cs | 7 ++-- 5 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 tests/INetMock.Client.IntegrationTest/DockerEndpoint.cs create mode 100644 tests/INetMock.Client.IntegrationTest/DockerEndpointTests.cs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ad01cf8..671c2f3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,6 +18,9 @@ test: PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/docker script: - curl https://download.docker.com/linux/static/stable/x86_64/docker-20.10.4.tgz | tar -xzv -C /usr/local/ + - mkdir /usr/local/share/ca-certificates/docker-ca + - cp "${DOCKER_CERT_PATH}/ca.pem" /usr/local/share/ca-certificates/docker-ca/ + - update-ca-certificates --fresh - dotnet tool restore - dotnet nuke Test diff --git a/tests/INetMock.Client.IntegrationTest/DockerEndpoint.cs b/tests/INetMock.Client.IntegrationTest/DockerEndpoint.cs new file mode 100644 index 0000000..1649166 --- /dev/null +++ b/tests/INetMock.Client.IntegrationTest/DockerEndpoint.cs @@ -0,0 +1,36 @@ +using System; +using System.Globalization; +using System.Runtime.InteropServices; + +namespace INetMock.Client.IntegrationTest +{ + internal static class DockerEndpoint + { + private const string DockerHostEnvName = "DOCKER_HOST"; + private const string DockerTlsVerifyEnvName = "DOCKER_TLS_VERIFY"; + + internal static string DetermineFromEnv() => DetermineEndpoint( + Environment.GetEnvironmentVariable(DockerHostEnvName), + Environment.GetEnvironmentVariable(DockerTlsVerifyEnvName) + ); + + internal static string DetermineEndpoint(string? dockerHost, string? tlsVerify) + { + dockerHost ??= ""; + var dockerTlsVerify = int.TryParse(tlsVerify, out var verify) && verify == 1; + var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + return (dockerHost, dockerTlsVerify, isWindows) switch + { + ("", _, true) => "npipe://./pipe/docker_engine", + ("", _, false) => "unix:/var/run/docker.sock", + (_, false, _) => dockerHost, + (var h, true, _) when h.StartsWith("tcp") => h.Replace( + "tcp", + "https", + true, + CultureInfo.InvariantCulture), + _ => "", + }; + } + } +} diff --git a/tests/INetMock.Client.IntegrationTest/DockerEndpointTests.cs b/tests/INetMock.Client.IntegrationTest/DockerEndpointTests.cs new file mode 100644 index 0000000..b006fcc --- /dev/null +++ b/tests/INetMock.Client.IntegrationTest/DockerEndpointTests.cs @@ -0,0 +1,22 @@ +using Xunit; + +namespace INetMock.Client.IntegrationTest +{ + public class DockerEndpointTests + { + [Theory] + [InlineData(null, null, "unix:/var/run/docker.sock")] + [InlineData("tcp://docker:2375", null, "tcp://docker:2375")] + [InlineData("tcp://docker:2375", "0", "tcp://docker:2375")] + [InlineData("http://docker:2375", null, "http://docker:2375")] + [InlineData("http://docker:2375", "0", "http://docker:2375")] + [InlineData("tcp://docker:2376", "1", "https://docker:2376")] + [InlineData("https://docker:2376", "0", "https://docker:2376")] + public void DetermineDockerEndpoint_Input_ExpectedOutput(string? dockerHost, string? tlsVerify, string expected) + { + var actual = DockerEndpoint.DetermineEndpoint(dockerHost, tlsVerify); + + Assert.Equal(expected, actual); + } + } +} diff --git a/tests/INetMock.Client.IntegrationTest/INetMock.Client.IntegrationTest.csproj b/tests/INetMock.Client.IntegrationTest/INetMock.Client.IntegrationTest.csproj index ff06711..0961e02 100644 --- a/tests/INetMock.Client.IntegrationTest/INetMock.Client.IntegrationTest.csproj +++ b/tests/INetMock.Client.IntegrationTest/INetMock.Client.IntegrationTest.csproj @@ -4,6 +4,8 @@ net5.0 false + + enable diff --git a/tests/INetMock.Client.IntegrationTest/INetMockServerFixture.cs b/tests/INetMock.Client.IntegrationTest/INetMockServerFixture.cs index c9e044c..f8cb433 100644 --- a/tests/INetMock.Client.IntegrationTest/INetMockServerFixture.cs +++ b/tests/INetMock.Client.IntegrationTest/INetMockServerFixture.cs @@ -10,8 +10,9 @@ namespace INetMock.Client.IntegrationTest { public class INetMockServerFixture : IAsyncLifetime { + private readonly TestcontainersContainer _inetmockContainer; - + public INetMockServerFixture() { _inetmockContainer = new TestcontainersBuilder() @@ -19,13 +20,13 @@ namespace INetMock.Client.IntegrationTest .WithCommand("serve") .WithPortBinding(80, true) .WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(80)) - .WithDockerEndpoint(Environment.GetEnvironmentVariable("DOCKER_HOST") ?? "unix:///var/run/docker.sock") + .WithDockerEndpoint(DockerEndpoint.DetermineFromEnv()) .WithMount(Path.GetTempPath(), "/var/run/inetmock") .WithCleanUp(true) .Build(); } - public Uri SocketPath => new ($"unix://{Path.Join(Path.GetTempPath(), "inetmock.sock")}", UriKind.Absolute); + public Uri SocketPath => new($"unix://{Path.Join(Path.GetTempPath(), "inetmock.sock")}", UriKind.Absolute); public async Task InitializeAsync() {