Example #1
0
        // 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);
            });
        }
Example #2
0
        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;
            }
        }