From f39b4596f329d68e1ce82f2b4931394362ac2d72 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Wed, 11 Mar 2020 15:22:31 -0700 Subject: [PATCH] Change how ports work for local ASP.NET Core apps Instead of using the ports in launchSettings.json we'll now just ignore them. This means that ports get auto-assigned when they are not specified in tye.yaml. This avoid the conflict when multiple default asp.net core applications are used - so as a result, tye.yaml isn't needed in as many situations. --- src/Tye.Hosting/Model/ServiceBinding.cs | 1 + src/Tye.Hosting/ProxyService.cs | 14 ++++++++++++-- src/tye/ConfigModel/ConfigApplication.cs | 1 + src/tye/ConfigModel/ConfigFactory.cs | 5 ++++- src/tye/ConfigModel/ConfigServiceBinding.cs | 1 + 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Tye.Hosting/Model/ServiceBinding.cs b/src/Tye.Hosting/Model/ServiceBinding.cs index 8f067f1e..61092e49 100644 --- a/src/Tye.Hosting/Model/ServiceBinding.cs +++ b/src/Tye.Hosting/Model/ServiceBinding.cs @@ -8,6 +8,7 @@ namespace Tye.Hosting.Model { public string? Name { get; set; } public string? ConnectionString { get; set; } + public bool AutoAssignPort { get; set; } public int? Port { get; set; } public int? InternalPort { get; set; } public string? Host { get; set; } diff --git a/src/Tye.Hosting/ProxyService.cs b/src/Tye.Hosting/ProxyService.cs index 212d4076..e2d3a61b 100644 --- a/src/Tye.Hosting/ProxyService.cs +++ b/src/Tye.Hosting/ProxyService.cs @@ -59,11 +59,16 @@ namespace Tye.Hosting foreach (var binding in service.Description.Bindings) { - if (binding.Port == null) + if (binding.Port == null && !binding.AutoAssignPort) { continue; } + if (binding.Port == null) + { + binding.Port = GetNextPort(); + } + if (service.Description.Replicas == 1) { // No need to proxy @@ -80,7 +85,12 @@ namespace Tye.Hosting ports.Add(port); } - _logger.LogInformation("Mapping external port {ExternalPort} to internal port(s) {InternalPorts} for {ServiceName}", binding.Port, string.Join(", ", ports.Select(p => p.ToString())), service.Description.Name); + _logger.LogInformation( + "Mapping external port {ExternalPort} to internal port(s) {InternalPorts} for {ServiceName} binding {BindingName}", + binding.Port, + string.Join(", ", ports.Select(p => p.ToString())), + service.Description.Name, + binding.Name ?? binding.Protocol); service.PortMap[binding.Port.Value] = ports; diff --git a/src/tye/ConfigModel/ConfigApplication.cs b/src/tye/ConfigModel/ConfigApplication.cs index fa6b460e..855380b9 100644 --- a/src/tye/ConfigModel/ConfigApplication.cs +++ b/src/tye/ConfigModel/ConfigApplication.cs @@ -60,6 +60,7 @@ namespace Tye.ConfigModel { ConnectionString = binding.ConnectionString, Host = binding.Host, + AutoAssignPort = binding.AutoAssignPort, InternalPort = binding.InternalPort, Name = binding.Name, Port = binding.Port, diff --git a/src/tye/ConfigModel/ConfigFactory.cs b/src/tye/ConfigModel/ConfigFactory.cs index 9dca2876..a7485c28 100644 --- a/src/tye/ConfigModel/ConfigFactory.cs +++ b/src/tye/ConfigModel/ConfigFactory.cs @@ -157,7 +157,10 @@ namespace Tye.ConfigModel var uri = new Uri(address); service.Bindings.Add(new ConfigServiceBinding() { - Port = uri.Port, + // Don't use ports from launch profiles. These are very likely to be the same defaults (5000, 5001) + // that were generated when the project was created, and so they will almost always conflict + // between multiple apps. + AutoAssignPort = true, Protocol = uri.Scheme }); } diff --git a/src/tye/ConfigModel/ConfigServiceBinding.cs b/src/tye/ConfigModel/ConfigServiceBinding.cs index 1e37798e..880ffa3c 100644 --- a/src/tye/ConfigModel/ConfigServiceBinding.cs +++ b/src/tye/ConfigModel/ConfigServiceBinding.cs @@ -8,6 +8,7 @@ namespace Tye.ConfigModel { public string? Name { get; set; } public string? ConnectionString { get; set; } + public bool AutoAssignPort { get; set; } public int? Port { get; set; } public int? InternalPort { get; set; } public string? Host { get; set; }