public async Task GetHostJsonExtensionsAsyncTest(string hostJsonContents, bool isNull, bool skipWriteFile, string value) { string scriptPath = string.Empty; try { var logger = new Mock <ILogger>(); var monitor = new Mock <IOptionsMonitor <ScriptApplicationHostOptions> >(); var options = new ScriptApplicationHostOptions(); scriptPath = GetTempDirectory(); var hostJsonPath = Path.Combine(scriptPath, "host.json"); if (!skipWriteFile) { await FileUtility.WriteAsync(hostJsonPath, hostJsonContents); } options.ScriptPath = scriptPath; monitor.Setup(x => x.CurrentValue).Returns(options); var json = await FunctionsSyncManager.GetHostJsonExtensionsAsync(monitor.Object, logger.Object); if (isNull) { Assert.Null(json); } else { Assert.Equal(value, json["queues"]?["maxPollingInterval"]); } } finally { await FileUtility.DeleteDirectoryAsync(scriptPath, true); } }
public void IsSyncTriggersEnvironment_LocalEnvironment_ReturnsExpectedResult(bool coreToolsEnvironment, bool expected) { _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.CoreToolsEnvironment)).Returns(coreToolsEnvironment ? "1" : null); var result = FunctionsSyncManager.IsSyncTriggersEnvironment(_mockWebHostEnvironment.Object, _mockEnvironment.Object); Assert.Equal(expected, result); }
public void IsSyncTriggersEnvironment_StandbyMode_ReturnsExpectedResult(bool standbyMode, bool containerReady, bool expected) { _mockWebHostEnvironment.SetupGet(p => p.InStandbyMode).Returns(standbyMode); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns(containerReady ? "1" : null); var result = FunctionsSyncManager.IsSyncTriggersEnvironment(_mockWebHostEnvironment.Object, _mockEnvironment.Object); Assert.Equal(expected, result); }
public WebFunctionsManagerTests() { _testRootScriptPath = Path.GetTempPath(); _testHostConfigFilePath = Path.Combine(_testRootScriptPath, ScriptConstants.HostMetadataFileName); FileUtility.DeleteFileSafe(_testHostConfigFilePath); _hostOptions = new ScriptApplicationHostOptions { ScriptPath = @"x:\root", IsSelfHost = false, LogPath = @"x:\tmp\log", SecretsPath = @"x:\secrets", TestDataPath = @"x:\test" }; string functionsPath = Path.Combine(Environment.CurrentDirectory, @"..\..\..\..\..\sample"); var fileSystem = CreateFileSystem(_hostOptions); var loggerFactory = MockNullLoggerFactory.CreateLoggerFactory(); var contentBuilder = new StringBuilder(); var httpClient = CreateHttpClient(contentBuilder); var factory = new TestOptionsFactory <ScriptApplicationHostOptions>(_hostOptions); var tokenSource = new TestChangeTokenSource <ScriptApplicationHostOptions>(); var changeTokens = new[] { tokenSource }; var optionsMonitor = new OptionsMonitor <ScriptApplicationHostOptions>(factory, changeTokens, factory); var secretManagerProviderMock = new Mock <ISecretManagerProvider>(MockBehavior.Strict); var secretManagerMock = new Mock <ISecretManager>(MockBehavior.Strict); secretManagerProviderMock.SetupGet(p => p.Current).Returns(secretManagerMock.Object); var hostSecretsInfo = new HostSecretsInfo(); secretManagerMock.Setup(p => p.GetHostSecretsAsync()).ReturnsAsync(hostSecretsInfo); Dictionary <string, string> functionSecrets = new Dictionary <string, string>(); secretManagerMock.Setup(p => p.GetFunctionSecretsAsync("httptrigger", false)).ReturnsAsync(functionSecrets); var configurationMock = new Mock <IConfiguration>(MockBehavior.Strict); var hostIdProviderMock = new Mock <IHostIdProvider>(MockBehavior.Strict); var mockWebHostEnvironment = new Mock <IScriptWebHostEnvironment>(MockBehavior.Strict); mockWebHostEnvironment.SetupGet(p => p.InStandbyMode).Returns(false); _mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.CoreToolsEnvironment)).Returns((string)null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHostName)).Returns(TestHostName); var hostNameProvider = new HostNameProvider(_mockEnvironment.Object, loggerFactory.CreateLogger <HostNameProvider>()); var workerOptions = new LanguageWorkerOptions(); FileUtility.Instance = fileSystem; _fileSystem = fileSystem; var languageWorkerOptions = new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings()); var metadataProvider = new FunctionMetadataProvider(optionsMonitor, languageWorkerOptions, NullLogger <FunctionMetadataProvider> .Instance, new TestMetricsLogger()); var functionsSyncManager = new FunctionsSyncManager(configurationMock.Object, hostIdProviderMock.Object, optionsMonitor, loggerFactory.CreateLogger <FunctionsSyncManager>(), httpClient, secretManagerProviderMock.Object, mockWebHostEnvironment.Object, _mockEnvironment.Object, hostNameProvider, metadataProvider); _webFunctionsManager = new WebFunctionsManager(optionsMonitor, new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings()), loggerFactory, httpClient, secretManagerProviderMock.Object, functionsSyncManager, hostNameProvider, metadataProvider); }
public FunctionsSyncManagerTests() { _testRootScriptPath = Path.GetTempPath(); _testHostConfigFilePath = Path.Combine(_testRootScriptPath, ScriptConstants.HostMetadataFileName); FileUtility.DeleteFileSafe(_testHostConfigFilePath); _hostOptions = new ScriptApplicationHostOptions { ScriptPath = @"x:\root", IsSelfHost = false, LogPath = @"x:\tmp\log", SecretsPath = @"x:\secrets", TestDataPath = @"x:\test" }; _vars = new Dictionary <string, string> { { EnvironmentSettingNames.WebSiteAuthEncryptionKey, TestHelpers.GenerateKeyHexString() }, { EnvironmentSettingNames.AzureWebsiteHostName, "appName.azurewebsites.net" } }; ResetMockFileSystem(); _loggerProvider = new TestLoggerProvider(); var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(_loggerProvider); _contentBuilder = new StringBuilder(); _mockHttpHandler = new MockHttpHandler(_contentBuilder); var httpClient = CreateHttpClient(_mockHttpHandler); var factory = new TestOptionsFactory <ScriptApplicationHostOptions>(_hostOptions); var tokenSource = new TestChangeTokenSource(); var changeTokens = new[] { tokenSource }; var optionsMonitor = new OptionsMonitor <ScriptApplicationHostOptions>(factory, changeTokens, factory); var secretManagerProviderMock = new Mock <ISecretManagerProvider>(MockBehavior.Strict); var secretManagerMock = new Mock <ISecretManager>(MockBehavior.Strict); secretManagerProviderMock.SetupGet(p => p.Current).Returns(secretManagerMock.Object); var configuration = ScriptSettingsManager.BuildDefaultConfiguration(); var hostIdProviderMock = new Mock <IHostIdProvider>(MockBehavior.Strict); hostIdProviderMock.Setup(p => p.GetHostIdAsync(CancellationToken.None)).ReturnsAsync("testhostid123"); _mockWebHostEnvironment = new Mock <IScriptWebHostEnvironment>(MockBehavior.Strict); _mockWebHostEnvironment.SetupGet(p => p.InStandbyMode).Returns(false); _mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.CoreToolsEnvironment)).Returns((string)null); _functionsSyncManager = new FunctionsSyncManager(configuration, hostIdProviderMock.Object, optionsMonitor, new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings()), loggerFactory, httpClient, secretManagerProviderMock.Object, _mockWebHostEnvironment.Object, _mockEnvironment.Object); _expectedSyncTriggersPayload = "[{\"authLevel\":\"anonymous\",\"type\":\"httpTrigger\",\"direction\":\"in\",\"name\":\"req\",\"functionName\":\"function1\"}," + "{\"name\":\"myQueueItem\",\"type\":\"orchestrationTrigger\",\"direction\":\"in\",\"queueName\":\"myqueue-items\",\"connection\":\"DurableStorage\",\"functionName\":\"function2\",\"taskHubName\":\"TestHubValue\"}," + "{\"name\":\"myQueueItem\",\"type\":\"activityTrigger\",\"direction\":\"in\",\"queueName\":\"myqueue-items\",\"connection\":\"DurableStorage\",\"functionName\":\"function3\",\"taskHubName\":\"TestHubValue\"}]"; }
public void IsSyncTriggersEnvironment_LocalEnvironment_ReturnsExpectedResult(bool coreToolsEnvironment, bool expected) { _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.CoreToolsEnvironment)).Returns(coreToolsEnvironment ? "1" : null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteInstanceId)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.WebSiteAuthEncryptionKey)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.ContainerName)).Returns((string)null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns("1"); var result = FunctionsSyncManager.IsSyncTriggersEnvironment(_mockWebHostEnvironment.Object, _mockEnvironment.Object); Assert.Equal(expected, result); }
[InlineData(false, true, false, false, false, true)] // dedicated linux public void IsSyncTriggersEnvironment_StandbyMode_ReturnsExpectedResult(bool isAppService, bool hasEncryptionKey, bool isConsumptionLinux, bool standbyMode, bool containerReady, bool expected) { _mockWebHostEnvironment.SetupGet(p => p.InStandbyMode).Returns(standbyMode); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteInstanceId)).Returns(isAppService ? "1" : null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.WebSiteAuthEncryptionKey)).Returns(hasEncryptionKey ? "1" : null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.ContainerName)).Returns(isConsumptionLinux ? "1" : null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns(containerReady ? "1" : null); var result = FunctionsSyncManager.IsSyncTriggersEnvironment(_mockWebHostEnvironment.Object, _mockEnvironment.Object); Assert.Equal(expected, result); }
public void Use_Website_Name_If_Website_Hostname_Is_Not_Available(string envKey, string envValue, string expectedSyncTriggersUri) { var vars = new Dictionary <string, string> { { envKey, envValue }, }; using (var env = new TestScopedEnvironmentVariable(vars)) { var httpRequest = FunctionsSyncManager.BuildSetTriggersRequest(); Assert.Equal(expectedSyncTriggersUri, httpRequest.RequestUri.AbsoluteUri); Assert.Equal(HttpMethod.Post, httpRequest.Method); } }
public void Disables_Ssl_If_SkipSslValidation_Enabled(int skipSslValidation, string syncTriggersUri) { var vars = new Dictionary <string, string> { { EnvironmentSettingNames.SkipSslValidation, skipSslValidation.ToString() }, { EnvironmentSettingNames.AzureWebsiteHostName, "sitename" }, }; using (var env = new TestScopedEnvironmentVariable(vars)) { var httpRequest = FunctionsSyncManager.BuildSetTriggersRequest(); Assert.Equal(syncTriggersUri, httpRequest.RequestUri.AbsoluteUri); Assert.Equal(HttpMethod.Post, httpRequest.Method); } }
public void ReadFunctionsMetadataSucceeds() { string functionsPath = Path.Combine(Environment.CurrentDirectory, @"..\..\..\..\..\sample"); // Setup var fileSystem = CreateFileSystem(_hostOptions.ScriptPath); var loggerFactory = MockNullLoggerFactory.CreateLoggerFactory(); var contentBuilder = new StringBuilder(); var httpClient = CreateHttpClient(contentBuilder); var factory = new TestOptionsFactory <ScriptApplicationHostOptions>(_hostOptions); var tokenSource = new TestChangeTokenSource(); var changeTokens = new[] { tokenSource }; var optionsMonitor = new OptionsMonitor <ScriptApplicationHostOptions>(factory, changeTokens, factory); var secretManagerProviderMock = new Mock <ISecretManagerProvider>(MockBehavior.Strict); var secretManagerMock = new Mock <ISecretManager>(MockBehavior.Strict); secretManagerProviderMock.SetupGet(p => p.Current).Returns(secretManagerMock.Object); var hostSecretsInfo = new HostSecretsInfo(); secretManagerMock.Setup(p => p.GetHostSecretsAsync()).ReturnsAsync(hostSecretsInfo); Dictionary <string, string> functionSecrets = new Dictionary <string, string>(); secretManagerMock.Setup(p => p.GetFunctionSecretsAsync("httptrigger", false)).ReturnsAsync(functionSecrets); var configurationMock = new Mock <IConfiguration>(MockBehavior.Strict); var hostIdProviderMock = new Mock <IHostIdProvider>(MockBehavior.Strict); var mockWebHostEnvironment = new Mock <IScriptWebHostEnvironment>(MockBehavior.Strict); mockWebHostEnvironment.SetupGet(p => p.InStandbyMode).Returns(false); var mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict); mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns("1"); mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.CoreToolsEnvironment)).Returns((string)null); var functionsSyncManager = new FunctionsSyncManager(configurationMock.Object, hostIdProviderMock.Object, optionsMonitor, new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings()), loggerFactory, httpClient, secretManagerProviderMock.Object, mockWebHostEnvironment.Object, mockEnvironment.Object); var webManager = new WebFunctionsManager(optionsMonitor, new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings()), loggerFactory, httpClient, secretManagerProviderMock.Object, functionsSyncManager); FileUtility.Instance = fileSystem; IEnumerable <FunctionMetadata> metadata = webManager.GetFunctionsMetadata(); var jsFunctions = metadata.Where(funcMetadata => funcMetadata.Language == LanguageWorkerConstants.NodeLanguageWorkerName).ToList(); var unknownFunctions = metadata.Where(funcMetadata => string.IsNullOrEmpty(funcMetadata.Language)).ToList(); Assert.Equal(2, jsFunctions.Count()); Assert.Equal(1, unknownFunctions.Count()); }
public static IHostBuilder AddWebScriptHost(this IHostBuilder builder, IServiceProvider rootServiceProvider, IServiceScopeFactory rootScopeFactory, ScriptApplicationHostOptions webHostOptions, Action <IWebJobsBuilder> configureWebJobs = null) { ILoggerFactory configLoggerFactory = rootServiceProvider.GetService <ILoggerFactory>(); IDependencyValidator validator = rootServiceProvider.GetService <IDependencyValidator>(); IMetricsLogger metricsLogger = rootServiceProvider.GetService <IMetricsLogger>(); builder.UseServiceProviderFactory(new JobHostScopedServiceProviderFactory(rootServiceProvider, rootScopeFactory, validator)) .ConfigureServices(services => { // register default configuration // must happen before the script host is added below services.ConfigureOptions <HttpOptionsSetup>(); services.ConfigureOptions <CustomHttpHeadersOptionsSetup>(); services.ConfigureOptions <HostHstsOptionsSetup>(); services.ConfigureOptions <HostCorsOptionsSetup>(); services.ConfigureOptions <CorsOptionsSetup>(); services.ConfigureOptions <AppServiceOptionsSetup>(); services.ConfigureOptions <HostEasyAuthOptionsSetup>(); }) .AddScriptHost(webHostOptions, configLoggerFactory, metricsLogger, webJobsBuilder => { webJobsBuilder.AddAzureStorageCoreServices(); configureWebJobs?.Invoke(webJobsBuilder); ConfigureRegisteredBuilders(webJobsBuilder, rootServiceProvider); webJobsBuilder.Services.AddSingleton <IHttpRoutesManager, WebScriptHostHttpRoutesManager>(); }) .ConfigureAppConfiguration(configurationBuilder => { ConfigureRegisteredBuilders(configurationBuilder, rootServiceProvider); }) .ConfigureLogging(loggingBuilder => { loggingBuilder.Services.AddSingleton <ILoggerFactory, ScriptLoggerFactory>(); loggingBuilder.AddWebJobsSystem <SystemLoggerProvider>(); loggingBuilder.Services.AddSingleton <ILoggerProvider, AzureMonitorDiagnosticLoggerProvider>(); ConfigureRegisteredBuilders(loggingBuilder, rootServiceProvider); }) .ConfigureServices(services => { var webHostEnvironment = rootServiceProvider.GetService <IScriptWebHostEnvironment>(); var environment = rootServiceProvider.GetService <IEnvironment>(); if (FunctionsSyncManager.IsSyncTriggersEnvironment(webHostEnvironment, environment)) { services.AddSingleton <IHostedService, FunctionsSyncService>(); } if (!environment.IsV2CompatibilityMode()) { new FunctionsMvcBuilder(services).AddNewtonsoftJson(); } services.AddSingleton <HttpRequestQueue>(); services.AddSingleton <IHostLifetime, JobHostHostLifetime>(); services.AddSingleton <IWebJobsExceptionHandler, WebScriptHostExceptionHandler>(); services.AddSingleton <DefaultScriptWebHookProvider>(); services.TryAddSingleton <IScriptWebHookProvider>(p => p.GetService <DefaultScriptWebHookProvider>()); services.TryAddSingleton <IWebHookProvider>(p => p.GetService <DefaultScriptWebHookProvider>()); services.TryAddSingleton <IJobHostMiddlewarePipeline, DefaultMiddlewarePipeline>(); if (environment.IsLinuxConsumption()) { services.TryAddEnumerable(ServiceDescriptor.Singleton <IJobHostHttpMiddleware, JobHostEasyAuthMiddleware>()); } services.TryAddEnumerable(ServiceDescriptor.Singleton <IJobHostHttpMiddleware, CustomHttpHeadersMiddleware>()); services.TryAddEnumerable(ServiceDescriptor.Singleton <IJobHostHttpMiddleware, HstsConfigurationMiddleware>()); if (environment.IsLinuxConsumption()) { services.AddSingleton <ICorsMiddlewareFactory, CorsMiddlewareFactory>(); services.TryAddEnumerable(ServiceDescriptor.Singleton <IJobHostHttpMiddleware, JobHostCorsMiddleware>()); } services.TryAddSingleton <IScaleMetricsRepository, TableStorageScaleMetricsRepository>(); if (environment.IsWindowsAzureManagedHosting() || environment.IsLinuxAzureManagedHosting()) { // Enable breaking change analysis only when hosted in Azure services.AddSingleton <IChangeAnalysisStateProvider, BlobChangeAnalysisStateProvider>(); services.AddSingleton <IHostedService, ChangeAnalysisService>(); } // Make sure the registered IHostIdProvider is used IHostIdProvider provider = rootServiceProvider.GetService <IHostIdProvider>(); if (provider != null) { services.AddSingleton <IHostIdProvider>(provider); } services.AddSingleton <IDelegatingHandlerProvider, DefaultDelegatingHandlerProvider>(); // Logging and diagnostics services.AddSingleton <IMetricsLogger>(a => new NonDisposableMetricsLogger(metricsLogger)); services.AddSingleton <IEventCollectorProvider, FunctionInstanceLogCollectorProvider>(); // Hosted services services.TryAddEnumerable(ServiceDescriptor.Singleton <IHostedService, FileMonitoringService>()); ConfigureRegisteredBuilders(services, rootServiceProvider); }); var debugStateProvider = rootServiceProvider.GetService <IDebugStateProvider>(); if (debugStateProvider.InDebugMode) { builder.UseEnvironment(EnvironmentName.Development); } return(builder); }
public FunctionsSyncManagerTests() { _testRootScriptPath = Path.GetTempPath(); _testHostConfigFilePath = Path.Combine(_testRootScriptPath, ScriptConstants.HostMetadataFileName); FileUtility.DeleteFileSafe(_testHostConfigFilePath); _hostOptions = new ScriptApplicationHostOptions { ScriptPath = @"x:\root", IsSelfHost = false, LogPath = @"x:\tmp\log", SecretsPath = @"x:\secrets", TestDataPath = @"x:\sampledata" }; var jobHostOptions = new ScriptJobHostOptions { RootScriptPath = _hostOptions.ScriptPath, RootLogPath = _hostOptions.LogPath }; string testHostName = "appName.azurewebsites.net"; _vars = new Dictionary <string, string> { { EnvironmentSettingNames.WebSiteAuthEncryptionKey, TestHelpers.GenerateKeyHexString() }, { EnvironmentSettingNames.AzureWebsiteHostName, testHostName } }; ResetMockFileSystem(); _loggerProvider = new TestLoggerProvider(); var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(_loggerProvider); _contentBuilder = new StringBuilder(); _mockHttpHandler = new MockHttpHandler(_contentBuilder); var httpClient = CreateHttpClient(_mockHttpHandler); var factory = new TestOptionsFactory <ScriptApplicationHostOptions>(_hostOptions); var tokenSource = new TestChangeTokenSource <ScriptApplicationHostOptions>(); var changeTokens = new[] { tokenSource }; var optionsMonitor = new OptionsMonitor <ScriptApplicationHostOptions>(factory, changeTokens, factory); var secretManagerProviderMock = new Mock <ISecretManagerProvider>(MockBehavior.Strict); var secretManagerMock = new Mock <ISecretManager>(MockBehavior.Strict); secretManagerProviderMock.SetupGet(p => p.Current).Returns(secretManagerMock.Object); var hostSecretsInfo = new HostSecretsInfo(); hostSecretsInfo.MasterKey = "aaa"; hostSecretsInfo.FunctionKeys = new Dictionary <string, string> { { "TestHostFunctionKey1", "aaa" }, { "TestHostFunctionKey2", "bbb" } }; hostSecretsInfo.SystemKeys = new Dictionary <string, string> { { "TestSystemKey1", "aaa" }, { "TestSystemKey2", "bbb" } }; secretManagerMock.Setup(p => p.GetHostSecretsAsync()).ReturnsAsync(hostSecretsInfo); Dictionary <string, string> functionSecretsResponse = new Dictionary <string, string>() { { "TestFunctionKey1", "aaa" }, { "TestFunctionKey2", "bbb" } }; secretManagerMock.Setup(p => p.GetFunctionSecretsAsync("function1", false)).ReturnsAsync(functionSecretsResponse); var configuration = ScriptSettingsManager.BuildDefaultConfiguration(); var hostIdProviderMock = new Mock <IHostIdProvider>(MockBehavior.Strict); hostIdProviderMock.Setup(p => p.GetHostIdAsync(CancellationToken.None)).ReturnsAsync("testhostid123"); _mockWebHostEnvironment = new Mock <IScriptWebHostEnvironment>(MockBehavior.Strict); _mockWebHostEnvironment.SetupGet(p => p.InStandbyMode).Returns(false); _mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteArmCacheEnabled)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.CoreToolsEnvironment)).Returns((string)null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.WebSiteAuthEncryptionKey)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteInstanceId)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHostName)).Returns(testHostName); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.SkipSslValidation)).Returns((string)null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsSecretStorageType)).Returns("blob"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.KubernetesServiceHost)).Returns(""); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.PodNamespace)).Returns(""); _hostNameProvider = new HostNameProvider(_mockEnvironment.Object); var functionMetadataProvider = new FunctionMetadataProvider(optionsMonitor, NullLogger <FunctionMetadataProvider> .Instance, new TestMetricsLogger()); var functionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(jobHostOptions), functionMetadataProvider, null, new OptionsWrapper <HttpWorkerOptions>(new HttpWorkerOptions()), loggerFactory, new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings())); _functionsSyncManager = new FunctionsSyncManager(configuration, hostIdProviderMock.Object, optionsMonitor, loggerFactory.CreateLogger <FunctionsSyncManager>(), httpClient, secretManagerProviderMock.Object, _mockWebHostEnvironment.Object, _mockEnvironment.Object, _hostNameProvider, functionMetadataManager); }
public static IHostBuilder AddWebScriptHost(this IHostBuilder builder, IServiceProvider rootServiceProvider, IServiceScopeFactory rootScopeFactory, ScriptApplicationHostOptions webHostOptions, Action <IWebJobsBuilder> configureWebJobs = null) { ILoggerFactory configLoggerFactory = rootServiceProvider.GetService <ILoggerFactory>(); IDependencyValidator validator = rootServiceProvider.GetService <IDependencyValidator>(); IMetricsLogger metricsLogger = rootServiceProvider.GetService <IMetricsLogger>(); IEnvironment environment = rootServiceProvider.GetService <IEnvironment>(); builder.UseServiceProviderFactory(new JobHostScopedServiceProviderFactory(rootServiceProvider, rootScopeFactory, validator)) .ConfigureServices(services => { // register default configuration // must happen before the script host is added below services.ConfigureOptions <HttpOptionsSetup>(); services.ConfigureOptions <CustomHttpHeadersOptionsSetup>(); services.ConfigureOptions <HostHstsOptionsSetup>(); services.ConfigureOptions <HostCorsOptionsSetup>(); services.ConfigureOptions <CorsOptionsSetup>(); services.ConfigureOptions <AppServiceOptionsSetup>(); services.ConfigureOptions <HostEasyAuthOptionsSetup>(); services.ConfigureOptions <PrimaryHostCoordinatorOptionsSetup>(); }) .AddScriptHost(webHostOptions, configLoggerFactory, metricsLogger, webJobsBuilder => { // Adds necessary Azure-based services to the ScriptHost, which will use the host-provided IAzureBlobStorageProvider registered below. webJobsBuilder.AddAzureStorageCoreServices(); // This overrides the IAzureBlobStorageProvider registered by the above call to AddAzureStorageCoreServices(). // This forwards the Host provided implementation to the inner ScriptHost and MUST be called AFTER the AddAzureStorageCoreServices() call to avoid layering mishaps later. // The Host provided IAzureBlobStorageProvider is designed to react to specialization and limited ScriptHost lifetimes, so it can be safely forwarded to the ScriptHost. webJobsBuilder.Services.AddSingleton <IAzureBlobStorageProvider>(rootServiceProvider.GetService <IAzureBlobStorageProvider>()); configureWebJobs?.Invoke(webJobsBuilder); webJobsBuilder.Services.TryAddSingleton <HttpClient>(f => { var loggerFactory = f.GetService <ILoggerFactory>(); loggerFactory.CreateLogger(LogCategories.Startup).LogWarning("Using HttpClient as an injected dependency will not be supported in future versions of Azure Functions. Use IHttpClientFactory instead. See http://aka.ms/functions-httpclient-di for more information."); return(rootServiceProvider.GetService <HttpClient>()); }); ConfigureRegisteredBuilders(webJobsBuilder, rootServiceProvider); webJobsBuilder.Services.AddSingleton <IHttpRoutesManager, WebScriptHostHttpRoutesManager>(); }) .ConfigureAppConfiguration(configurationBuilder => { ConfigureRegisteredBuilders(configurationBuilder, rootServiceProvider); }) .ConfigureLogging(loggingBuilder => { loggingBuilder.Services.AddSingleton <ILoggerFactory, ScriptLoggerFactory>(); loggingBuilder.AddWebJobsSystem <SystemLoggerProvider>(); if (environment.IsAzureMonitorEnabled()) { loggingBuilder.Services.AddSingleton <ILoggerProvider, AzureMonitorDiagnosticLoggerProvider>(); } if (!FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagDisableDiagnosticEventLogging)) { loggingBuilder.Services.AddSingleton <ILoggerProvider, DiagnosticEventLoggerProvider>(); loggingBuilder.Services.TryAddSingleton <IDiagnosticEventRepository, DiagnosticEventTableStorageRepository>(); loggingBuilder.Services.TryAddSingleton <IDiagnosticEventRepositoryFactory, DiagnosticEventRepositoryFactory>(); } ConfigureRegisteredBuilders(loggingBuilder, rootServiceProvider); }) .ConfigureServices(services => { var webHostEnvironment = rootServiceProvider.GetService <IScriptWebHostEnvironment>(); if (FunctionsSyncManager.IsSyncTriggersEnvironment(webHostEnvironment, environment)) { services.AddSingleton <IHostedService, FunctionsSyncService>(); } if (!environment.IsV2CompatibilityMode()) { new FunctionsMvcBuilder(services).AddNewtonsoftJson(); } services.AddSingleton <HttpRequestQueue>(); services.AddSingleton <IHostLifetime, JobHostHostLifetime>(); services.AddSingleton <IWebJobsExceptionHandler, WebScriptHostExceptionHandler>(); services.AddSingleton <DefaultScriptWebHookProvider>(); services.TryAddSingleton <IScriptWebHookProvider>(p => p.GetService <DefaultScriptWebHookProvider>()); services.TryAddSingleton <IWebHookProvider>(p => p.GetService <DefaultScriptWebHookProvider>()); services.TryAddSingleton <IJobHostMiddlewarePipeline, DefaultMiddlewarePipeline>(); services.TryAddEnumerable(ServiceDescriptor.Singleton <IJobHostHttpMiddleware, CustomHttpHeadersMiddleware>()); services.TryAddEnumerable(ServiceDescriptor.Singleton <IJobHostHttpMiddleware, HstsConfigurationMiddleware>()); if (environment.IsLinuxConsumption()) { services.AddSingleton <ICorsMiddlewareFactory, CorsMiddlewareFactory>(); services.TryAddEnumerable(ServiceDescriptor.Singleton <IJobHostHttpMiddleware, JobHostCorsMiddleware>()); // EasyAuth must go after CORS, as CORS preflight requests can happen before authentication services.TryAddEnumerable(ServiceDescriptor.Singleton <IJobHostHttpMiddleware, JobHostEasyAuthMiddleware>()); } services.TryAddSingleton <IScaleMetricsRepository, TableStorageScaleMetricsRepository>(); services.TryAddEnumerable(ServiceDescriptor.Singleton <IConcurrencyThrottleProvider, WorkerChannelThrottleProvider>()); // Make sure the registered IHostIdProvider is used IHostIdProvider provider = rootServiceProvider.GetService <IHostIdProvider>(); if (provider != null) { services.AddSingleton <IHostIdProvider>(provider); } services.AddSingleton <IDelegatingHandlerProvider, DefaultDelegatingHandlerProvider>(); // Logging and diagnostics services.AddSingleton <IMetricsLogger>(a => new NonDisposableMetricsLogger(metricsLogger)); services.AddSingleton <IEventCollectorProvider, FunctionInstanceLogCollectorProvider>(); // Hosted services services.AddSingleton <IFileMonitoringService, FileMonitoringService>(); services.TryAddEnumerable(ServiceDescriptor.Singleton <IHostedService, IFileMonitoringService>(p => p.GetService <IFileMonitoringService>())); ConfigureRegisteredBuilders(services, rootServiceProvider); }); return(builder); }
public static IHostBuilder AddWebScriptHost(this IHostBuilder builder, IServiceProvider rootServiceProvider, IServiceScopeFactory rootScopeFactory, ScriptApplicationHostOptions webHostOptions, Action <IWebJobsBuilder> configureWebJobs = null) { ILoggerFactory configLoggerFactory = rootServiceProvider.GetService <ILoggerFactory>(); IDependencyValidator validator = rootServiceProvider.GetService <IDependencyValidator>(); builder.UseServiceProviderFactory(new JobHostScopedServiceProviderFactory(rootServiceProvider, rootScopeFactory, validator)) .ConfigureServices(services => { // register default configuration // must happen before the script host is added below services.ConfigureOptions <HttpOptionsSetup>(); services.ConfigureOptions <HostHstsOptionsSetup>(); }) .AddScriptHost(webHostOptions, configLoggerFactory, webJobsBuilder => { webJobsBuilder .AddAzureStorageCoreServices(); configureWebJobs?.Invoke(webJobsBuilder); ConfigureRegisteredBuilders(webJobsBuilder, rootServiceProvider); }) .ConfigureAppConfiguration(configurationBuilder => { ConfigureRegisteredBuilders(configurationBuilder, rootServiceProvider); }) .ConfigureLogging(loggingBuilder => { loggingBuilder.Services.AddSingleton <ILoggerFactory, ScriptLoggerFactory>(); loggingBuilder.AddWebJobsSystem <SystemLoggerProvider>(); loggingBuilder.Services.AddSingleton <ILoggerProvider, UserLogMetricsLoggerProvider>(); loggingBuilder.Services.AddSingleton <ILoggerProvider, AzureMonitorDiagnosticLoggerProvider>(); ConfigureRegisteredBuilders(loggingBuilder, rootServiceProvider); }) .ConfigureServices(services => { var webHostEnvironment = rootServiceProvider.GetService <IScriptWebHostEnvironment>(); var environment = rootServiceProvider.GetService <IEnvironment>(); if (FunctionsSyncManager.IsSyncTriggersEnvironment(webHostEnvironment, environment)) { services.AddSingleton <IHostedService, FunctionsSyncService>(); } services.AddSingleton <HttpRequestQueue>(); services.AddSingleton <IHostLifetime, JobHostHostLifetime>(); services.TryAddSingleton <IWebJobsExceptionHandler, WebScriptHostExceptionHandler>(); services.AddSingleton <IScriptJobHostEnvironment, WebScriptJobHostEnvironment>(); services.AddSingleton <DefaultScriptWebHookProvider>(); services.TryAddSingleton <IScriptWebHookProvider>(p => p.GetService <DefaultScriptWebHookProvider>()); services.TryAddSingleton <IWebHookProvider>(p => p.GetService <DefaultScriptWebHookProvider>()); services.TryAddSingleton <IJobHostMiddlewarePipeline, DefaultMiddlewarePipeline>(); services.TryAddSingleton <IJobHostHttpMiddleware, HstsConfigurationMiddleware>(); // Make sure the registered IHostIdProvider is used IHostIdProvider provider = rootServiceProvider.GetService <IHostIdProvider>(); if (provider != null) { services.AddSingleton <IHostIdProvider>(provider); } // Logging and diagnostics services.AddSingleton <IMetricsLogger, WebHostMetricsLogger>(); services.AddSingleton <IEventCollectorProvider, FunctionInstanceLogCollectorProvider>(); // Hosted services services.TryAddEnumerable(ServiceDescriptor.Singleton <IHostedService, HttpInitializationService>()); services.TryAddEnumerable(ServiceDescriptor.Singleton <IHostedService, FileMonitoringService>()); }); var debugStateProvider = rootServiceProvider.GetService <IDebugStateProvider>(); if (debugStateProvider.InDebugMode) { builder.UseEnvironment(EnvironmentName.Development); } return(builder); }
public static IHostBuilder AddWebScriptHost(this IHostBuilder builder, IServiceProvider rootServiceProvider, IServiceScopeFactory rootScopeFactory, ScriptApplicationHostOptions webHostOptions, Action <IWebJobsBuilder> configureWebJobs = null) { ILoggerFactory configLoggerFactory = rootServiceProvider.GetService <ILoggerFactory>(); builder.UseServiceProviderFactory(new JobHostScopedServiceProviderFactory(rootServiceProvider, rootScopeFactory)) .ConfigureServices(services => { // register default configuration // must happen before the script host is added below services.ConfigureOptions <HttpOptionsSetup>(); }) .AddScriptHost(webHostOptions, configLoggerFactory, webJobsBuilder => { webJobsBuilder .AddAzureStorageCoreServices(); configureWebJobs?.Invoke(webJobsBuilder); ConfigureRegisteredBuilders(webJobsBuilder, rootServiceProvider); }) .ConfigureAppConfiguration(configurationBuilder => { ConfigureRegisteredBuilders(configurationBuilder, rootServiceProvider); }) .ConfigureLogging(loggingBuilder => { loggingBuilder.Services.AddSingleton <ILoggerFactory, ScriptLoggerFactory>(); loggingBuilder.AddWebJobsSystem <SystemLoggerProvider>(); loggingBuilder.Services.AddSingleton <ILoggerProvider, UserLogMetricsLoggerProvider>(); loggingBuilder.Services.AddSingleton <ILoggerProvider>(services => { IEnvironment environment = services.GetService <IEnvironment>(); IScriptWebHostEnvironment hostEnvironment = services.GetService <IScriptWebHostEnvironment>(); // Temporarily hide Azure Monitor support behind an app setting. string monitorSetting = environment.GetEnvironmentVariable("AZURE_MONITOR_ENABLED"); bool.TryParse(monitorSetting, out bool monitorenabled); if (monitorenabled && !hostEnvironment.InStandbyMode && !string.IsNullOrEmpty(environment.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHostName))) { IEventGenerator eventGenerator = services.GetService <IEventGenerator>(); IOptions <ScriptJobHostOptions> options = services.GetService <IOptions <ScriptJobHostOptions> >(); return(new AzureMonitorDiagnosticLoggerProvider(options, eventGenerator, environment)); } return(NullLoggerProvider.Instance); }); ConfigureRegisteredBuilders(loggingBuilder, rootServiceProvider); }) .ConfigureServices(services => { var webHostEnvironment = rootServiceProvider.GetService <IScriptWebHostEnvironment>(); var environment = rootServiceProvider.GetService <IEnvironment>(); if (FunctionsSyncManager.IsSyncTriggersEnvironment(webHostEnvironment, environment)) { services.AddSingleton <IHostedService, FunctionsSyncService>(); } services.AddSingleton <HttpRequestQueue>(); services.AddSingleton <IHostLifetime, JobHostHostLifetime>(); services.TryAddSingleton <IWebJobsExceptionHandler, WebScriptHostExceptionHandler>(); services.AddSingleton <IScriptJobHostEnvironment, WebScriptJobHostEnvironment>(); services.AddSingleton <DefaultScriptWebHookProvider>(); services.TryAddSingleton <IScriptWebHookProvider>(p => p.GetService <DefaultScriptWebHookProvider>()); services.TryAddSingleton <IWebHookProvider>(p => p.GetService <DefaultScriptWebHookProvider>()); // Make sure the registered IHostIdProvider is used IHostIdProvider provider = rootServiceProvider.GetService <IHostIdProvider>(); if (provider != null) { services.AddSingleton <IHostIdProvider>(provider); } // Logging and diagnostics services.AddSingleton <IMetricsLogger, WebHostMetricsLogger>(); services.AddSingleton <IEventCollectorProvider, FunctionInstanceLogCollectorProvider>(); // Hosted services services.TryAddEnumerable(ServiceDescriptor.Singleton <IHostedService, HttpInitializationService>()); services.TryAddEnumerable(ServiceDescriptor.Singleton <IHostedService, FileMonitoringService>()); }); var debugStateProvider = rootServiceProvider.GetService <IDebugStateProvider>(); if (debugStateProvider.InDebugMode) { builder.UseEnvironment(EnvironmentName.Development); } return(builder); }