src/WebJobs.Script/DependencyInjection/ExternalConfigurationStartupValidatorService.cs (53 lines of code) (raw):

// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace Microsoft.Azure.WebJobs.Script.DependencyInjection { internal class ExternalConfigurationStartupValidatorService : IHostedService { private readonly ExternalConfigurationStartupValidator _validator; private readonly IConfigurationRoot _originalConfig; private readonly IEnvironment _environment; private readonly ILogger<ExternalConfigurationStartupValidator> _logger; public ExternalConfigurationStartupValidatorService(ExternalConfigurationStartupValidator validator, IConfigurationRoot originalConfig, IEnvironment environment, ILogger<ExternalConfigurationStartupValidator> logger) { _validator = validator ?? throw new ArgumentNullException(nameof(validator)); _originalConfig = originalConfig ?? throw new ArgumentNullException(nameof(originalConfig)); _environment = environment ?? throw new ArgumentNullException(nameof(environment)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public Task StartAsync(CancellationToken cancellationToken) { IDictionary<string, IEnumerable<string>> invalidValues = _validator.Validate(_originalConfig); if (invalidValues.Any()) { StringBuilder sb = new StringBuilder(); sb.AppendLine("The Functions scale controller may not scale the following functions correctly because some configuration values were modified in an external startup class."); foreach (KeyValuePair<string, IEnumerable<string>> invalidValueMap in invalidValues) { sb.AppendLine($" Function '{invalidValueMap.Key}' uses the modified key(s): {string.Join(", ", invalidValueMap.Value)}"); } if (_environment.IsCoreTools()) { // We don't know where this will be deployed, so it may not matter, // but log this as a warning during development. _logger.LogWarning(sb.ToString()); } else { throw new HostInitializationException(sb.ToString()); } } return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } } }