public void Configure(WebJobsBuilderContext context, IWebJobsConfigurationBuilder builder)
 {
     builder.ConfigurationBuilder.AddInMemoryCollection(new Dictionary <string, string>
     {
         { "languageWorkers:dotnet-isolated:workerDirectory", context.ApplicationRootPath }
     });
 }
        public void Configure(WebJobsBuilderContext context, IWebJobsBuilder builder)
        {
            string appRootPath = context.ApplicationRootPath;

            builder.Services.AddOptions <FunctionMetadataJsonReaderOptions>().Configure(o => o.FunctionMetadataFileDrectory = appRootPath);
            builder.Services.AddSingleton <FunctionMetadataJsonReader>();
            builder.Services.AddSingleton <IFunctionProvider, JsonFunctionProvider>();
        }
 private static void ValidateContext(WebJobsBuilderContext context)
 {
     if (context?.ApplicationRootPath == null ||
         context?.Configuration == null ||
         context?.EnvironmentName == null)
     {
         throw new InvalidOperationException($"The {nameof(WebJobsBuilderContext)} is not in the correct state.");
     }
 }
        public void Configure(WebJobsBuilderContext context, IWebJobsConfigurationBuilder builder)
        {
            string appRootPath = context.ApplicationRootPath;

            // We need to adjust the path to the worker exe based on the root, if WorkerRootToken is found.
            WorkerConfigDescription newWorkerDescription = GetUpdatedWorkerDescription(appRootPath);

            builder.ConfigurationBuilder.AddInMemoryCollection(new Dictionary <string, string>
            {
                { _dotnetIsolatedWorkerConfigPath, appRootPath },
        public void Configure(WebJobsBuilderContext context, IWebJobsConfigurationBuilder builder)
        {
            ValidateContext(context);

            builder.ConfigurationBuilder.AddInMemoryCollection(new Dictionary <string, string>
            {
                { "MyOptions:MyKey", "MyValue" },
                { "SomeOtherKey", "SomeOtherValue" },
                { "Cron", "0 0 0 1 1 0" }
            });
        }
        public void Configure(WebJobsBuilderContext context, IWebJobsBuilder builder)
        {
            ValidateContext(context);

            builder.Services.AddSingleton <IMyService, MyService>();
            builder.Services.AddOptions <MyOptions>()
            .Configure <IConfiguration>((options, config) =>
            {
                config.GetSection("MyOptions").Bind(options);
            });
        }
        public void Configure(WebJobsBuilderContext context, IWebJobsConfigurationBuilder builder)
        {
            var functionsConfigBuilder = new FunctionsConfigurationBuilder(builder.ConfigurationBuilder, context);

            ConfigureAppConfiguration(functionsConfigBuilder);
        }
        public void Configure(WebJobsBuilderContext context, IWebJobsBuilder builder)
        {
            var functionsBuilder = new FunctionsHostBuilder(builder.Services, context);

            Configure(functionsBuilder);
        }
 public FunctionsConfigurationBuilder(IConfigurationBuilder configurationBuilder, WebJobsBuilderContext webJobsBuilderContext)
 {
     ConfigurationBuilder = configurationBuilder ?? throw new ArgumentNullException(nameof(configurationBuilder));
     Context = new DefaultFunctionsHostBuilderContext(webJobsBuilderContext);
 }
Beispiel #10
0
        public static IHostBuilder AddScriptHostCore(this IHostBuilder builder, ScriptApplicationHostOptions applicationHostOptions, Action <IWebJobsBuilder> configureWebJobs = null, ILoggerFactory loggerFactory = null)
        {
            var skipHostInitialization = builder.Properties.ContainsKey(ScriptConstants.SkipHostInitializationKey);

            builder.ConfigureServices((context, services) =>
            {
                services.AddSingleton <ExternalConfigurationStartupValidator>();
                services.AddSingleton <IHostedService>(s =>
                {
                    if (!skipHostInitialization)
                    {
                        var environment = s.GetService <IEnvironment>();

                        // This key will not be here if we don't have any external configuration startups registered
                        if (context.Properties.TryGetValue(ConfigurationSnapshotKey, out object originalConfigObject) &&
                            originalConfigObject is IConfigurationRoot originalConfig)
                        {
                            context.Properties.Remove(ConfigurationSnapshotKey);

                            // Validate the config for anything that needs the Scale Controller.
                            // Including Core Tools as a warning during development time.
                            if (environment.IsWindowsConsumption() ||
                                environment.IsLinuxConsumption() ||
                                (environment.IsWindowsElasticPremium() && !environment.IsRuntimeScaleMonitoringEnabled()) ||
                                environment.IsCoreTools())
                            {
                                var validator = s.GetService <ExternalConfigurationStartupValidator>();
                                var logger    = s.GetService <ILoggerFactory>().CreateLogger <ExternalConfigurationStartupValidator>();

                                return(new ExternalConfigurationStartupValidatorService(validator, originalConfig, environment, logger));
                            }
                        }
                    }

                    return(NullHostedService.Instance);
                });

                // Wire this up early so that any early worker logs are guaranteed to be flushed if any other
                // IHostedService has a slow startup.
                services.AddSingleton <IHostedService, WorkerConsoleLogService>();
            });

            builder.ConfigureWebJobs((context, webJobsBuilder) =>
            {
                // Built in binding registrations
                webJobsBuilder.AddExecutionContextBinding(o =>
                {
                    o.AppDirectory = applicationHostOptions.ScriptPath;
                })
                .AddHttp()
                .AddTimersWithStorage()
                .AddManualTrigger()
                .AddWarmup();

                var bundleManager = context.Properties.GetAndRemove <IExtensionBundleManager>(BundleManagerKey);
                webJobsBuilder.Services.AddSingleton <IExtensionBundleManager>(_ => bundleManager);

                if (!skipHostInitialization)
                {
                    var webJobsBuilderContext = new WebJobsBuilderContext
                    {
                        Configuration       = context.Configuration,
                        EnvironmentName     = context.HostingEnvironment.EnvironmentName,
                        ApplicationRootPath = applicationHostOptions.ScriptPath
                    };

                    // Only set our external startup if we're not suppressing host initialization
                    // as we don't want to load user assemblies otherwise.
                    var locator = context.Properties.GetAndRemove <ScriptStartupTypeLocator>(StartupTypeLocatorKey);
                    webJobsBuilder.UseExternalStartup(locator, webJobsBuilderContext, loggerFactory);
                }

                configureWebJobs?.Invoke(webJobsBuilder);
            }, o => o.AllowPartialHostStartup = true,
                                     (context, webJobsConfigBuilder) =>
            {
                if (!skipHostInitialization)
                {
                    var webJobsBuilderContext = new WebJobsBuilderContext
                    {
                        Configuration       = context.Configuration,
                        EnvironmentName     = context.HostingEnvironment.EnvironmentName,
                        ApplicationRootPath = applicationHostOptions.ScriptPath
                    };

                    // Delay this call so we can call the customer's setup last.
                    context.Properties[DelayedConfigurationActionKey] = new Action <IWebJobsStartupTypeLocator>(locator => webJobsConfigBuilder.UseExternalConfigurationStartup(locator, webJobsBuilderContext, loggerFactory));
                }
            });

            // Script host services - these services are scoped to a host instance, and when a new host
            // is created, these services are recreated
            builder.ConfigureServices(services =>
            {
                // Core WebJobs/Script Host services
                services.AddSingleton <ScriptHost>();

                // HTTP Worker
                services.AddSingleton <IHttpWorkerProcessFactory, HttpWorkerProcessFactory>();
                services.AddSingleton <IHttpWorkerChannelFactory, HttpWorkerChannelFactory>();
                services.AddSingleton <IHttpWorkerService, DefaultHttpWorkerService>();
                // Rpc Worker
                services.AddSingleton <IJobHostRpcWorkerChannelManager, JobHostRpcWorkerChannelManager>();
                services.AddSingleton <IRpcFunctionInvocationDispatcherLoadBalancer, RpcFunctionInvocationDispatcherLoadBalancer>();

                //Worker Function Invocation dispatcher
                services.AddSingleton <IFunctionInvocationDispatcherFactory, FunctionInvocationDispatcherFactory>();
                services.AddSingleton <IScriptJobHost>(p => p.GetRequiredService <ScriptHost>());
                services.AddSingleton <IJobHost>(p => p.GetRequiredService <ScriptHost>());
                services.AddSingleton <IHostedService, WorkerConcurrencyManager>();

                services.AddSingleton <ITypeLocator, ScriptTypeLocator>();
                services.AddSingleton <ScriptSettingsManager>();
                services.AddTransient <IExtensionsManager, ExtensionsManager>();
                services.TryAddSingleton <IHttpRoutesManager, DefaultHttpRouteManager>();
                services.TryAddSingleton <IMetricsLogger, MetricsLogger>();
                services.AddTransient <IExtensionBundleContentProvider, ExtensionBundleContentProvider>();

                // Script binding providers
                services.TryAddEnumerable(ServiceDescriptor.Singleton <IScriptBindingProvider, WebJobsCoreScriptBindingProvider>());
                services.TryAddEnumerable(ServiceDescriptor.Singleton <IScriptBindingProvider, CoreExtensionsScriptBindingProvider>());
                services.TryAddEnumerable(ServiceDescriptor.Singleton <IScriptBindingProvider, GeneralScriptBindingProvider>());

                // Configuration
                services.AddSingleton <IOptions <ScriptApplicationHostOptions> >(new OptionsWrapper <ScriptApplicationHostOptions>(applicationHostOptions));
                services.AddSingleton <IOptionsMonitor <ScriptApplicationHostOptions> >(new ScriptApplicationHostOptionsMonitor(applicationHostOptions));
                services.ConfigureOptions <ScriptJobHostOptionsSetup>();
                services.ConfigureOptions <JobHostFunctionTimeoutOptionsSetup>();
                // LanguageWorkerOptionsSetup should be registered in WebHostServiceCollection as well to enable starting worker processing in placeholder mode.
                services.ConfigureOptions <LanguageWorkerOptionsSetup>();
                services.AddOptions <WorkerConcurrencyOptions>();
                services.ConfigureOptions <HttpWorkerOptionsSetup>();
                services.ConfigureOptions <ManagedDependencyOptionsSetup>();
                services.AddOptions <FunctionResultAggregatorOptions>()
                .Configure <IConfiguration>((o, c) =>
                {
                    c.GetSection(ConfigurationSectionNames.JobHost)
                    .GetSection(ConfigurationSectionNames.Aggregator)
                    .Bind(o);
                });
                services.AddOptions <ScaleOptions>()
                .Configure <IConfiguration>((o, c) =>
                {
                    c.GetSection(ConfigurationSectionNames.JobHost)
                    .GetSection(ConfigurationSectionNames.Scale)
                    .Bind(o);
                });
                services.AddSingleton <IFunctionsHostingConfiguration, FunctionsHostingConfiguration>();

                services.AddSingleton <IFileLoggingStatusManager, FileLoggingStatusManager>();

                if (!applicationHostOptions.HasParentScope)
                {
                    AddCommonServices(services);
                }

                if (SystemEnvironment.Instance.IsKubernetesManagedHosting())
                {
                    services.AddSingleton <IDistributedLockManager, KubernetesDistributedLockManager>();
                }

                services.TryAddEnumerable(ServiceDescriptor.Singleton <IHostedService, FunctionInvocationDispatcherShutdownManager>());

                if (SystemEnvironment.Instance.IsRuntimeScaleMonitoringEnabled())
                {
                    services.TryAddEnumerable(ServiceDescriptor.Singleton <IHostedService, FunctionsScaleMonitorService>());
                }
                services.TryAddSingleton <FunctionsScaleManager>();

                services.AddSingleton <IHostOptionsProvider, HostOptionsProvider>();
            });

            RegisterFileProvisioningService(builder);
            return(builder);
        }
Beispiel #11
0
 void IWebJobsStartup2.Configure(WebJobsBuilderContext context, IWebJobsBuilder builder)
 {
     Configure(builder);
 }
 public FunctionsHostBuilderContext(WebJobsBuilderContext webJobsBuilderContext)
 {
     _webJobsBuilderContext = webJobsBuilderContext ?? throw new ArgumentNullException(nameof(webJobsBuilderContext));
 }
Beispiel #13
0
 public DefaultFunctionsHostBuilderContext(WebJobsBuilderContext webJobsBuilderContext)
     : base(webJobsBuilderContext)
 {
 }
Beispiel #14
0
 public FunctionsHostBuilder(IServiceCollection services, WebJobsBuilderContext webJobsBuilderContext)
 {
     Services = services ?? throw new ArgumentNullException(nameof(services));
     Context  = new DefaultFunctionsHostBuilderContext(webJobsBuilderContext);
 }