public FunctionsController(IWebFunctionsManager functionsManager, WebScriptHostManager scriptHostManager, IWebJobsRouter webJobsRouter, ILoggerFactory loggerFactory) { _functionsManager = functionsManager; _scriptHostManager = scriptHostManager; _webJobsRouter = webJobsRouter; _logger = loggerFactory?.CreateLogger(ScriptConstants.LogCategoryFunctionsController); }
public WebScriptHostHttpRoutesManager(IOptions <HttpOptions> httpOptions, IWebJobsRouter router, ILoggerFactory loggerFactory, IEnvironment environment) { _httpOptions = httpOptions; _router = router; _loggerFactory = loggerFactory; _environment = environment; }
public WebScriptHostManagerTests(WebScriptHostManagerTests.Fixture fixture) { _fixture = fixture; _settingsManager = ScriptSettingsManager.Instance; string functionTestDir = Path.Combine(_fixture.TestFunctionRoot, Guid.NewGuid().ToString()); Directory.CreateDirectory(functionTestDir); string logDir = Path.Combine(_fixture.TestLogsRoot, Guid.NewGuid().ToString()); string secretsDir = Path.Combine(_fixture.TestSecretsRoot, Guid.NewGuid().ToString()); _config = new ScriptHostConfiguration { RootLogPath = logDir, RootScriptPath = functionTestDir, FileLoggingMode = FileLoggingMode.Always, }; var secretsRepository = new FileSystemSecretsRepository(_secretsDirectory.Path); SecretManager secretManager = new SecretManager(_settingsManager, secretsRepository, NullLogger.Instance); WebHostSettings webHostSettings = new WebHostSettings { SecretsPath = _secretsDirectory.Path }; var mockEventManager = new Mock <IScriptEventManager>(); _mockScriptHostFactory = new Mock <IScriptHostFactory>(); IWebJobsRouter router = fixture.CreateRouter(); _hostManager = new WebScriptHostManager(_config, new TestSecretManagerFactory(secretManager), mockEventManager.Object, _settingsManager, webHostSettings, router, NullLoggerFactory.Instance, secretsRepositoryFactory: new DefaultSecretsRepositoryFactory(), hostTimeoutSeconds: 2, hostPollingIntervalMilliseconds: 500, scriptHostFactory: _mockScriptHostFactory.Object); }
public WebScriptHostManager(ScriptHostConfiguration config, ISecretManagerFactory secretManagerFactory, IScriptEventManager eventManager, ScriptSettingsManager settingsManager, WebHostSettings webHostSettings, IWebJobsRouter router, ILoggerFactory loggerFactory, IScriptHostFactory scriptHostFactory = null, ISecretsRepositoryFactory secretsRepositoryFactory = null, HostPerformanceManager hostPerformanceManager = null, ILoggerProviderFactory loggerProviderFactory = null, int hostTimeoutSeconds = 30, int hostPollingIntervalMilliseconds = 500) : base(config, settingsManager, scriptHostFactory, eventManager, environment: null, hostPerformanceManager: hostPerformanceManager, loggerProviderFactory: loggerProviderFactory) { _config = config; _metricsLogger = new WebHostMetricsLogger(); _exceptionHandler = new WebScriptHostExceptionHandler(this); _webHostSettings = webHostSettings; _settingsManager = settingsManager; _hostTimeoutSeconds = hostTimeoutSeconds; _hostRunningPollIntervalMilliseconds = hostPollingIntervalMilliseconds; _router = router; config.IsSelfHost = webHostSettings.IsSelfHost; secretsRepositoryFactory = secretsRepositoryFactory ?? new DefaultSecretsRepositoryFactory(); var secretsRepository = secretsRepositoryFactory.Create(settingsManager, webHostSettings, config); _secretManager = secretManagerFactory.Create(settingsManager, loggerFactory.CreateLogger(ScriptConstants.LogCategoryHostGeneral), secretsRepository); _bindingWebHookProvider = new WebJobsSdkExtensionHookProvider(_secretManager); }
public FunctionsController(IWebFunctionsManager functionsManager, IWebJobsRouter webJobsRouter, ILoggerFactory loggerFactory, IOptions <ScriptApplicationHostOptions> applicationHostOptions) { _functionsManager = functionsManager; _webJobsRouter = webJobsRouter; _logger = loggerFactory?.CreateLogger(ScriptConstants.LogCategoryFunctionsController); _applicationHostOptions = applicationHostOptions; }
public HttpInitializationService(IOptions <HttpOptions> httpOptions, IWebJobsRouter router, ILoggerFactory loggerFactory, IScriptJobHost host, IEnvironment environment) { _httpOptions = httpOptions; _router = router; _loggerFactory = loggerFactory; _host = host; _environment = environment; }
public WebScriptHostManager(ScriptHostConfiguration config, ISecretManagerFactory secretManagerFactory, IScriptEventManager eventManager, ScriptSettingsManager settingsManager, WebHostSettings webHostSettings, IWebJobsRouter router, ILoggerFactory loggerFactory) : this(config, secretManagerFactory, eventManager, settingsManager, webHostSettings, router, loggerFactory, new ScriptHostFactory()) { }
public RoutePriorityExtensionConfigProvider(IApplicationLifetime applicationLifetime, IWebJobsRouter router) { _applicationLifetime = applicationLifetime; _router = router; _applicationLifetime.ApplicationStarted.Register(() => { ReorderRoutes(); }); }
public RoutePriorityExtensionConfigProvider(IApplicationLifetime applicationLifetime, IWebJobsRouter router, IOptionsMonitor <RoutePriorityOptions> optionsMonitor) { _applicationLifetime = applicationLifetime; _router = router; _options = optionsMonitor.CurrentValue; _applicationLifetime.ApplicationStarted.Register(() => { ReorderRoutes(); }); }
public WebHostResolver(ScriptSettingsManager settingsManager, ISecretManagerFactory secretManagerFactory, IScriptEventManager eventManager, WebHostSettings settings, IWebJobsRouter router, ILoggerFactoryBuilder loggerFactoryBuilder) { _settingsManager = settingsManager; _secretManagerFactory = secretManagerFactory; _eventManager = eventManager; _router = router; _loggerFactoryBuilder = loggerFactoryBuilder; _settings = settings; }
public WebScriptHostManager(ScriptHostConfiguration config, ISecretManagerFactory secretManagerFactory, IScriptEventManager eventManager, ScriptSettingsManager settingsManager, WebHostSettings webHostSettings, IWebJobsRouter router, IScriptHostFactory scriptHostFactory, ILoggerFactoryBuilder loggerFactoryBuilder) : this(config, secretManagerFactory, eventManager, settingsManager, webHostSettings, router, scriptHostFactory, new DefaultSecretsRepositoryFactory(), loggerFactoryBuilder) { }
public async Task EmptyHost_StartsSuccessfully() { await _fixture.InitializationTask; string functionTestDir = Path.Combine(_fixture.TestFunctionRoot, Guid.NewGuid().ToString()); Directory.CreateDirectory(functionTestDir); // important for the repro that these directories no not exist string logDir = Path.Combine(_fixture.TestLogsRoot, Guid.NewGuid().ToString()); string secretsDir = Path.Combine(_fixture.TestSecretsRoot, Guid.NewGuid().ToString()); JObject hostConfig = new JObject { { "id", "123456" } }; File.WriteAllText(Path.Combine(functionTestDir, ScriptConstants.HostMetadataFileName), hostConfig.ToString()); ScriptHostConfiguration config = new ScriptHostConfiguration { RootScriptPath = functionTestDir, RootLogPath = logDir, FileLoggingMode = FileLoggingMode.Always }; string connectionString = AmbientConnectionStringProvider.Instance.GetConnectionString(ConnectionStringNames.Storage); ISecretsRepository repository = new BlobStorageSecretsRepository(secretsDir, connectionString, "EmptyHost_StartsSuccessfully"); ISecretManager secretManager = new SecretManager(_settingsManager, repository, null); WebHostSettings webHostSettings = new WebHostSettings(); webHostSettings.SecretsPath = _secretsDirectory.Path; var mockEventManager = new Mock <IScriptEventManager>(); IWebJobsRouter router = _fixture.CreateRouter(); ScriptHostManager hostManager = new WebScriptHostManager(config, new TestSecretManagerFactory(secretManager), mockEventManager.Object, _settingsManager, webHostSettings, router, NullLoggerFactory.Instance); Task runTask = Task.Run(() => hostManager.RunAndBlock()); await TestHelpers.Await(() => hostManager.State == ScriptHostState.Running, timeout : 10000); hostManager.Stop(); Assert.Equal(ScriptHostState.Default, hostManager.State); // give some time for the logs to be flushed fullly await Task.Delay(FileWriter.LogFlushIntervalMs * 3); string hostLogFilePath = Directory.EnumerateFiles(Path.Combine(logDir, "Host")).Single(); string hostLogs = File.ReadAllText(hostLogFilePath); Assert.Contains("Generating 0 job function(s)", hostLogs); Assert.Contains("No job functions found.", hostLogs); Assert.Contains("Job host started", hostLogs); Assert.Contains("Job host stopped", hostLogs); }
private static RouteCollection GetRouteCollection(IWebJobsRouter router, string fieldName) { var routes = typeof(WebJobsRouter) .GetRuntimeFields() .FirstOrDefault(f => f.Name == fieldName); if (routes == null) { return(new RouteCollection()); } return((RouteCollection)routes.GetValue(router)); }
public WebHostResolver(ScriptSettingsManager settingsManager, ISecretManagerFactory secretManagerFactory, IScriptEventManager eventManager, WebHostSettings settings, IWebJobsRouter router, ILoggerProviderFactory loggerProviderFactory, ILoggerFactory loggerFactory) { _settingsManager = settingsManager; _secretManagerFactory = secretManagerFactory; _eventManager = eventManager; _router = router; _settings = settings; // _loggerProviderFactory is used for creating the LoggerFactory for each ScriptHost _loggerProviderFactory = loggerProviderFactory; // _loggerFactory is used when there is no host available. _loggerFactory = loggerFactory; }
public static List <Route> GetRoutes(this IWebJobsRouter router) { var type = typeof(WebJobsRouter); var fields = type.GetRuntimeFields(); var field = fields.FirstOrDefault(f => f.Name == "_functionRoutes"); if (field == null) { return(new List <Route>()); } var functionRoutes = field.GetValue(router); var routeCollection = (RouteCollection)functionRoutes; var routes = GetRoutes(routeCollection); return(routes); }
public WebScriptHostManager(ScriptHostConfiguration config, ISecretManagerFactory secretManagerFactory, IScriptEventManager eventManager, ScriptSettingsManager settingsManager, WebHostSettings webHostSettings, IWebJobsRouter router, IScriptHostFactory scriptHostFactory = null, ISecretsRepositoryFactory secretsRepositoryFactory = null, ILoggerFactoryBuilder loggerFactoryBuilder = null, HostPerformanceManager hostPerformanceManager = null, int hostTimeoutSeconds = 30, int hostPollingIntervalMilliseconds = 500) : base(config, settingsManager, scriptHostFactory, eventManager, environment: null, loggerFactoryBuilder: loggerFactoryBuilder, hostPerformanceManager: hostPerformanceManager) { _config = config; _metricsLogger = new WebHostMetricsLogger(); _exceptionHandler = new WebScriptHostExceptionHandler(this); _webHostSettings = webHostSettings; _hostTimeoutSeconds = hostTimeoutSeconds; _hostRunningPollIntervalMilliseconds = hostPollingIntervalMilliseconds; _router = router; var systemEventGenerator = config.HostConfig.GetService <IEventGenerator>() ?? new EventGenerator(); var systemTraceWriter = new SystemTraceWriter(systemEventGenerator, settingsManager, TraceLevel.Verbose); if (config.TraceWriter != null) { config.TraceWriter = new CompositeTraceWriter(new TraceWriter[] { config.TraceWriter, systemTraceWriter }); } else { config.TraceWriter = systemTraceWriter; } config.IsSelfHost = webHostSettings.IsSelfHost; secretsRepositoryFactory = secretsRepositoryFactory ?? new DefaultSecretsRepositoryFactory(); var secretsRepository = secretsRepositoryFactory.Create(settingsManager, webHostSettings, config); _secretManager = secretManagerFactory.Create(settingsManager, config.HostConfig.LoggerFactory, secretsRepository); _bindingWebHookProvider = new WebJobsSdkExtensionHookProvider(_secretManager); }
/// <summary> /// Calls into ScriptHost to retrieve list of FunctionMetadata /// and maps them to FunctionMetadataResponse. /// </summary> /// <param name="request">Current HttpRequest for figuring out baseUrl</param> /// <returns>collection of FunctionMetadataResponse</returns> public async Task <IEnumerable <FunctionMetadataResponse> > GetFunctionsMetadata(HttpRequest request, IWebJobsRouter router = null) { return(await GetFunctionsMetadata().Select(fm => fm.ToFunctionMetadataResponse(request, _config, router)).WhenAll()); }
/// <summary> /// maps a functionName to its FunctionMetadataResponse /// </summary> /// <param name="name">Function name to retrieve</param> /// <param name="request">Current HttpRequest</param> /// <returns>(success, FunctionMetadataResponse)</returns> public async Task <(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request, IWebJobsRouter router = null) { var functionMetadata = ScriptHost.ReadFunctionMetadata(Path.Combine(_config.RootScriptPath, name), new Dictionary <string, Collection <string> >(), fileSystem: FileUtility.Instance); if (functionMetadata != null) { return(true, await functionMetadata.ToFunctionMetadataResponse(request, _config, router)); } else { return(false, null); } }
private static Uri GetFunctionInvokeUrlTemplate(string baseUrl, string functionName, IWebJobsRouter router) { var template = router?.GetFunctionRouteTemplate(functionName); if (template != null) { return(new Uri($"{baseUrl}/{template}")); } return(null); }
/// <summary> /// Maps FunctionMetadata to FunctionMetadataResponse. /// </summary> /// <param name="functionMetadata">FunctionMetadata to be mapped.</param> /// <param name="request">Current HttpRequest</param> /// <param name="config">ScriptHostConfig</param> /// <returns>Promise of a FunctionMetadataResponse</returns> public static async Task <FunctionMetadataResponse> ToFunctionMetadataResponse(this FunctionMetadata functionMetadata, HttpRequest request, ScriptJobHostOptions config, IWebJobsRouter router = null) { var functionPath = Path.Combine(config.RootScriptPath, functionMetadata.Name); var functionMetadataFilePath = Path.Combine(functionPath, ScriptConstants.FunctionMetadataFileName); var baseUrl = request != null ? $"{request.Scheme}://{request.Host}" : "https://localhost/"; var response = new FunctionMetadataResponse { Name = functionMetadata.Name, // Q: can functionMetadata.ScriptFile be null or empty? ScriptHref = VirtualFileSystem.FilePathToVfsUri(Path.Combine(config.RootScriptPath, functionMetadata.ScriptFile), baseUrl, config), ConfigHref = VirtualFileSystem.FilePathToVfsUri(functionMetadataFilePath, baseUrl, config), ScriptRootPathHref = VirtualFileSystem.FilePathToVfsUri(functionPath, baseUrl, config, isDirectory: true), TestDataHref = VirtualFileSystem.FilePathToVfsUri(functionMetadata.GetTestDataFilePath(config), baseUrl, config), Href = GetFunctionHref(functionMetadata.Name, baseUrl), TestData = await GetTestData(functionMetadata.GetTestDataFilePath(config), config), Config = await GetFunctionConfig(functionMetadataFilePath), // Properties below this comment are not present in the kudu version. IsDirect = functionMetadata.IsDirect, IsDisabled = functionMetadata.IsDisabled, IsProxy = functionMetadata.IsProxy, Language = functionMetadata.Language, InvokeUrlTemplate = GetFunctionInvokeUrlTemplate(baseUrl, functionMetadata.Name, router) }; return(response); }
public static RouteCollection GetProxyRoutes(this IWebJobsRouter router) => GetRouteCollection(router, "_proxyRoutes");
/// <summary> /// maps a functionName to its FunctionMetadataResponse /// </summary> /// <param name="name">Function name to retrieve</param> /// <param name="request">Current HttpRequest</param> /// <returns>(success, FunctionMetadataResponse)</returns> public async Task <(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request, IWebJobsRouter router = null) { // TODO: DI (FACAVAL) Follow up with ahmels - Since loading of function metadata is no longer tied to the script host, we // should be able to inject an IFunctionMedatadaManager here and bypass this step. var functionMetadata = FunctionMetadataManager.ReadFunctionMetadata(Path.Combine(_config.RootScriptPath, name), null, _workerConfigs, new Dictionary <string, ICollection <string> >(), fileSystem: FileUtility.Instance); if (functionMetadata != null) { return(true, await functionMetadata.ToFunctionMetadataResponse(request, _config, router)); } else { return(false, null); } }
public static RouteCollection GetFunctionRoutes(this IWebJobsRouter router) => GetRouteCollection(router, "_functionRoutes");