diff --git a/src/Microsoft.Tye.Hosting/DockerRunner.cs b/src/Microsoft.Tye.Hosting/DockerRunner.cs index a7a43a65..3348766a 100644 --- a/src/Microsoft.Tye.Hosting/DockerRunner.cs +++ b/src/Microsoft.Tye.Hosting/DockerRunner.cs @@ -84,7 +84,7 @@ namespace Microsoft.Tye.Hosting var dockerInfo = new DockerInformation(new Task[service.Description.Replicas]); - async Task RunDockerContainer(IEnumerable<(int Port, int? ContainerPort, int BindingPort, string? Protocol)> ports) + async Task RunDockerContainer(IEnumerable<(int ExternalPort, int Port, int? ContainerPort, string? Protocol)> ports) { var hasPorts = ports.Any(); @@ -122,7 +122,7 @@ namespace Microsoft.Tye.Hosting if (string.Equals(p.Protocol, "https", StringComparison.OrdinalIgnoreCase)) { // We need to set the redirect URL to the exposed port so the redirect works cleanly - environment["HTTPS_PORT"] = p.BindingPort.ToString(); + environment["HTTPS_PORT"] = p.ExternalPort.ToString(); } } @@ -247,7 +247,7 @@ namespace Microsoft.Tye.Hosting // port for (var i = 0; i < serviceDescription.Replicas; i++) { - var ports = new List<(int, int?, int, string?)>(); + var ports = new List<(int, int, int?, string?)>(); foreach (var binding in serviceDescription.Bindings) { if (binding.Port == null) @@ -255,7 +255,7 @@ namespace Microsoft.Tye.Hosting continue; } - ports.Add((service.PortMap[binding.Port.Value][i], binding.ContainerPort, binding.Port.Value, binding.Protocol)); + ports.Add((binding.Port.Value, binding.ReplicaPorts[i], binding.ContainerPort, binding.Protocol)); } dockerInfo.Tasks[i] = RunDockerContainer(ports); @@ -265,7 +265,7 @@ namespace Microsoft.Tye.Hosting { for (var i = 0; i < service.Description.Replicas; i++) { - dockerInfo.Tasks[i] = RunDockerContainer(Enumerable.Empty<(int, int?, int, string?)>()); + dockerInfo.Tasks[i] = RunDockerContainer(Enumerable.Empty<(int, int, int?, string?)>()); } } diff --git a/src/Microsoft.Tye.Hosting/HttpProxyService.cs b/src/Microsoft.Tye.Hosting/HttpProxyService.cs index 23287752..6834f9d2 100644 --- a/src/Microsoft.Tye.Hosting/HttpProxyService.cs +++ b/src/Microsoft.Tye.Hosting/HttpProxyService.cs @@ -71,7 +71,7 @@ namespace Microsoft.Tye.Hosting continue; } - var port = service.PortMap[binding.Port.Value][i]; + var port = binding.ReplicaPorts[i]; ports.Add(port); var url = $"{binding.Protocol}://localhost:{port}"; addresses.Add(url); @@ -115,7 +115,7 @@ namespace Microsoft.Tye.Hosting // based on the replica port for (int i = 0; i < targetServiceDescription.Replicas; i++) { - var port = target.PortMap[targetBinding.Port!.Value][i]; + var port = targetBinding.ReplicaPorts[i]; var url = $"{targetBinding.Protocol}://localhost:{port}"; uris.Add(new Uri(url)); } diff --git a/src/Microsoft.Tye.Hosting/Model/Service.cs b/src/Microsoft.Tye.Hosting/Model/Service.cs index 44bd9970..58e7cf0d 100644 --- a/src/Microsoft.Tye.Hosting/Model/Service.cs +++ b/src/Microsoft.Tye.Hosting/Model/Service.cs @@ -62,8 +62,6 @@ namespace Microsoft.Tye.Hosting.Model public ConcurrentDictionary Replicas { get; set; } = new ConcurrentDictionary(); - public Dictionary> PortMap { get; set; } = new Dictionary>(); - public Dictionary Items { get; } = new Dictionary(); public Queue CachedLogs { get; } = new Queue(); diff --git a/src/Microsoft.Tye.Hosting/Model/ServiceBinding.cs b/src/Microsoft.Tye.Hosting/Model/ServiceBinding.cs index beebcb9b..bda01fd3 100644 --- a/src/Microsoft.Tye.Hosting/Model/ServiceBinding.cs +++ b/src/Microsoft.Tye.Hosting/Model/ServiceBinding.cs @@ -2,6 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Collections.Generic; + namespace Microsoft.Tye.Hosting.Model { public class ServiceBinding @@ -13,5 +15,6 @@ namespace Microsoft.Tye.Hosting.Model public int? ContainerPort { get; set; } public string? Host { get; set; } public string? Protocol { get; set; } + public List ReplicaPorts { get; } = new List(); } } diff --git a/src/Microsoft.Tye.Hosting/PortAssigner.cs b/src/Microsoft.Tye.Hosting/PortAssigner.cs index 76ca1200..9dbda6ca 100644 --- a/src/Microsoft.Tye.Hosting/PortAssigner.cs +++ b/src/Microsoft.Tye.Hosting/PortAssigner.cs @@ -58,27 +58,23 @@ namespace Microsoft.Tye.Hosting if (service.Description.Replicas == 1) { // No need to proxy, the port maps to itself - service.PortMap[binding.Port.Value] = new List { binding.Port.Value }; + binding.ReplicaPorts.Add(binding.Port.Value); continue; } - var ports = new List(); - for (var i = 0; i < service.Description.Replicas; i++) { // Reserve a port for each replica var port = GetNextPort(); - ports.Add(port); + binding.ReplicaPorts.Add(port); } _logger.LogInformation( "Mapping external port {ExternalPort} to internal port(s) {InternalPorts} for {ServiceName} binding {BindingName}", binding.Port, - string.Join(", ", ports.Select(p => p.ToString())), + string.Join(", ", binding.ReplicaPorts.Select(p => p.ToString())), service.Description.Name, binding.Name ?? binding.Protocol); - - service.PortMap[binding.Port.Value] = ports; } var httpBinding = service.Description.Bindings.FirstOrDefault(b => b.Protocol == "http"); diff --git a/src/Microsoft.Tye.Hosting/ProcessRunner.cs b/src/Microsoft.Tye.Hosting/ProcessRunner.cs index e2a3c91a..c6ca6938 100644 --- a/src/Microsoft.Tye.Hosting/ProcessRunner.cs +++ b/src/Microsoft.Tye.Hosting/ProcessRunner.cs @@ -110,7 +110,7 @@ namespace Microsoft.Tye.Hosting } } - async Task RunApplicationAsync(IEnumerable<(int Port, int BindingPort, string? Protocol)> ports) + async Task RunApplicationAsync(IEnumerable<(int ExternalPort, int Port, string? Protocol)> ports) { // Make sure we yield before trying to start the process, this is important so we don't hang startup await Task.Yield(); @@ -153,7 +153,7 @@ namespace Microsoft.Tye.Hosting if (string.Equals(p.Protocol, "https", StringComparison.OrdinalIgnoreCase)) { // We need to set the redirect URL to the exposed port so the redirect works cleanly - environment["HTTPS_PORT"] = p.BindingPort.ToString(); + environment["HTTPS_PORT"] = p.ExternalPort.ToString(); } } @@ -258,7 +258,7 @@ namespace Microsoft.Tye.Hosting continue; } - ports.Add((service.PortMap[binding.Port.Value][i], binding.Port.Value, binding.Protocol)); + ports.Add((binding.Port.Value, binding.ReplicaPorts[i], binding.Protocol)); } processInfo.Tasks[i] = RunApplicationAsync(ports); diff --git a/src/Microsoft.Tye.Hosting/ProxyService.cs b/src/Microsoft.Tye.Hosting/ProxyService.cs index 293b5cd5..b300b0c2 100644 --- a/src/Microsoft.Tye.Hosting/ProxyService.cs +++ b/src/Microsoft.Tye.Hosting/ProxyService.cs @@ -57,7 +57,7 @@ namespace Microsoft.Tye.Hosting continue; } - var ports = service.PortMap[binding.Port.Value]; + var ports = binding.ReplicaPorts; sockets.Listen(IPAddress.Loopback, binding.Port.Value, o => {