diff --git a/build/ControlPanelVersion.props b/build/ControlPanelVersion.props index fbfe1438e0..ce868e2875 100644 --- a/build/ControlPanelVersion.props +++ b/build/ControlPanelVersion.props @@ -1,6 +1,6 @@ - 4.23.1 + 4.24.0 diff --git a/src/Tgstation.Server.Host/ServerFactory.cs b/src/Tgstation.Server.Host/ServerFactory.cs index 4ef38513a4..88e78eb0a7 100644 --- a/src/Tgstation.Server.Host/ServerFactory.cs +++ b/src/Tgstation.Server.Host/ServerFactory.cs @@ -24,6 +24,11 @@ namespace Tgstation.Server.Host /// sealed class ServerFactory : IServerFactory { + /// + /// Name of the appsettings file. + /// + public const string AppSettings = "appsettings"; + /// /// The for the . /// @@ -60,7 +65,6 @@ namespace Tgstation.Server.Host args[oldArgs.Length] = "--hostBuilder:reloadConfigOnChange=false"; } - const string AppSettings = "appsettings"; const string AppSettingsRelocationKey = $"--{AppSettings}-base-path="; var appsettingsRelativeBasePathArgument = args.FirstOrDefault(arg => arg.StartsWith(AppSettingsRelocationKey, StringComparison.Ordinal)); diff --git a/src/Tgstation.Server.Host/Setup/SetupWizard.cs b/src/Tgstation.Server.Host/Setup/SetupWizard.cs index 7ccb124ee2..463ae188e5 100644 --- a/src/Tgstation.Server.Host/Setup/SetupWizard.cs +++ b/src/Tgstation.Server.Host/Setup/SetupWizard.cs @@ -12,7 +12,6 @@ using System.Threading.Tasks; using Microsoft.Data.SqlClient; using Microsoft.Data.Sqlite; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -87,11 +86,6 @@ namespace Tgstation.Server.Host.Setup /// readonly InternalConfiguration internalConfiguration; - /// - /// A that will complete when the is reloaded. - /// - TaskCompletionSource reloadTcs; - /// /// Initializes a new instance of the class. /// @@ -103,7 +97,6 @@ namespace Tgstation.Server.Host.Setup /// The value of . /// The value of . /// The value of . - /// The in use. /// The containing the value of . /// The containing the value of . public SetupWizard( @@ -115,7 +108,6 @@ namespace Tgstation.Server.Host.Setup IPlatformIdentifier platformIdentifier, IAsyncDelayer asyncDelayer, IHostApplicationLifetime applicationLifetime, - IConfiguration configuration, IOptions generalConfigurationOptions, IOptions internalConfigurationOptions) { @@ -127,16 +119,9 @@ namespace Tgstation.Server.Host.Setup this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier)); this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer)); this.applicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime)); - ArgumentNullException.ThrowIfNull(configuration); generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions)); internalConfiguration = internalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(internalConfigurationOptions)); - - configuration - .GetReloadToken() - .RegisterChangeCallback( - state => reloadTcs?.TrySetResult(), - null); } /// @@ -578,6 +563,8 @@ namespace Tgstation.Server.Host.Setup csb.Password = password; } + csb.Encrypt = encrypt; + CreateTestConnection(csb.ConnectionString); csb.InitialCatalog = databaseName; databaseConfiguration.ConnectionString = csb.ConnectionString; @@ -1015,25 +1002,14 @@ namespace Tgstation.Server.Host.Setup var configBytes = Encoding.UTF8.GetBytes(serializedYaml); - reloadTcs = new TaskCompletionSource(); - try { await ioManager.WriteAllBytes( userConfigFileName, configBytes, cancellationToken); - - // Ensure the reload - if (generalConfiguration.SetupWizardMode != SetupWizardMode.Only) - using (cancellationToken.Register(() => reloadTcs.TrySetCanceled())) - await reloadTcs.Task; } - catch (OperationCanceledException) - { - throw; - } - catch (Exception e) + catch (Exception e) when (e is not OperationCanceledException) { await console.WriteAsync(e.Message, true, cancellationToken); await console.WriteAsync(null, true, cancellationToken); @@ -1109,7 +1085,7 @@ namespace Tgstation.Server.Host.Setup var userConfigFileName = ioManager.ConcatPath( internalConfiguration.AppSettingsBasePath, - String.Format(CultureInfo.InvariantCulture, "appsettings.{0}.yml", hostingEnvironment.EnvironmentName)); + $"{ServerFactory.AppSettings}.{hostingEnvironment.EnvironmentName}.yml"); async Task HandleSetupCancel() { diff --git a/tests/Tgstation.Server.Host.Tests/Setup/TestSetupWizard.cs b/tests/Tgstation.Server.Host.Tests/Setup/TestSetupWizard.cs index c60d7308c2..3b9da3b2b3 100644 --- a/tests/Tgstation.Server.Host.Tests/Setup/TestSetupWizard.cs +++ b/tests/Tgstation.Server.Host.Tests/Setup/TestSetupWizard.cs @@ -27,28 +27,25 @@ namespace Tgstation.Server.Host.Setup.Tests [TestMethod] public void TestConstructionThrows() { - Assert.ThrowsException(() => new SetupWizard(null, null, null, null, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(null, null, null, null, null, null, null, null, null, null)); var mockIOManager = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, null, null, null, null, null, null, null, null, null)); var mockConsole = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, null, null, null, null, null, null, null, null)); var mockHostingEnvironment = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, null, null, null, null, null, null, null)); var mockAssemblyInfoProvider = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, null, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, null, null, null, null, null, null)); var mockDBConnectionFactory = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, null, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, null, null, null, null, null)); var mockPlatformIdentifier = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, null, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, null, null, null, null)); var mockAsyncDelayer = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, null, null, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, null, null, null)); var mockLifetime = new Mock(); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, null, null, null)); - var mockConfiguration = new Mock(); - mockConfiguration.Setup(x => x.GetReloadToken()).Returns(Mock.Of()); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockConfiguration.Object, null, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, null, null)); var mockGeneralConfigurationOptions = Options.Create(new GeneralConfiguration()); - Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockConfiguration.Object, mockGeneralConfigurationOptions, null)); + Assert.ThrowsException(() => new SetupWizard(mockIOManager.Object, mockConsole.Object, mockHostingEnvironment.Object, mockAssemblyInfoProvider.Object, mockDBConnectionFactory.Object, mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, mockGeneralConfigurationOptions, null)); } [TestMethod] @@ -64,23 +61,6 @@ namespace Tgstation.Server.Host.Setup.Tests var mockInternalConfigurationOptions = new Mock>(); var mockPlatformIdentifier = new Mock(); var mockAsyncDelayer = new Mock(); - var mockConfiguration = new Mock(); - var mockChangeToken = new Mock(); - - object configReloadCallbackState = null; - Action configReloadCallback = null; - mockChangeToken - .Setup(x => x.RegisterChangeCallback(It.IsNotNull>(), null)) - .Callback, object>((callback, state) => - { - configReloadCallback = callback; - configReloadCallbackState = state; - }); - - mockConfiguration - .Setup(x => x.GetReloadToken()) - .Returns(mockChangeToken.Object) - .Verifiable(); var testGeneralConfig = new GeneralConfiguration { @@ -103,7 +83,6 @@ namespace Tgstation.Server.Host.Setup.Tests mockPlatformIdentifier.Object, mockAsyncDelayer.Object, mockLifetime.Object, - mockConfiguration.Object, mockGeneralConfigurationOptions.Object, mockInternalConfigurationOptions.Object); @@ -128,7 +107,6 @@ namespace Tgstation.Server.Host.Setup.Tests mockIOManager.Setup(x => x.ReadAllBytes(It.IsNotNull(), It.IsAny())).Returns(Task.FromResult(Encoding.UTF8.GetBytes("less profane"))).Verifiable(); mockIOManager .Setup(x => x.WriteAllBytes(It.IsNotNull(), It.IsNotNull(), It.IsAny())) - .Callback(() => configReloadCallback(configReloadCallbackState)) .Returns(Task.CompletedTask) .Verifiable(); @@ -369,8 +347,6 @@ namespace Tgstation.Server.Host.Setup.Tests mockAssemblyInfoProvider.VerifyAll(); mockPlatformIdentifier.VerifyAll(); mockAsyncDelayer.VerifyAll(); - mockConfiguration.VerifyAll(); - mockChangeToken.VerifyAll(); } } }