// This method gets called by the runtime. Use this method to add services to the container. public override void ConfigureServices(IServiceCollection services) { base.ConfigureServices(services); var configurationFile = Configuration["ConfigurationPath"]; var configJson = File.ReadAllText(configurationFile); var configuration = JsonSerializer.Deserialize <DeploymentServiceConfiguration>(configJson, DeploymentUtilities.ConfigurationSerializationOptions); var consoleLog = new ConsoleLog(useShortLayout: false, printSeverity: true); var arguments = new LoggerFactoryArguments(new Logger(consoleLog), new EnvironmentVariableHost(), configuration.LoggingSettings) { TelemetryFieldsProvider = new HostTelemetryFieldsProvider(HostParameters.FromEnvironment()) }; var deploymentService = new DeploymentService( configuration: configuration, deploymentRoot: new AbsolutePath(Configuration["DeploymentRoot"]), secretsProviderFactory: keyVaultUri => new KeyVaultSecretsProvider(keyVaultUri), clock: SystemClock.Instance, uploadConcurrency: Environment.ProcessorCount); services.AddSingleton(deploymentService); services.AddSingleton <ILogger>(sp => { var lifetime = sp.GetRequiredService <IHostApplicationLifetime>(); var replacementLogger = LoggerFactory.CreateReplacementLogger(arguments); lifetime.ApplicationStopped.Register(() => { replacementLogger.DisposableToken?.Dispose(); }); return(replacementLogger.Logger); }); }
internal void Launcher ( [Required, Description("Path to LauncherSettings file")] string settingsPath, [DefaultValue(false)] bool debug, [DefaultValue(false)] bool shutdown = false ) { Initialize(); if (debug) { System.Diagnostics.Debugger.Launch(); } try { Validate(); var configJson = File.ReadAllText(settingsPath); var settings = JsonSerializer.Deserialize <LauncherApplicationSettings>(configJson, DeploymentUtilities.ConfigurationSerializationOptions); var launcher = new DeploymentLauncher(settings, _fileSystem); runAsync().GetAwaiter().GetResult(); async Task runAsync() { if (shutdown) { var context = new OperationContext(new Context(_logger), _cancellationToken); await launcher.LifetimeManager.ShutdownServiceAsync(context, settings.LauncherServiceId); return; } var host = new EnvironmentVariableHost(new Context(_logger)); settings.DeploymentParameters.AuthorizationSecret ??= await host.GetPlainSecretAsync(settings.DeploymentParameters.AuthorizationSecretName, _cancellationToken); var telemetryFieldsProvider = new HostTelemetryFieldsProvider(settings.DeploymentParameters) { ServiceName = "DeploymentLauncher" }; var arguments = new LoggerFactoryArguments(_logger, host, settings.LoggingSettings, telemetryFieldsProvider); var replacementLogger = LoggerFactory.CreateReplacementLogger(arguments); using (replacementLogger.DisposableToken) { var token = _cancellationToken; var context = new OperationContext(new Context(replacementLogger.Logger), token); await launcher.LifetimeManager.RunInterruptableServiceAsync(context, settings.LauncherServiceId, async token => { try { await launcher.StartupAsync(context).ThrowIfFailureAsync(); using var tokenAwaitable = token.ToAwaitable(); await tokenAwaitable.CompletionTask; } finally { await launcher.ShutdownAsync(context).ThrowIfFailureAsync(); } return(true); }); } } } catch (Exception e) { Console.WriteLine(e); throw; } }