diff --git a/src/ServiceControl.Audit.Persistence.Tests/InstallationTests.cs b/src/ServiceControl.Audit.Persistence.Tests/InstallationTests.cs index 53a85e74cb..5f2f2de0e1 100644 --- a/src/ServiceControl.Audit.Persistence.Tests/InstallationTests.cs +++ b/src/ServiceControl.Audit.Persistence.Tests/InstallationTests.cs @@ -2,7 +2,6 @@ { using System; using System.IO; - using System.Linq; using System.Text.Json; using NUnit.Framework; using Particular.Approvals; @@ -34,7 +33,7 @@ public void Should_write_expected_config_file() var logPath = Path.Combine(Path.GetTempPath(), TestContext.CurrentContext.Test.ID, "log"); newInstance.InstallPath = installPath; - newInstance.TransportPackage = ServiceControlCoreTransports.All.Single(t => t.Name == TransportNames.MSMQ); + newInstance.TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ); newInstance.DBPath = dbPath; newInstance.LogPath = logPath; diff --git a/src/ServiceControl.Config/UI/InstanceAdd/ServiceControlEditorViewModel.cs b/src/ServiceControl.Config/UI/InstanceAdd/ServiceControlEditorViewModel.cs index e2fa609006..5bddc1e1cb 100644 --- a/src/ServiceControl.Config/UI/InstanceAdd/ServiceControlEditorViewModel.cs +++ b/src/ServiceControl.Config/UI/InstanceAdd/ServiceControlEditorViewModel.cs @@ -1,7 +1,6 @@ namespace ServiceControl.Config.UI.InstanceAdd; using System.Collections.Generic; -using System.Linq; using System.Windows.Input; using Framework.Rx; using PropertyChanged; @@ -12,7 +11,7 @@ public class ServiceControlEditorViewModel : RxProgressScreen { public ServiceControlEditorViewModel() { - Transports = ServiceControlCoreTransports.All.Where(t => t.AvailableInSCMU); + Transports = ServiceControlCoreTransports.GetSupportedTransports(); ServiceControl = new ServiceControlInformation(this); ServiceControlAudit = new ServiceControlAuditInformation(this); } diff --git a/src/ServiceControl.Config/UI/InstanceDetails/InstanceDetailsViewModel.cs b/src/ServiceControl.Config/UI/InstanceDetails/InstanceDetailsViewModel.cs index 4259e6f5ee..a324fd37bb 100644 --- a/src/ServiceControl.Config/UI/InstanceDetails/InstanceDetailsViewModel.cs +++ b/src/ServiceControl.Config/UI/InstanceDetails/InstanceDetailsViewModel.cs @@ -166,7 +166,12 @@ public string Persister return "InMemory"; } - return "RavenDB 3.5"; + if (ServiceInstance.Version.Major <= 4) + { + return "RavenDB 3.5"; + } + + return "Unknown"; } } diff --git a/src/ServiceControl.Config/UI/SharedInstanceEditor/SharedMonitoringEditorViewModel.cs b/src/ServiceControl.Config/UI/SharedInstanceEditor/SharedMonitoringEditorViewModel.cs index c6bbf447f8..fcdcddc106 100644 --- a/src/ServiceControl.Config/UI/SharedInstanceEditor/SharedMonitoringEditorViewModel.cs +++ b/src/ServiceControl.Config/UI/SharedInstanceEditor/SharedMonitoringEditorViewModel.cs @@ -4,20 +4,19 @@ namespace ServiceControl.Config.UI.SharedInstanceEditor { using System; using System.Collections.Generic; - using System.Linq; using System.Windows.Input; using Framework.Rx; using PropertyChanged; + using ServiceControl.Config.Extensions; using ServiceControlInstaller.Engine.Instances; using Validation; - using ServiceControl.Config.Extensions; using Validations = Validation.Validations; public class SharedMonitoringEditorViewModel : RxProgressScreen { public SharedMonitoringEditorViewModel() { - Transports = ServiceControlCoreTransports.All.Where(t => t.AvailableInSCMU); + Transports = ServiceControlCoreTransports.GetSupportedTransports(); } [DoNotNotify] diff --git a/src/ServiceControl.Management.PowerShell/Cmdlets/AuditInstances/NewServiceControlAuditInstance.cs b/src/ServiceControl.Management.PowerShell/Cmdlets/AuditInstances/NewServiceControlAuditInstance.cs index 2e9c21a934..44f9e233d9 100644 --- a/src/ServiceControl.Management.PowerShell/Cmdlets/AuditInstances/NewServiceControlAuditInstance.cs +++ b/src/ServiceControl.Management.PowerShell/Cmdlets/AuditInstances/NewServiceControlAuditInstance.cs @@ -151,7 +151,7 @@ protected override void ProcessRecord() newAuditInstance.ForwardAuditMessages = ForwardAuditMessages.ToBool(); newAuditInstance.AuditRetentionPeriod = AuditRetentionPeriod; newAuditInstance.ConnectionString = ConnectionString; - newAuditInstance.TransportPackage = ServiceControlCoreTransports.All.First(t => t.Matches(Transport)); + newAuditInstance.TransportPackage = ServiceControlCoreTransports.Find(Transport); newAuditInstance.SkipQueueCreation = SkipQueueCreation; newAuditInstance.ServiceControlQueueAddress = ServiceControlQueueAddress; newAuditInstance.EnableFullTextSearchOnBodies = EnableFullTextSearchOnBodies; diff --git a/src/ServiceControl.Management.PowerShell/Cmdlets/MonitoringInstances/NewMonitoringInstance.cs b/src/ServiceControl.Management.PowerShell/Cmdlets/MonitoringInstances/NewMonitoringInstance.cs index 53d83b5781..f5d5e32773 100644 --- a/src/ServiceControl.Management.PowerShell/Cmdlets/MonitoringInstances/NewMonitoringInstance.cs +++ b/src/ServiceControl.Management.PowerShell/Cmdlets/MonitoringInstances/NewMonitoringInstance.cs @@ -121,7 +121,7 @@ protected override void ProcessRecord() Port = Port, ErrorQueue = ErrorQueue, ConnectionString = ConnectionString, - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Matches(Transport)), + TransportPackage = ServiceControlCoreTransports.Find(Transport), SkipQueueCreation = SkipQueueCreation }; var details = monitoringNewInstance; diff --git a/src/ServiceControl.Management.PowerShell/Cmdlets/ServiceControlInstances/NewServiceControlInstance.cs b/src/ServiceControl.Management.PowerShell/Cmdlets/ServiceControlInstances/NewServiceControlInstance.cs index d783e69d88..e6ffb30403 100644 --- a/src/ServiceControl.Management.PowerShell/Cmdlets/ServiceControlInstances/NewServiceControlInstance.cs +++ b/src/ServiceControl.Management.PowerShell/Cmdlets/ServiceControlInstances/NewServiceControlInstance.cs @@ -166,7 +166,7 @@ protected override void ProcessRecord() ForwardErrorMessages = ForwardErrorMessages.ToBool(), ErrorRetentionPeriod = ErrorRetentionPeriod, ConnectionString = ConnectionString, - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Matches(Transport)), + TransportPackage = ServiceControlCoreTransports.Find(Transport), SkipQueueCreation = SkipQueueCreation, EnableFullTextSearchOnBodies = EnableFullTextSearchOnBodies, }; diff --git a/src/ServiceControl.Management.PowerShell/Cmdlets/Transports/GetServiceControlTransportTypes.cs b/src/ServiceControl.Management.PowerShell/Cmdlets/Transports/GetServiceControlTransportTypes.cs index 2563bd4895..cb1a367758 100644 --- a/src/ServiceControl.Management.PowerShell/Cmdlets/Transports/GetServiceControlTransportTypes.cs +++ b/src/ServiceControl.Management.PowerShell/Cmdlets/Transports/GetServiceControlTransportTypes.cs @@ -1,6 +1,5 @@ namespace ServiceControl.Management.PowerShell { - using System.Linq; using System.Management.Automation; using ServiceControlInstaller.Engine.Instances; @@ -9,7 +8,7 @@ public class GetServiceControlTransportTypes : Cmdlet { protected override void ProcessRecord() { - WriteObject(ServiceControlCoreTransports.All.Select(PsTransportInfo.FromTransport), true); + WriteObject(ServiceControlCoreTransports.Select(PsTransportInfo.FromTransport), true); } } } \ No newline at end of file diff --git a/src/ServiceControlInstaller.Engine.UnitTests/Configuration/AuditInstanceTests.cs b/src/ServiceControlInstaller.Engine.UnitTests/Configuration/AuditInstanceTests.cs index 09db3f4fc6..c5b8645942 100644 --- a/src/ServiceControlInstaller.Engine.UnitTests/Configuration/AuditInstanceTests.cs +++ b/src/ServiceControlInstaller.Engine.UnitTests/Configuration/AuditInstanceTests.cs @@ -2,12 +2,10 @@ { using System; using System.IO; - using System.Linq; using System.ServiceProcess; using System.Xml; using NUnit.Framework; using ServiceControlInstaller.Engine.Configuration.ServiceControl; - using ServiceControlInstaller.Engine.FileSystem; using ServiceControlInstaller.Engine.Instances; using ServiceControlInstaller.Engine.Services; @@ -20,7 +18,7 @@ public void Should_default_to_raven35_when_no_config_entry_exists() var newInstance = ServiceControlAuditNewInstance.CreateWithPersistence(ZipFileFolder.FullName, "RavenDB35"); newInstance.InstallPath = InstallPath; - newInstance.TransportPackage = ServiceControlCoreTransports.All.Single(t => t.Name == TransportNames.MSMQ); + newInstance.TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ); newInstance.DBPath = DbPath; newInstance.LogPath = LogPath; newInstance.HostName = "localhost"; @@ -56,7 +54,7 @@ public void Should_update_existing_persister() var newInstance = ServiceControlAuditNewInstance.CreateWithPersistence(ZipFileFolder.FullName, "RavenDB5"); newInstance.InstallPath = InstallPath; - newInstance.TransportPackage = ServiceControlCoreTransports.All.Single(t => t.Name == TransportNames.MSMQ); + newInstance.TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ); newInstance.DBPath = DbPath; newInstance.LogPath = LogPath; @@ -86,7 +84,7 @@ public void Should_remove_log_and_db_folders_on_uninstall() var newInstance = ServiceControlAuditNewInstance.CreateWithPersistence(ZipFileFolder.FullName, "RavenDB35"); newInstance.InstallPath = InstallPath; - newInstance.TransportPackage = ServiceControlCoreTransports.All.Single(t => t.Name == TransportNames.MSMQ); + newInstance.TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ); newInstance.DBPath = DbPath; newInstance.LogPath = LogPath; newInstance.HostName = "localhost"; diff --git a/src/ServiceControlInstaller.Engine.UnitTests/Configuration/NewAuditInstanceTests.cs b/src/ServiceControlInstaller.Engine.UnitTests/Configuration/NewAuditInstanceTests.cs index 5144b116c7..cf8939b7cf 100644 --- a/src/ServiceControlInstaller.Engine.UnitTests/Configuration/NewAuditInstanceTests.cs +++ b/src/ServiceControlInstaller.Engine.UnitTests/Configuration/NewAuditInstanceTests.cs @@ -15,7 +15,7 @@ public void Should_install_raven5_for_new_instances() var newInstance = ServiceControlAuditNewInstance.CreateWithDefaultPersistence(ZipFileFolder.FullName); newInstance.InstallPath = InstallPath; - newInstance.TransportPackage = ServiceControlCoreTransports.All.Single(t => t.Name == TransportNames.MSMQ); + newInstance.TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ); newInstance.DBPath = DbPath; newInstance.LogPath = LogPath; diff --git a/src/ServiceControlInstaller.Engine.UnitTests/RunEngineTasksExplicitly.cs b/src/ServiceControlInstaller.Engine.UnitTests/RunEngineTasksExplicitly.cs index f8d9af214f..f3e5809c2b 100644 --- a/src/ServiceControlInstaller.Engine.UnitTests/RunEngineTasksExplicitly.cs +++ b/src/ServiceControlInstaller.Engine.UnitTests/RunEngineTasksExplicitly.cs @@ -67,7 +67,7 @@ public async Task CreateInstanceMSMQ() AuditRetentionPeriod = TimeSpan.FromDays(SettingConstants.AuditRetentionPeriodDefaultInDaysForUI), ErrorRetentionPeriod = TimeSpan.FromDays(SettingConstants.ErrorRetentionPeriodDefaultInDaysForUI), ErrorQueue = "testerror", - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.MSMQ), + TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ), ReportCard = new ReportCard(), // but this fails for unit tests as the deploymentCache path is not used // constructer of ServiceControlInstanceMetadata extracts version from zip diff --git a/src/ServiceControlInstaller.Engine.UnitTests/Validation/QueueValidationTests.cs b/src/ServiceControlInstaller.Engine.UnitTests/Validation/QueueValidationTests.cs index caf067627f..fa257db0f0 100644 --- a/src/ServiceControlInstaller.Engine.UnitTests/Validation/QueueValidationTests.cs +++ b/src/ServiceControlInstaller.Engine.UnitTests/Validation/QueueValidationTests.cs @@ -16,13 +16,13 @@ public class QueueValidationTests public void Init() { var instanceA = new Mock(); - instanceA.SetupGet(p => p.TransportPackage).Returns(ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.MSMQ)); + instanceA.SetupGet(p => p.TransportPackage).Returns(ServiceControlCoreTransports.Find(TransportNames.MSMQ)); instanceA.SetupGet(p => p.ErrorQueue).Returns(@"error"); instanceA.SetupGet(p => p.ErrorLogQueue).Returns(@"errorlog"); instanceA.SetupGet(p => p.ForwardErrorMessages).Returns(true); var instanceB = new Mock(); - instanceB.SetupGet(p => p.TransportPackage).Returns(ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.RabbitMQClassicConventionalRoutingTopology || t.Name == TransportNames.RabbitMQQuorumConventionalRoutingTopology)); + instanceB.SetupGet(p => p.TransportPackage).Returns(ServiceControlCoreTransports.Find(TransportNames.RabbitMQClassicConventionalRoutingTopology)); instanceB.SetupGet(p => p.ErrorQueue).Returns(@"RMQerror"); instanceB.SetupGet(p => p.ErrorLogQueue).Returns(@"RMQerrorlog"); instanceB.SetupGet(p => p.ForwardErrorMessages).Returns(true); @@ -40,7 +40,7 @@ public void CheckQueueNamesAreUniqueShouldSucceed() { var newInstance = new ServiceControlNewInstance { - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.MSMQ), + TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ), ErrorLogQueue = "errorlog", ErrorQueue = "error" }; @@ -56,12 +56,12 @@ public void CheckQueueNamesAreUniqueShouldSucceed() public void CheckChainingOfAuditQueues_ShouldSucceed() { var existingAudit = new Mock(); - existingAudit.SetupGet(p => p.TransportPackage).Returns(ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.MSMQ)); + existingAudit.SetupGet(p => p.TransportPackage).Returns(ServiceControlCoreTransports.Find(TransportNames.MSMQ)); existingAudit.SetupGet(p => p.AuditQueue).Returns(@"audit"); var newInstance = ServiceControlAuditNewInstance.CreateWithDefaultPersistence(GetZipFolder().FullName); - newInstance.TransportPackage = ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.MSMQ); + newInstance.TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ); newInstance.AuditQueue = "audit"; var validator = new QueueNameValidator(newInstance) @@ -77,7 +77,7 @@ public void CheckQueueNamesAreUniqueShouldThrow() { var newInstance = new ServiceControlNewInstance { - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.MSMQ), + TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ), ErrorLogQueue = "error", ErrorQueue = "error", ForwardErrorMessages = true @@ -97,7 +97,7 @@ public void CheckQueueNamesAreNotTakenByAnotherInstance_ShouldSucceed() { var newInstance = new ServiceControlNewInstance { - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.MSMQ), + TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ), ErrorLogQueue = "errorlog2", ErrorQueue = "error2" }; @@ -115,7 +115,7 @@ public void CheckQueueNamesAreNotTakenByAnotherInstance_ShouldThrow() var expectedError = "Some queue names specified are already assigned to another ServiceControl instance - Correct the values for ErrorLogQueue, ErrorQueue"; var newInstance = new ServiceControlNewInstance { - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.MSMQ), + TransportPackage = ServiceControlCoreTransports.Find(TransportNames.MSMQ), ErrorLogQueue = "errorlog", ErrorQueue = "error", ForwardErrorMessages = true @@ -152,7 +152,7 @@ public void DuplicateQueueNamesAreAllowedOnDifferentTransports_ShouldNotThrow() var newInstance = new ServiceControlNewInstance { - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.RabbitMQQuorumConventionalRoutingTopology), + TransportPackage = ServiceControlCoreTransports.Find(TransportNames.RabbitMQQuorumConventionalRoutingTopology), ErrorLogQueue = "errorlog", ErrorQueue = "error", ForwardErrorMessages = true @@ -186,7 +186,7 @@ public void EnsureDuplicateQueueNamesAreAllowedOnSameTransportWithDifferentConne { var newInstance = new ServiceControlNewInstance { - TransportPackage = ServiceControlCoreTransports.All.First(t => t.Name == TransportNames.RabbitMQQuorumConventionalRoutingTopology), + TransportPackage = ServiceControlCoreTransports.Find(TransportNames.RabbitMQQuorumConventionalRoutingTopology), ErrorQueue = "RMQerror", ErrorLogQueue = "RMQerrorlog", ConnectionString = "afakeconnectionstring", diff --git a/src/ServiceControlInstaller.Engine/Instances/MonitoringInstance.cs b/src/ServiceControlInstaller.Engine/Instances/MonitoringInstance.cs index c005a46e68..5ca22ce1cd 100644 --- a/src/ServiceControlInstaller.Engine/Instances/MonitoringInstance.cs +++ b/src/ServiceControlInstaller.Engine/Instances/MonitoringInstance.cs @@ -97,14 +97,9 @@ string ReadConnectionString() TransportInfo DetermineTransportPackage() { - var transportAppSetting = AppConfig.Read(SettingsList.TransportType, ServiceControlCoreTransports.All.Single(t => t.Default).TypeName).Trim(); - var transport = ServiceControlCoreTransports.All.FirstOrDefault(p => p.Matches(transportAppSetting)); - if (transport != null) - { - return transport; - } - - return ServiceControlCoreTransports.All.First(p => p.Default); + var transportAppSetting = AppConfig.Read(SettingsList.TransportType, null)?.Trim(); + var transport = ServiceControlCoreTransports.Find(transportAppSetting); + return transport; } public async Task ValidateChanges() diff --git a/src/ServiceControlInstaller.Engine/Instances/PersistenceManifest.cs b/src/ServiceControlInstaller.Engine/Instances/PersistenceManifest.cs index b11806848b..b08ee61bf4 100644 --- a/src/ServiceControlInstaller.Engine/Instances/PersistenceManifest.cs +++ b/src/ServiceControlInstaller.Engine/Instances/PersistenceManifest.cs @@ -1,5 +1,6 @@ namespace ServiceControlInstaller.Engine.Instances { + using System; using System.Collections.Generic; public class PersistenceManifest @@ -24,5 +25,8 @@ public class Setting public string DefaultValue { get; set; } public bool Mandatory { get; set; } } + + public bool Matches(string name) => Name.Equals(name, StringComparison.OrdinalIgnoreCase) + || TypeName.Equals(name, StringComparison.Ordinal); } } \ No newline at end of file diff --git a/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditInstance.cs b/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditInstance.cs index ab81a735f3..2dadb6239d 100644 --- a/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditInstance.cs +++ b/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditInstance.cs @@ -60,7 +60,7 @@ protected override AppConfig CreateAppConfig() protected override string GetTransportTypeSetting() { - return AppConfig.Read(AuditInstanceSettingsList.TransportType, ServiceControlCoreTransports.All.Single(t => t.Default).TypeName).Trim(); + return AppConfig.Read(AuditInstanceSettingsList.TransportType, null)?.Trim(); } protected override string BaseServiceName => "ServiceControl.Audit"; @@ -82,18 +82,8 @@ public override void Reload() var zipInfo = ServiceControlAuditZipInfo.Find(deploymentCachePath); - var manifests = ServiceControlAuditPersisters.LoadAllManifests(zipInfo.FilePath); - var persistenceType = AppConfig.Read(AuditInstanceSettingsList.PersistenceType, null); - - if (string.IsNullOrEmpty(persistenceType)) - { - PersistenceManifest = manifests.Single(m => m.Name == "RavenDB35"); - } - else - { - PersistenceManifest = manifests.Single(m => m.TypeName == persistenceType); - } + PersistenceManifest = ServiceControlAuditPersisters.GetPersistence(zipInfo.FilePath, persistenceType); TransportPackage = DetermineTransportPackage(); ConnectionString = ReadConnectionString(); diff --git a/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditNewInstance.cs b/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditNewInstance.cs index 900512dbb0..75748dabc4 100644 --- a/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditNewInstance.cs +++ b/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditNewInstance.cs @@ -2,7 +2,6 @@ { using System; using System.IO; - using System.Linq; using System.Reflection; using System.Xml; using System.Xml.Serialization; @@ -27,8 +26,7 @@ public static ServiceControlAuditNewInstance CreateWithDefaultPersistence(string public static ServiceControlAuditNewInstance CreateWithPersistence(string deploymentCachePath, string persistence) { var zipInfo = ServiceControlAuditZipInfo.Find(deploymentCachePath); - var persistenceManifest = ServiceControlAuditPersisters.LoadAllManifests(zipInfo.FilePath) - .Single(manifest => manifest.Name == persistence); + var persistenceManifest = ServiceControlAuditPersisters.GetPersistence(zipInfo.FilePath, persistence); return new ServiceControlAuditNewInstance(zipInfo.Version, persistenceManifest); } diff --git a/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditPersisters.cs b/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditPersisters.cs index 2fc576cca0..32d8b141b8 100644 --- a/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditPersisters.cs +++ b/src/ServiceControlInstaller.Engine/Instances/ServiceControlAuditPersisters.cs @@ -6,9 +6,9 @@ using System.Linq; using Newtonsoft.Json; - public class ServiceControlAuditPersisters + public static class ServiceControlAuditPersisters { - public static IReadOnlyList LoadAllManifests(string zipFilePath) + internal static IReadOnlyList LoadAllManifests(string zipFilePath) { using (var zipArchive = ZipFile.OpenRead(zipFilePath)) { @@ -31,5 +31,22 @@ public static IReadOnlyList LoadAllManifests(string zipFile return manifests; } } + + public static PersistenceManifest GetPersistence(string zipFilePath, string name) + { + var manifests = LoadAllManifests(zipFilePath); + + if (string.IsNullOrEmpty(name)) + { + // Must always remain RavenDB35 so that SCMU understands that an instance with no configured value is an old Raven 3.5 instance + return manifests.Single(m => m.Name == "RavenDB35"); + } + + return manifests.FirstOrDefault(m => m.Matches(name)) ?? new PersistenceManifest + { + Name = $"Unknown Persistence: {name}", + Description = $"Unknown Persistence {name} may be from a future version of ServiceControl" + }; + } } } diff --git a/src/ServiceControlInstaller.Engine/Instances/ServiceControlBaseService.cs b/src/ServiceControlInstaller.Engine/Instances/ServiceControlBaseService.cs index 972e20a446..5ff2e53c1b 100644 --- a/src/ServiceControlInstaller.Engine/Instances/ServiceControlBaseService.cs +++ b/src/ServiceControlInstaller.Engine/Instances/ServiceControlBaseService.cs @@ -145,13 +145,8 @@ protected string ReadConnectionString() protected TransportInfo DetermineTransportPackage() { var transportAppSetting = GetTransportTypeSetting(); - var transport = ServiceControlCoreTransports.All.FirstOrDefault(p => p.Matches(transportAppSetting)); - if (transport != null) - { - return transport; - } - - return ServiceControlCoreTransports.All.First(p => p.Default); + var transport = ServiceControlCoreTransports.Find(transportAppSetting); + return transport; } protected void RecreateUrlAcl(ServiceControlBaseService oldSettings) diff --git a/src/ServiceControlInstaller.Engine/Instances/ServiceControlCoreTransports.cs b/src/ServiceControlInstaller.Engine/Instances/ServiceControlCoreTransports.cs index 160b4de6ca..2cbcd5d24a 100644 --- a/src/ServiceControlInstaller.Engine/Instances/ServiceControlCoreTransports.cs +++ b/src/ServiceControlInstaller.Engine/Instances/ServiceControlCoreTransports.cs @@ -6,7 +6,7 @@ public class ServiceControlCoreTransports { - public static List All => new List + static readonly TransportInfo[] all = new TransportInfo[] { //INFO: Those types are used in the SCMU and in PS scripts. In both cases Match predicate is used to find a transport info. // In the UI the matching is done based on the transport TypeName from app.config. In PS it's done based on human friendly names. @@ -195,6 +195,9 @@ public class ServiceControlCoreTransports }, }; + public static TransportInfo[] GetSupportedTransports() => all.Where(t => t.AvailableInSCMU).ToArray(); + public static IEnumerable Select(Func selector) => all.Select(selector); + static bool IncludeLearningTransport() { try @@ -220,7 +223,16 @@ static bool IncludeLearningTransport() public static TransportInfo Find(string name) { - return All.FirstOrDefault(p => p.Matches(name)); + if (string.IsNullOrEmpty(name)) + { + return all.FirstOrDefault(t => t.Default); // MSMQ + } + + return all.FirstOrDefault(p => p.Matches(name)) ?? new TransportInfo + { + Name = $"Unknown Message Transport: {name}", + AvailableInSCMU = false + }; } public static TransportInfo UpgradedTransportSeam(TransportInfo transport) diff --git a/src/ServiceControlInstaller.Engine/Instances/ServiceControlInstance.cs b/src/ServiceControlInstaller.Engine/Instances/ServiceControlInstance.cs index 233dd84ac6..3f4d015c9f 100644 --- a/src/ServiceControlInstaller.Engine/Instances/ServiceControlInstance.cs +++ b/src/ServiceControlInstaller.Engine/Instances/ServiceControlInstance.cs @@ -39,7 +39,7 @@ public void AddRemoteInstance(string apiUri) protected override string GetTransportTypeSetting() { - return AppConfig.Read(ServiceControlSettings.TransportType, ServiceControlCoreTransports.All.Single(t => t.Default).TypeName).Trim(); + return AppConfig.Read(ServiceControlSettings.TransportType, null)?.Trim(); } protected override AppConfig CreateAppConfig()