Skip to content

Support for Custom IPEndpoint Resolver

Compare
Choose a tag to compare
@mariotoffia mariotoffia released this 25 Mar 18:12
· 107 commits to master since this release

This release just adds a single functionality - Ability to provide with a custome endpoint resolver on a ContainerBuilder. This solves issue #107.

If the resolver returns null or is null on the container service, it will use the default mechanism to resolve the IP endpoint.

It can be used in the following manner.

      using (
        var container =
          Fd.UseContainer()
            .UseImage("postgres:9.6-alpine")
            .WithEnvironment("POSTGRES_PASSWORD=mysecretpassword")
            .ExposePort(5432)
            .UseCustomResolver((
              ports, portAndProto, dockerUri) =>
            {
              if (null == ports || string.IsNullOrEmpty(portAndProto))
                return null;

              if (!ports.TryGetValue(portAndProto, out var endpoints))
                return null;

              if (null == endpoints || endpoints.Length == 0)
                return null;

              if (CommandExtensions.IsNative())
                return endpoints[0];

              if (CommandExtensions.IsEmulatedNative())
                return CommandExtensions.IsDockerDnsAvailable()
                  ? new IPEndPoint(CommandExtensions.EmulatedNativeAddress(), endpoints[0].Port)
                  : new IPEndPoint(IPAddress.Loopback, endpoints[0].Port);

              if (Equals(endpoints[0].Address, IPAddress.Any) && null != dockerUri)
                return new IPEndPoint(IPAddress.Parse(dockerUri.Host), endpoints[0].Port);

              return endpoints[0];
            })
            .WaitForPort("5432/tcp", 30000 /*30s*/)
            .Build()
            .Start())
      {
        var state = container.GetConfiguration(true/*force*/).State.ToServiceState();
        Assert.AreEqual(ServiceRunningState.Running, state);
      }